using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gehGassiApp.Domain.Common;
using gehGassiApp.Domain.Subscriptions;
using Platform = gehGassiApp.Domain.Common.Platform;
namespace gehGassiApp.Core.Interfaces
{
///
/// Schnittstellenbeschreibung für einen Service der die Abonnements verwalten kann
///
public interface ISubscriptionService
{
///
/// Gibt eine Liste von verfügbaren Abos zurück
///
/// AppMode - Hundebesitzer oder Walker
/// Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task>> GetSubscriptionsAsync(AppMode appMode, string language, string accessToken, CancellationToken token);
///
/// Gibt eine Liste von gebuchten Abos zurück
///
/// Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task>> GetMySubscriptionsAsync(string language, string accessToken, CancellationToken token);
///
/// Gibt eine Liste von gebuchten aktiven Abos zurück
///
/// Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task>> GetMyActiveSubscriptionsAsync(string language, string accessToken, CancellationToken token);
///
/// Erstellen einer Abo-Buchung
///
/// AppUserId
/// Id des Abos
/// Sprache
/// InAppBillingPurchase serialisiert als JSON
/// Optional: Ablaufdatum das gesetzt werden soll
/// Plattform auf welcher das Abo erstellt wird
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> CreateSubscriptionAsync(string appUserId, string subscriptionId, string language, string inAppBillingPurchase, DateTime? expirationDateToSet, Platform platform, string accessToken, CancellationToken token);
///
/// Wechseln eines Abos in der Gruppe für eine Abo-Buchung
///
/// Id der Abo-Buchung
/// AppUserId
/// Id des Abos auf das gechselt werden soll
/// Sprache
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> SwitchSubscriptionAsync(long bookingId, string appUserId, string subscriptionId, string language, string accessToken, CancellationToken token);
///
/// Stornieren einer Abo-Buchung
///
/// Abo-Buchungs ID
/// AppUserId
/// Sprache
/// Plattform auf der das Abo erstellt wurde
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> CancelSubscriptionAsync(long bookingId, string appUserId, string language, Platform platform, string accessToken, CancellationToken token);
///
/// Verlängern einer Abo-Buchung
///
/// Abo-Buchungs ID
/// AppUserId
/// Sprache
/// Plattform auf der das Abo erstellt wurde
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> RenewSubscriptionAsync(long bookingId, string appUserId, string language, Platform platform, string accessToken, CancellationToken token);
}
}