using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gehGassi.Dto.Common;
using gehGassiApp.Core.Interfaces.Synchronization;
using gehGassiApp.Domain.Common;
using gehGassiApp.Domain.Payment;
using gehGassiApp.Domain.Users;
using gehGassiApp.Domain.Walks;
namespace gehGassiApp.Core.Interfaces
{
///
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Zahlungen übernimmt
///
public interface IPaymentService: ISyncPushPullService
{
///
/// Gibt eine Liste von Wallets eines App-Users zurück
///
/// Id des App-Users
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task>> GetWalletsAsync(string appUserId, string accessToken, CancellationToken token);
///
/// Gibt den Saldo eines Wallets zurück
///
/// Id des App-Users
/// Typ des Wallets
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> GetWalletBalanceAsync(string appUserId, WalletType walletType, string accessToken, CancellationToken token);
///
/// Gibt die Bankverbindung eines App-Users zurück
///
/// Id des App-Users
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> GetBankAccountAsync(string appUserId, string accessToken, CancellationToken token);
///
/// Anlegen oder Bearbeiten eines Bankkontos
///
/// Bankkonto
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult mit einem AppUser der die entsprechende BankId gesetzt hat
Task> CreateOrUpdateBankAccountAsync(BankAccount bankAccount, string accessToken, CancellationToken token);
///
/// Authorisierung der Bezahlung eines Walks mit dem Guthaben eines Wallets
/// Das Geld wird vom Guthabenkonto auf das Transaktions-Konto gelegt
///
/// Id des App-Users
/// Id des Walks
/// Zu zahlender Bertrag
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> AuthorizeWalkWithCreditAsync(string appUserId, string walkId, decimal ammount, string accessToken, CancellationToken token);
///
/// Authorisierung der Bezahlung eines Walks komplett mit einem Gutschein
///
/// Id des Gutscheins
/// Code des Gutscheins
/// Id des App-Users
/// Id des Walks
/// Zu zahlender Bertrag
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> AuthorizeWalkWithVoucherAsync(string voucherId, string voucherCode, string appUserId, string walkId, decimal ammount, string accessToken, CancellationToken token);
///
/// Einzahlen einer Summe auf das Transaktions-Konto eines App-Users mit Bezug auf einen Walk.
/// Es können gebühren sofort auf das Transaktions-Konto des Mandanten abgeführt werden
///
/// Id des App-Users
/// Id des Walks
/// Zu zahlender Bertrag
/// Anfallende Gebühren
/// Betrag der zusätzlich vom Guthabenkonto bezahlt werden muss
/// Typ der Einzahlung
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult mit dem ReturnUrl, wenn erfolgreich
Task> PayInAsync(string appUserId, string walkId, decimal ammount, decimal fees, decimal fromCredit, PayInType payInType, string accessToken, CancellationToken token);
///
/// Holen der letzten KYC-Dokumente eines App-Users
///
/// Id des App-Users
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult mit dem aktuell gültigen KYC-Dokument oder null, wenn keines vorhanden
Task> GetLatestKycDocumentAsync(string appUserId, string accessToken, CancellationToken token);
///
/// KYC-Dokument für einen App-User erstellen mit einer Seite
///
/// Id des App-Users
/// Dokument-Quelle
/// Dateiname
/// Datei als byte-Array
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult mit dem aktuell erstellten KYC-Dokument
Task> CreateKycDocumentAsync(string appUserId, IdentityDocumentSource source, string fileOneName, byte[] fileOne, string accessToken, CancellationToken token);
///
/// KYC-Dokument für einen App-User erstellen mit zwei Seiten
///
/// Id des App-Users
/// Dokument-Quelle
/// Dateiname Datei 1
/// Datei 1 als byte-Array
/// Dateiname Datei 2
/// Datei 2 als byte-Array
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult mit dem aktuell erstellten KYC-Dokument
Task> CreateKycDocumentAsync(string appUserId, IdentityDocumentSource source, string fileOneName, byte[] fileOne, string fileTwoName, byte[] fileTwo, string accessToken, CancellationToken token);
///
/// Gibt Walks vom Server zurück
///
/// Id App-Users
/// Liste von Sortierangaben
/// Wie viele Walks sollen abgerufen werden? -1 Wenn nicht anwenden.
/// Wie viele Walks sollen ausgelassen werden? -1 Wenn nicht anwenden.
/// Aktuelles Accesstoken
/// CancellationToken
/// Nächster Walk oder null, wenn keiner vorhanden
Task>> GetPayoutsAsync(string appUserId, List sortOrders, int take, int skip, string accessToken, CancellationToken token);
///
/// Erstellen einer Auszahlung
///
/// Id des App-Users
/// Betrag der ausgezahlt werden soll
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> CreatePayoutAsync(string appUserId, decimal ammount, string accessToken, CancellationToken token);
///
/// Gibt eine Auszahlung eines App-Users zurück
///
/// Id des App-Users
/// Id der Auszahlung
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> GetPayoutAsync(string appUserId, string payoutId, string accessToken, CancellationToken token);
}
}