<?php

namespace Controllers;

use Bases\Controller;
use Models\Utilisateur;

class UtilisateurController extends Controller
{

    /**
     * Afficher la page de connexion des utilisateurs
     */
    public function index()
    {
        $this->vue("utilisateurs/index");
    }

    /**
     * Traite la connexion de l'utilisateur
     */
    public function connect()
    {
        if (empty($_POST["courriel"]) || empty($_POST["mdp"])) {
            $this->rediriger("utilisateurs?infos_requises");
        }

        $utilisateur = (new Utilisateur)->parCourriel($_POST["courriel"]);

        if (!$utilisateur || !password_verify($_POST["mdp"], $utilisateur->mot_de_passe)) {
            $this->rediriger("utilisateurs?infos_invalides");
        }

        $_SESSION["role"] = $utilisateur->role;

        /* Si l'utilisateur est un employé*/
        /* if ($utilisateur->role === "Employé") { */
        /* $_GET connecter pour faire afficher la page des menus pour employés/admin */
        $this->rediriger("employes-menu?connecter", [
            "utilisateur" => $utilisateur
        ]);
        /* } */

        /* Si c'est un administrateur, on le renvoit vers la page qui montre tous les employés */
        /*     $utilisateurs = (new Utilisateur)->toutUtilisateurs();
        $this->rediriger("admin", [
            "utilisateurs" => $utilisateurs
        ]); */
    }

    /**
     * Affiche le formulaire pour ajouter un employé
     */
    public function create()
    {
        // Protection de la route
        if (empty($_SESSION["role"])) {
            $this->rediriger("menus");
        }

        // Si un employé normal essaie de modifier un autre employé
        if ($_SESSION["role"] !== "Administrateur") {
            $this->rediriger("employes-menu?admin_only");
        }

        $this->vue("utilisateurs/create");
    }

    /**
     * Traite l'ajout d'un nouvel employé
     */
    public function store()
    {
        // Protection de la route
        if (empty($_SESSION["role"])) {
            $this->rediriger("menus");
        }

        // Si un employé normal essaie d'ajouter un employé
        if ($_SESSION["role"] !== "Administrateur") {
            $this->rediriger("employes-menu?admin_only");
        }

        // Validations des champs obligatoires
        if (
            empty($_POST["nom"]) ||
            empty($_POST["courriel"]) ||
            empty($_POST["mot_de_passe"]) ||
            empty($_POST["confirmer_mot_de_passe"])
        ) {
            $this->rediriger("admin-utilisateur-creer?infos_requises");
        }

        // Vérifier si le compte existe déjà
        $modele_utilisateur = new Utilisateur;
        if ($modele_utilisateur->parCourriel($_POST["courriel"])) {
            $this->rediriger("admin-utilisateur-creer?compte_existant");
        }

        // Vérifier si les deux mots de passe sont identiques
        if ($_POST["mot_de_passe"] !== $_POST["confirmer_mot_de_passe"]) {
            $this->rediriger("admin-utilisateur-creer?mot_de_passe_incorrect");
        }

        $succes = $modele_utilisateur->inserer(
            $_POST["nom"],
            $_POST["courriel"],
            password_hash($_POST["mot_de_passe"], PASSWORD_DEFAULT)
        );

        if (!$succes) {
            $this->rediriger("admin-utilisateur-creer?echec_creation_compte");
        }

        $this->rediriger("admin?succes_creation_compte");
    }

    /**
     * Affiche le formulaire de modification d'un employé
     */
    public function edit()
    {
        // Protection de la route
        if (empty($_SESSION["role"])) {
            $this->rediriger("menus");
        }

        // Si un employé normal essaie de modifier un autre employé
        if ($_SESSION["role"] !== "Administrateur") {
            $this->rediriger("employes-menu?admin_only");
        }

        $utilisateur = (new Utilisateur)->utilisateurParId($_GET["id"]);

        $this->vue("utilisateurs/edit", [
            "utilisateur" => $utilisateur
        ]);
    }

    /**
     * Traite la modification d'un employé
     */
    public function update()
    {
        // Protection de la route
        if (empty($_SESSION["role"])) {
            $this->rediriger("menus");
        }

        // Si un employé normal essaie de modifier un autre employé
        if ($_SESSION["role"] !== "Administrateur") {
            $this->rediriger("employes-menu?admin_only");
        }

        // Validation des champs $_POST obligatoire
        if (
            empty($_POST["id"]) ||
            empty($_POST["nom"]) ||
            empty($_POST["courriel"])
        ) {
            $this->rediriger("admin-utilisateur-modifier?infos_requises");
        }

        // Vérifie si le courriel est déjà associé à un employé 
        // ET 
        // que le courriel en POST n'est pas le même déjà inscrit dans la bdd

        $utilisateur_existe = (new Utilisateur)->parCourriel($_POST["courriel"]);
        $utilisateur = (new Utilisateur)->utilisateurParId($_POST["id"]);

        if (
            $utilisateur_existe &&
            $utilisateur->courriel !== $_POST["courriel"]
        ) {
            $this->rediriger("admin-utilisateur-modifier?compte_existant&id=" . $_POST["id"]);
        }

        $succes = (new Utilisateur)->modifier(
            $_POST["id"],
            $_POST["nom"],
            $_POST["courriel"]
        );

        if (!$succes) {
            $this->rediriger("admin-utilisateur-modifier?echec_modification_employe&id=" . $_POST["id"]);
        }

        $this->rediriger("admin?succes_modification_employe");
    }


    public function delete()
    {
        // Protection de la route
        if (empty($_SESSION["role"])) {
            $this->rediriger("menus");
        }

        // Si un employé normal essaie de modifier un autre employé
        if ($_SESSION["role"] !== "Administrateur") {
            $this->rediriger("employes-menu?admin_only");
        }

        // Peut-être changé pour $_POST["id"]
        $succes = (new Utilisateur)->supprimer($_GET["id"]);

        if (!$succes) {
            $this->rediriger("admin?erreur_suppression");
        }

        $this->rediriger("admin?succes_suppression");
    }

    public function disconnect()
    {
        session_destroy();

        $this->rediriger("menus?succes_deconnexion");
    }
}
