/**
 * \file PageAdmin.xaml.cs
 * \brief Fonctionnalités administrateur
 * Code regroupant les fonctionnalités administrateur de l'application (gestion des jeux)
 */

using Microsoft.Maui.Controls;
using GameAtlas.Models;
using System.Diagnostics;

namespace GameAtlas.Views;

public partial class PageAdmin : ContentPage
{
    public Manager AdminManager => (App.Current as App).MyManager;
    public PageAdmin()
    {
        InitializeComponent();
    }

    /**
     * \brief Flèche de retour en arrière
     * \return void
     */
    async void Back_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
    {
        await Navigation.PopAsync();
    }

    /**
     * \brief Bouton d'ajout de jeu
     *        Affiche une succession de pop-up, pour remplir les champs un par un.
     *        Traitement et vérification des champs.
     * \return void
     */
    private async void OnButtonClicked(object sender, EventArgs e)
    {
        string nom = string.Empty;
        string sortie = string.Empty;
        string plateformes = string.Empty;
        string developpeur = string.Empty;
        string editeur = string.Empty;
        string note = string.Empty;
        string nbTelechargement = string.Empty;
        string genre = string.Empty;
        string image = string.Empty;
        string resume = string.Empty;

        int etape = 1;
        bool annuler = false;

        while (etape <= 9 && !annuler)
        {
            switch (etape)
            {
                case 1:
                    nom = await DisplayPromptAsync("Informations sur le Jeu [1/10]", "Quel est le Titre ?", accept: "Suivant", cancel: "Annuler", placeholder: "GTA VI");
                    if (string.IsNullOrEmpty(nom))
                    {
                        annuler = true;
                    }
                    break;
                case 2:
                    resume = await DisplayPromptAsync("Informations sur le Jeu [2/10]", "Résumé du jeu", accept: "Terminer", cancel: "Annuler", placeholder: "Résumé du jeu");
                    if (string.IsNullOrEmpty(resume))
                    {
                        annuler = true;
                    }
                    break;
                case 3:
                    sortie = await DisplayPromptAsync("Informations sur le Jeu [3/10]", "Date de Sortie", accept: "Suivant", cancel: "Annuler", placeholder: "JJ/MM/AAAA");
                    if (string.IsNullOrEmpty(sortie))
                    {
                        annuler = true;
                    }
                    break;
                case 4:
                    plateformes = await DisplayPromptAsync("Informations sur le Jeu [4/10]", "Plateforme(s), un espace pour séparer", accept: "Suivant", cancel: "Annuler", placeholder: "Ex: XOne PC PS5");
                    if (string.IsNullOrEmpty(plateformes))
                    {
                        annuler = true;
                    }
                    break;
                case 5:
                    developpeur = await DisplayPromptAsync("Informations sur le Jeu [5/10]", "Développeur", accept: "Suivant", cancel: "Annuler", placeholder: "Rockstar Games");
                    if (string.IsNullOrEmpty(developpeur))
                    {
                        annuler = true;
                    }
                    break;
                case 6:
                    editeur = await DisplayPromptAsync("Informations sur le Jeu [6/10]", "Editeur", accept: "Suivant", cancel: "Annuler", placeholder: "Take-Two Interactive");
                    if (string.IsNullOrEmpty(editeur))
                    {
                        annuler = true;
                    }
                    break;
                case 7:
                    note = await DisplayPromptAsync("Informations sur le Jeu [7/10]", "Note de 0 à 10", accept: "Suivant", cancel: "Annuler", maxLength: 3, placeholder: "4,5");
                    if (string.IsNullOrEmpty(note))
                    {
                        annuler = true;
                    }
                    break;
                case 8:
                    nbTelechargement = await DisplayPromptAsync("Informations sur le Jeu [8/10]", "Nombre de Téléchargements (en milliers, ex: 630k)", accept: "Suivant", cancel: "Annuler", placeholder: "630");
                    if (string.IsNullOrEmpty(nbTelechargement))
                    {
                        annuler = true;
                    }
                    break;
                case 9:
                    genre = await DisplayPromptAsync("Informations sur le Jeu [9/10]", "Genre(s), un espace pour séparer", accept: "Suivant", cancel: "Annuler", placeholder: "Action Aventure");
                    if (string.IsNullOrEmpty(genre))
                    {
                        annuler = true;
                    }
                    break;
                case 10:
                    image = await DisplayPromptAsync("Informations sur le Jeu [10/10]", "Image de couverture (préférez URL finissant par .png)", accept: "Terminer", cancel: "Annuler", placeholder: "http://example.com/monimage.png");
                    if (string.IsNullOrEmpty(image))
                    {
                        annuler = true;
                    }
                    break;
            }

            etape++;
        }

        if (!annuler)
        {
            Jeu adminJeu = new Jeu(nom, resume, sortie, plateformes, developpeur, editeur, Convert.ToDouble(note), Convert.ToInt32(nbTelechargement), genre, image);
            AdminManager.AddJeux(adminJeu);
            AdminManager.SauvegardeDonnees();
            AdminManager.OnPropertyChanged(nameof(AdminManager.ListJeux));
            AdminManager.OnPropertyChanged(nameof(AdminManager.TopRatedGames));
            AdminManager.OnPropertyChanged(nameof(AdminManager.ListJeuxAffiches));

            Debug.WriteLine($"Le jeu \"{adminJeu.Nom}\" a été ajouté.");
        }
        else
        {
            Debug.WriteLine("Annulation de l'ajout du jeu.");
        }
    }
}