using gehGassi.Domain.Pushnotifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using gehGassi.Domain.Common;
using System.Text.Json;
namespace gehGassi.Core.Interfaces
{
///
/// Schnittstellenbeschreibung für einen Service der Push-Notifications senden kann
///
public interface IPushNotificationService
{
///
/// Registrieren eines Gerätes für Pushnotifications
///
/// Informationen für die Installation / Registrierung
/// True wenn erfolgreich, false sonst
Task CreateOrUpdateInstallationAsync(DeviceInstallation deviceInstallation);
///
/// Löschen der Registrierung eines Gerätes für Pushnotifications
///
/// Id der Installation
///
Task DeleteInstallationByIdAsync(string installationId);
///
/// Senden einer Pushnotification Nachricht
///
/// Nachricht die gesendet werden soll
/// true wenn gesendet, false sonst
Task SendNotificationAsync(NotificationMessage notificationMessage);
///
/// Senden einer Pushnotification Nachricht
///
/// Nachricht die gesendet werden soll
/// Liste zusätzlicher Tags für die Adressierung der Ziele
/// true wenn gesendet, false sonst
Task SendNotificationAsync(NotificationMessage notificationMessage, List tags);
///
/// Auflisten der registrierten Geräte
///
/// Task
Task ListRegistrationsAsync();
///
/// Sendet eine Pushnotification an einen App-User wenn eine neue Nachricht für ihn eingetroffen ist
///
/// ID des App-Users
/// Id des Konversation
/// true wenn erfolgreich, false sonst
Task SendNewMessageAsync(string receiverId, string conversationId);
///
/// Sendet eine Pushnotification an einen App-User wenn eine neue Text-Nachricht von gehgassi für ihn eingetroffen ist
///
/// ID des App-Users
/// Id der Nachricht
/// true wenn erfolgreich, false sonst
Task SendNewTextMessageAsync(string receiverId, string messageId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein neuer Walk für ihn eingetroffen ist
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendNewWalkAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn sich eine öffentliche Anfrage geändert hat
///
/// ID des App-Users
/// Id des öffentlichen Anfrage
/// true wenn erfolgreich, false sonst
Task SendPublicWalkRequestChangedAsync(string receiverId, string publicWalkRequestId);
///
/// Sendet eine Pushnotification an einen App-User wenn sich eine öffentliche Anfrage in der Nähe verfügbar ist
///
/// ID des App-Users
/// Id des öffentlichen Anfrage
/// true wenn erfolgreich, false sonst
Task SendPublicWalkRequestAvailableAsync(string receiverId, string publicWalkRequestId);
///
/// Sendet eine Pushnotification an einen App-User wenn eine Antwort auf eine öffentliche Anfrage erstellt wurde
///
/// ID des App-Users
/// Id des öffentlichen Anfrage
/// true wenn erfolgreich, false sonst
Task SendPublicWalkResponseAddedAsync(string receiverId, string publicWalkRequestId);
///
/// Sendet eine Pushnotification an einen App-User wenn eine Antwort auf eine öffentliche Anfrage sich geändert hat
///
/// ID des App-Users
/// Id des öffentlichen Anfrage
/// true wenn erfolgreich, false sonst
Task SendPublicWalkResponseChangedAsync(string receiverId, string publicWalkRequestId);
///
/// Sendet eine Pushnotification an einen App-User wenn eine Antwort auf eine öffentliche Anfrage stonriert wurde
///
/// ID des App-Users
/// Id des öffentlichen Anfrage
/// true wenn erfolgreich, false sonst
Task SendPublicWalkResponseCancelledAsync(string receiverId, string publicWalkRequestId);
///
/// Sendet eine Pushnotification an einen App-User wenn eine Antwort auf eine öffentliche Anfrage abgelehnt wurde
///
/// ID des App-Users
/// Id des öffentlichen Anfrage
/// true wenn erfolgreich, false sonst
Task SendPublicWalkResponseDeclinedAsync(string receiverId, string publicWalkRequestId);
///
/// Sendet eine Pushnotification an einen App-User wenn eine öffentliche anfrage storniert wurde
///
/// ID des App-Users
/// Id des öffentlichen Anfrage
/// true wenn erfolgreich, false sonst
Task SendPublicWalkRequestCancelledAsync(string receiverId, string publicWalkRequestId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk storniert wurde
///
/// ID des App-Users
/// Id des Walks
/// App-Mode
/// true wenn erfolgreich, false sonst
Task SendWalkCancelledAsync(string receiverId, string walkId, AppMode appMode);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk gestartet wurde
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendWalkStartedAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk abgeschlossen wurde
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendWalkCompletedAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk abgeschlossen wurde als Erinnerung
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendWalkCompletedReminderAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk angenommen wurde
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendWalkAcceptedAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk abgelehnt wurde
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendWalkDeclinedAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk angefragt wurde
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendWalkRequestedAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk bestätigt wurde
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendWalkConfirmedAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk reklamiert wurde
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendWalkComplainedAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Walk reklamiert wurde
///
/// ID des App-Users
/// Id des Walks
/// App-Mode
/// true wenn erfolgreich, false sonst
Task SendWalkComplainedUpdateAsync(string receiverId, string walkId, AppMode appMode);
///
/// Sendet eine Pushnotification an einen Hundebesitzer wenn die Bezahlung für einen ein Walk gescheitert ist.
/// Wird verwendet wenn das Payment nicht funktioniert hat und der Hundebesitzer den Walk neu buchen muss.
///
/// ID des App-Users
/// Id des Walks
/// true wenn erfolgreich, false sonst
Task SendWalkPaymentFailedAsync(string receiverId, string walkId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein KYC-Status (Dokument) geändert wurde
///
/// ID des App-Users
/// Id des KYC-Dokuments
/// true wenn erfolgreich, false sonst
Task SendIdentityDocumentUpdateAsync(string receiverId, string documentId);
///
/// Sendet eine Pushnotification an einen App-User wenn ein Auszahlungsstatus geändert wurde
///
/// ID des App-Users
/// Id der Auszahlung
/// true wenn erfolgreich, false sonst
Task SendPayoutUpdateAsync(string receiverId, string payoutId);
///
/// Sendet eine Pushnotification an einen App-User dass ein Logout durchgeführt werden soll
///
/// ID des App-Users
/// true wenn erfolgreich, false sonst
Task SendLogoutAsync(string receiverId);
}
///
/// Hilfsklasse zum abspeichern der referenz-Info für Server PushNotifications
///
public class ServerPushNotificationInfo
{
///
/// Title der Nachricht
///
[JsonPropertyName("title")]
public string Title { get; set; }
///
/// Inhalt der Nachricht
///
[JsonPropertyName("body")]
public string Body { get; set; }
///
/// Daten der Nachricht
///
[JsonPropertyName("data")]
public string Data { get; set; }
///
/// Typ des Appusers damit man bei jenen die beides sind auch unterscheiden kann
///
[JsonPropertyName("appMode")]
[JsonConverter(typeof(AppModeConverter))]
public AppMode? AppMode { get; set; }
///
/// Id des verknüpften Objektes
///
[JsonPropertyName("key")]
public string Key { get; set; }
///
/// Typ des Objektes das verbunden wurde
///
[JsonPropertyName("table")]
public string Table { get; set; }
///
/// Typ der Systemnachricht
///
[JsonPropertyName("type")]
[JsonConverter(typeof(SystemMessageTypeConverter))]
public SystemMessageType? Type { get; set; }
///
/// Id der Nachricht für Cancel
///
[JsonPropertyName("notificationId")]
public int NotificationId { get; set; }
}
public class SystemMessageTypeConverter : JsonConverter
{
public override SystemMessageType? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
try
{
var value = reader.GetInt32();
return (SystemMessageType)value;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
try
{
var stringVal = reader.GetString();
if (string.IsNullOrEmpty(stringVal))
{
return null;
}
var intVal = int.Parse(stringVal);
return (SystemMessageType)intVal;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
return null;
}
public override void Write(Utf8JsonWriter writer, SystemMessageType? value, JsonSerializerOptions options)
{
if (value == null)
{
writer.WriteNullValue();
return;
}
var intVal = (int)value;
writer.WriteNumberValue(intVal);
}
}
public class AppModeConverter : JsonConverter
{
public override AppMode? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
try
{
var value = reader.GetInt32();
return (AppMode)value;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
try
{
var stringVal = reader.GetString();
if (string.IsNullOrEmpty(stringVal))
{
return null;
}
var intVal = int.Parse(stringVal);
return (AppMode)intVal;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
return null;
}
public override void Write(Utf8JsonWriter writer, AppMode? value, JsonSerializerOptions options)
{
if (value == null)
{
writer.WriteNullValue();
return;
}
var intVal = (int)value;
writer.WriteNumberValue(intVal);
}
}
}