using CommunityToolkit.Mvvm.Messaging;
using salesbook.Shared.Core.Dto;
using salesbook.Shared.Core.Entity;
using salesbook.Shared.Core.Helpers;
using salesbook.Shared.Core.Interface.IntegryApi;
using salesbook.Shared.Core.Messages.Notification.NewPush;
using Shiny.Push;
using System.Text.Json;

namespace salesbook.Maui.Core.System.Notification.Push;

public class PushNotificationDelegate(
    IIntegryRegisterNotificationRestClient integryRegisterNotificationRestClient,
    IMessenger messenger
) : IPushDelegate
{
    public Task OnEntry(PushNotification notification)
    {
        // fires when the user taps on a push notification
        return Task.CompletedTask;
    }

    public Task OnReceived(PushNotification notification)
    {
        if (notification.Notification is null) return Task.CompletedTask;
        var data = notification.Data;

        NotificationDataDTO? notificationDataDto = null;
        
        if (!data.IsNullOrEmpty())
        {
            var json = JsonSerializer.Serialize(data);
            notificationDataDto = JsonSerializer.Deserialize<NotificationDataDTO>(json);
        }

        if (notificationDataDto?.NotificationId == null) return Task.CompletedTask;
        var notificationId = long.Parse(notificationDataDto.NotificationId);

        var pushNotification = new WtbNotification
        {
            Id = notificationId,
            Title = notification.Notification.Title,
            Body = notification.Notification.Message,
            NotificationData = notificationDataDto
        };

        messenger.Send(new NewPushNotificationMessage(pushNotification));

        return Task.CompletedTask;
    }

    public Task OnNewToken(string token)
    {
        integryRegisterNotificationRestClient.Register(token);
        return Task.CompletedTask;
    }

    public Task OnUnRegistered(string token)
    {
        // fires when a push notification change is set by the operating system or provider
        return Task.CompletedTask;
    }
}