/**
 * \file PageConnexion.xaml.cs
 * \brief Système de connexion
 * Système de connexion avec vérification et chargement de l'utilisateur connecté
 */

namespace GameAtlas.Views;

using GameAtlas.Models;
using System.Diagnostics;
using System.Text.RegularExpressions;

public partial class PageConnexion : ContentPage
{
    private bool connexionWorked;

    public Manager ConnexionManager => (App.Current as App).MyManager;
    public PageConnexion()
    {
        InitializeComponent();
    }

    /**
     * \brief Bouton "Connexion"
     *        Réaction au clic sur le bouton, vérification des champs non vide.
     * \return void
     */
    private async void OnSignInClicked(object sender, EventArgs e)
    {

        string username = pseudo.Text;
        string password = mdp.Text;


        if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
        {
            await DisplayAlert("Erreur", "Entrez tous les champs", "Ok");
            return;
        }

        connexionWorked = Verification(username, password);
        if (connexionWorked)
        {
            //await Navigation.PushAsync(new PageAcceuil());
            await Navigation.PopAsync();
            //await Shell.Current.GoToAsync("//page/PageAccueil");
        }
    }

    /**
     * \brief Texte "S'inscrire"
     *        Réaction au clic sur le texte, envoie sur le page d'Inscription.
     * \return void
     */
    private async void OnInscrire_Tapped(object sender, EventArgs e)
    {
        await Navigation.PushAsync(new PageInscription());
    }

    /**
     * \brief Texte "Mot de Passe oublié"
     *        Réaction au clic sur le texte, affichage de pop-ups.
     * \return void
     */
    private async void OnMotDePasseOublie_Tapped(object sender, EventArgs e)
    {
        await DisplayAlert("Oh non !", "Le mot de passe va te revenir à force", "Concentration");
        await DisplayAlert("Oh non !", "Encore un petit effort !", "Concentration");

        bool reponse = await DisplayAlert("Alors ?", "Tu l'as retrouvé ce mot de passe ?", "Oui", "Non");
        if (!reponse)
        {
            await DisplayAlert("...", "Désolé on peut rien pour toi. La prochaine fois utilise un papier comme tout le monde.", "RIP");
        }
        else
        {
            await DisplayAlert("...", "C'est bien, la prochaine fois tu le notera.", "Ok");
        }
    }

    /**
     * \brief Vérification et Chargement
     *        Vérification de la présence de l'utilisateur dans la Liste d'Utilisateurs.
     *        Si c'est le cas, comparaison du mot de passe fournis par celui de l'utilisateur.
     *        Si tout est bon, chargement de l'utilisateur dans ConnectedUser.
     *        Dans le cas contraire, on renvoie un message d'erreur et termine la vérification.
     * \return bool true si la connexion a fonctionnée, false sinon.
     */
    public bool Verification(string username, string password)
    {
        foreach (Utilisateur user in ConnexionManager.Utilisateurs.Concat(ConnexionManager.Admins))
        {
            if (user.Pseudo == username)
            {
                Debug.WriteLine($"Pseudo \"{user.Pseudo}\" vérifié et valide");
                if (user.Mdp == password)
                {
                    Debug.WriteLine("Mot de Passe verifié et valide");
                    ConnexionManager.ConnectedUser = user;
                    return true;
                }
            }
        }
        Debug.WriteLine("La connexion a échoué (pseudo ou mot de passe invalide)");
        DisplayAlert("Erreur", "Utilisateur ou Mot de Passe invalide.", "Ok");
        ConnexionManager.ConnectedUser = null;
        return false;
    }

}