using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gehGassi.Dto;
using gehGassi.Dto.Common;
using gehGassi.Dto.DogWalkers;
using gehGassiApp.Core.Interfaces.Synchronization;
using gehGassiApp.Domain.Common;
using gehGassiApp.Domain.Users;
namespace gehGassiApp.Core.Interfaces
{
///
/// Schnittstellenbeschreibung für einen Service der die Verwaltung des Benutzers ermöglicht
///
public interface IUserService : IService, ISyncPushPullService
{
///
/// Gibt den aktuellen Benutzer zurück
///
/// Aktueller Benutzer oder null, wenn noch keiner vorhanden
Task GetAsync();
///
/// Hinzufügen oder aktualisieren des Benutzers
///
/// Benutzer der hinzugefügt oder aktualisiert werden soll
/// User
Task CreateOrUpdateAsync(User user);
///
/// Prüft für einen übergebenen Benutzernamen ob es sich um den gespeicherten Benutzer handelt
///
/// Benutzername (E-Mail Adresse)
/// UserCheckResult
Task CheckAsync(string userName);
///
/// Gibt den aktuellen App-User zurück.
///
/// AppUser oder null wenn nicht gefunden
Task GetAppUserAsync();
///
/// Gibt den aktuellen App-User zurück.
///
/// Tracking
/// AppUser oder null wenn nicht gefunden
Task GetAppUserAsync(bool noTracking);
///
/// Gibt den aktuellen App-User zurück.
/// Versucht auch online - wenn lokal nicht vorhanden
///
/// Aktuelles Accesstoken
/// CancellationToken
/// Wenn true, wird in jedem Fall die Online-Abfrage verwendet
/// AppUser oder null wenn nicht gefunden
Task GetAppUserAsync(string accessToken, CancellationToken token, bool forceOnline);
///
/// Hinzufügen oder aktualisieren eines App-Users
///
/// App-User
/// AppUser
Task CreateOrUpdateAppUserAsync(AppUser appUser);
///
/// Aktualisieren eines App-Users.
/// Online wird versucht. Wenn nicht möglich wird ein Delta erstellt.
///
/// App-User
/// Aktuelles Accesstoken
/// CancellationToken
/// App-User
Task UpdateAppUserAsync(AppUser appUser, string accessToken, CancellationToken token);
///
/// Setzen des App-User Types für einen AppUser.
/// Immer online und nur wenn erfolgreich auch ein Update lokal!
///
/// Id des AppUsers
/// Typ der gesetzt werden soll
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> SetAppUserTypeAsync(string appUserId, AppUserType appUserType, string accessToken, CancellationToken token);
///
/// Setzen des App-User Types für einen AppUser.
/// Immer online und nur wenn erfolgreich auch ein Update lokal!
///
/// Id des AppUsers
/// Typ der gesetzt werden soll
/// Nationalität
/// Land des Hauptwohnsitzes
/// AGB Paymentprovider akzeptiert
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> SetAppUserTypeAsync(string appUserId, AppUserType appUserType, string nationality, string mainResidence, bool paymentTermsAccepted, string accessToken, CancellationToken token);
///
/// Hinzufügen eines Payment-Users. Für Hundebesitzer wenn sie noch keine PaymentId haben
///
/// Id des AppUsers
/// Nationalität
/// Land des Hauptwohnsitzes
/// AGB Paymentprovider akzeptiert
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> AddPaymentUserAsync(string appUserId, string nationality, string mainResidence, bool paymentTermsAccepted, string accessToken, CancellationToken token);
///
/// Setzen der Bankverbindungs-ID für einen AppUser.
///
/// Id des App-Users
/// ID der Bankverbindung
/// Datum letzte Aktualisierung
/// App-User
Task SetBankAccountAsync(string appUserId, string bankId, DateTimeOffset updatedAt);
///
/// Blockieren eines App-Users am Server
///
/// Id des App-Users der die Blockierung vornimmt
/// Id des App-Users der blockiert wird
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> BlockAppUserAsync(string appUserId, string blockedAppUserId, string accessToken, CancellationToken token);
///
/// Aufheben der Blockierung eines App-Users am Server
///
/// Id des App-Users der die Blockierung vorgenommen hat
/// Id des App-Users dessen Blockierung aufgehoben wird
/// Aktuelles Accesstoken
/// CancellationToken
/// CommunicationResult
Task> UnblockAppUserAsync(string appUserId, string blockedAppUserId, string accessToken, CancellationToken token);
///
/// Holen von blockierten App-Usern
///
/// Abfrageobjekt
/// Aktuelle Position
/// Aktuelles Accesstoken
/// CancellationToken
/// ListCommunicationResult
Task>> GetBlockedAppUsersAsync(BlockedQueryDto query, LocationDto location, string accessToken, CancellationToken token);
///
/// Melden eines App-Users durch einen anderen bei Verfehlungen oder anstößigen Inhalten
///
/// Id des App-Users der die Meldung vornimmt
/// Id des App-Users der gemeldet wird
/// Betroffener Bereich
/// Id des Bereichs
/// Optional: zweite Id falls nötig
/// Bild beanstanded
/// Name beanstanded
/// Text beanstanded
/// Nachricht beanstanded
/// Adresse beanstanded
/// Typ der Meldung
/// Email-Adresse des meldenen Benutzers für Kontaktaufnahme
/// Anmerkungen des meldenden Benutzers
/// Chat-Nachricht wenn es eine betrifft
/// Art der bBlockierung
/// Darf für Rückfragen kontaktiert werden
/// Aktuelles Accesstoken
/// CancellationToken
/// ListCommunicationResult
Task> ReportAppUserAsync(string appUserId, string reportedAppUserId, AppUserReportSection section, string sectionId, string sectionId2, bool reportedImage, bool reportedName,
bool reportedText, bool reportedMessage, bool reportedAddress, AppUserReportType type, string email, string comment, string message, AppUserReportBlockType blockType, bool contactAllowed, string accessToken, CancellationToken token);
}
///
/// Ergebnis des Prüfens auf den Benutzer
///
public enum UserCheckResult
{
///
/// Es wurde noch kein Benutzer angelegt
///
Empty = 0,
///
/// Es handelt sich um den gespeicherten Benutzer
///
IsCurrentUser = 1,
///
/// Der gespeicherte Benutzer stimmt nicht überein
///
IsOtherUser = 2
}
}