using GameAtlas.Models;
using System.Diagnostics;
using CommunityToolkit.Maui.Alerts;
using CommunityToolkit.Maui.Core;
using Font = Microsoft.Maui.Font;

namespace GameAtlas.Views;

public partial class PageJeu : ContentPage
{
    public Jeu JeuModel { get; set; }

	//public Manager JeuManager { get; set; } = new Manager();
    public Manager JeuManager => (App.Current as App).MyManager;

    public PageJeu()
	{
		InitializeComponent();

        BindingContext = JeuManager;
    }

    public PageJeu(Jeu jeu)
    {

        JeuModel = jeu;

        InitializeComponent();

        BindingContext = this;


    }

    async void OnAddTapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
    {
        if (JeuManager.ConnectedUser != null)
        {
            bool isFavorite = JeuManager.ConnectedUser.ListeFavoris.Contains(JeuModel);
            bool isOwned = JeuManager.ConnectedUser.ListePossedes.Contains(JeuModel);

            string favoritePresence = "";
            string ownedPresence = "";

            if (isFavorite)
            {
                favoritePresence = " ✔️";
            }
            if (isOwned)
            {
                ownedPresence = " ✔️";
            }

            string action = await DisplayActionSheet("Choix de la liste:", "Annuler", null, "Mes Favoris"+favoritePresence, "Jeux Possédés"+ownedPresence);
            Debug.WriteLine("Popup Action: " + action);

            if (action == "Mes Favoris" + favoritePresence)
            {
                if (isFavorite)
                {
                    await DisplayAlert("Jeu Retiré", $"Vous avez retiré {JeuModel.Nom} de votre liste de jeux favoris.", "Ok");
                    JeuManager.ConnectedUser.ListeFavoris.Remove(JeuModel);
                    favoritePresence = "";
                }
                else
                {
                    JeuManager.ConnectedUser.ListeFavoris.Add(JeuModel);
                    Debug.WriteLine($"Ajout du jeu {JeuModel.Nom} à la Liste Favoris de {JeuManager.ConnectedUser.Pseudo}.");
                    await DisplayAlert("Jeu Ajouté", $"{JeuModel.Nom} a été ajoutée dans votre liste de jeux favoris.", "Ok");
                }
                JeuManager.OnPropertyChanged(nameof(JeuManager.ConnectedUser));
                JeuManager.SauvegardeDonnees();
            }
            else if (action == "Jeux Possédés" + ownedPresence)
            {
                if (isOwned)
                {
                    await DisplayAlert("Jeu Retiré", $"Vous avez retiré {JeuModel.Nom} de votre liste de jeux possédés.", "Ok");
                    JeuManager.ConnectedUser.ListePossedes.Remove(JeuModel);
                    ownedPresence = "";
                }
                else
                {
                    JeuManager.ConnectedUser.ListePossedes.Add(JeuModel);
                    Debug.WriteLine($"Ajout du jeu {JeuModel.Nom} à la Liste Possédés de {JeuManager.ConnectedUser.Pseudo}.");
                    await DisplayAlert("Jeu Ajouté", $"{JeuModel.Nom} a été ajoutée dans votre liste de jeux possédés.", "Ok");
                }
                JeuManager.OnPropertyChanged(nameof(JeuManager.ConnectedUser));
                JeuManager.SauvegardeDonnees();
            }
        }
        else
        {
            //await DisplayAlert("Erreur", "Vous devez vous connecter pour faire cela !", "Ok");
            Alert();
        }
    }

    async void OnAddCommentClicked(object sender, EventArgs args)
    {
        if (JeuManager.ConnectedUser != null)
        {
            string commentaire = await DisplayPromptAsync("⭐ Votre Avis", "Ecrivez votre commentaire:\n(250 caractères maximum)", maxLength: 250, accept: "Suivant", cancel: "Annuler");
            string note = await DisplayPromptAsync("✒️ La Note", "De 0 à 10", maxLength: 3, accept: "Envoyer", cancel: "Annuler");

            JeuModel.AjouterAvis(JeuManager.ConnectedUser.Pseudo, Convert.ToDouble(note), commentaire);
        }
        else
        {
            Alert();
        }
    }

    async void Back_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
    {
        await Navigation.PopAsync();
    }

    async void Alert()
    {
        CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

        var snackbarOptions = new SnackbarOptions
        {
            BackgroundColor = Colors.Red,
            TextColor = Colors.White,
            ActionButtonTextColor = Colors.White,
            Font = Font.SystemFontOfSize(14),
            ActionButtonFont = Font.SystemFontOfSize(16),
            CharacterSpacing = 0
        };

        string text = "Vous devez être connecté pour effectuer cette action.";
        string actionButtonText = "OK";
        TimeSpan duration = TimeSpan.FromSeconds(3);

        var snackbar = Snackbar.Make(text, null, actionButtonText, duration, snackbarOptions);

        await snackbar.Show(cancellationTokenSource.Token);
    }
}