<?php
class VisitorModel
{
    // private EnigmeGateway $enigme_gateway;
    // private PartieGateway $partie_gateway;
    // private UtilisateurGateway $utilisateur_gateway;

    function __construct()
    {
        try {
            echo 'model1';
            global $error, $view, $rep;
            // $this->enigme_gateway = new EnigmeGateway();
            // $this->partie_gateway = new PartieGateway();
            // $this->utilisateur_gateway = new UtilisateurGateway();
        } catch (Exception $e) {
            $error = $e->getMessage();
            require($rep . $view['erreur']);
        }
    }

    public function signUp()
    {
        global $rep, $vues, $sel, $error;
        try {
            $validation = new Validation();
            if (!$validation->ValidateEmail($_REQUEST['email'])) {
                $error = "Email invalides.";
                throw (new Exception("Email non valide"));
            }
            if (!$validation->ValidateUsername($_REQUEST['username'])) {
                $error = "Nom d'utilisateur invalides. Il ne doit pas contenir de caractère spéciaux.";
                throw (new Exception("Pseudo non valide"));
            }
            if (!$validation->ValidatePassword($_REQUEST['password'])) {
                $error = "Mots de passe invalides. Il ne doit pas dépasser 100 caractères.";
                throw (new Exception("Mot de passe non valide"));
            }
            $j = $this->utilisateur_gateway->getUtilisateurByEmail($_REQUEST['email']);
            if ($j->getEmail() != "null") {
                $error = "Email déjà utilisé.";
                throw (new Exception("Email déjà utilisé"));
            }
            $password = password_hash($_REQUEST['password'] . $sel, PASSWORD_DEFAULT);
            $utilisateur = new Utilisateur($_REQUEST['email'], $_REQUEST['username'], $password, false);
            $this->utilisateur_gateway->insert($utilisateur);
            $_SESSION['role'] = 'user';
            $_SESSION['utilisateur'] = $utilisateur;
            require($rep . $vues['main']);
        } catch (PDOException $e) {
            $error = "Erreur de connexion à la base de données.";
            require($rep . $vues['erreur']);
        } catch (Exception $e) {
            $error = $e->getMessage();
            require($rep . $vues['erreur']);
        }
    }
    public function login()
    {
        global $rep, $vues, $sel, $error;
        try {
            $utilisateur = $this->utilisateur_gateway->getUtilisateurByEmail($_REQUEST['email']);
            if ($utilisateur->getEmail() == "null") {
                $error = "Utilisateur non trouvé.";
                throw new Exception("Utilisateur introuvable");
            }
            $mdp = $this->utilisateur_gateway->getMdpByEmail($_REQUEST['email']);
            if (password_verify($mdp, $_REQUEST['password'] . $sel)) {
                $error = "Mot de passe incorrect.";
                throw new Exception("Mot de passe invalide");
            }
            $estAdmin = $this->utilisateur_gateway->getEstAdminByEmail($_REQUEST['email']);
            if ($estAdmin == true) {
                $_SESSION['role'] = "admin";
            } else {
                $_SESSION['role'] = "user";
            }
            $_SESSION['utilisateur'] = $utilisateur;
            $_SESSION['connected'] = 'true';
            require($rep . $vues['main']);
        } catch (Exception $e) {
            require($rep . $vues['erreur']);
        }
    }

    public function goToHome()
    {
        global $rep, $vues, $error;
        new Utilisateur("test", "test", "test", false);
        echo "Home";
        try {
            require($rep . $vues['main']);
        } catch (Exception $e) {
            $error = "404";
            require($rep . $vues['erreur']);
        }
    }

    public function goToLogin()
    {
        global $rep, $vues, $error;
        try {
            require($rep . $vues['login']);
        } catch (Exception $e) {
            $error = "404";
            require($rep . $vues['erreur']);
        }
    }

    public function goToSignUp()
    {
        global $rep, $vues, $error;
        try {
            require($rep . $vues['signUp']);
        } catch (Exception $e) {
            $error = "404";
            require($rep . $vues['erreur']);
        }
    }
}