<?php

namespace Controllers;

use Bases\Controller;
use Models\Categorie;
use Models\Plat;
use Models\Tag;
use Models\Utilisateur;

class UtilisateurController extends Controller
{

    /**
     * Affiche la page d'accueil (connexion)
     */
    public function connexion()
    {
        // Inclure la vue index.view.php
        include("views/gestion/connexion.view.php");
    }

    public function index()
    {
        if (empty($_SESSION["utilisateur_id"])) {
            $this->rediriger("compte-connexion");
        }

        $modele_categorie = new Categorie;
        $categories = $modele_categorie->toutesCategories();

        $modele_tags = new Tag;
        $tags = $modele_tags->tousTags();

        $modele_utilisateur = new Utilisateur;
        $utilisateur = $modele_utilisateur->parId($_SESSION["utilisateur_id"]);
        $users = $modele_utilisateur->toutUtilisateurs();

        $modele_plat = new Plat;
        $entrees = $modele_plat->platsEntrees();
        $repas = $modele_plat->platsRepas();
        $desserts = $modele_plat->platsDessert();

        $this->vue("gestion/index", [
            "entrees" => $entrees,
            "repas" => $repas,
            "desserts" => $desserts,
            "utilisateur" => $utilisateur,
            "users" => $users,
            "categories" => $categories,
            "tags" => $tags,
        ]);
    }

    /**
     * Traite la création d'un compte
     *
     * @return void
     */
    public function store()
    {
        // Paramètres présents
        if (
            empty($_POST["nom"]) ||
            empty($_POST["courriel"]) ||
            empty($_POST["mdp"]) ||
            empty($_POST["confirmer_mdp"])
        ) {
            $this->rediriger("gestion?infos_requises");
        }

        // Mot de passe est confirmé
        if ($_POST["mdp"] != $_POST["confirmer_mdp"]) {
            $this->rediriger("gestion?mdp_incorrect");
        }

        // Encryption du mot de passe
        $mdp_encrypte = password_hash($_POST["mdp"], PASSWORD_DEFAULT);

        // Sauvegarde des informations du compte
        $modele_utilisateur = new Utilisateur;
        $succes = $modele_utilisateur->inserer(
            $_POST["nom"],
            $_POST["courriel"],
            $mdp_encrypte
        );

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

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

    /**
     * Traite la connexion de l'utilisateur
     */

    public function connecter()
    {
        if (empty($_POST["courriel"]) || empty($_POST["mdp"])) {
            $this->rediriger("compte-connexion?infos_requises");
        }

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

        // Validation de l'utilisateur et de son mot de passe
        if (!$utilisateur || !password_verify($_POST["mdp"], $utilisateur->mdp)) {
            $this->rediriger("compte-connexion?infos_invalides");
        }

        $_SESSION["utilisateur_id"] = $utilisateur->id;

        $this->rediriger("gestion?succes_connexion");
    }

    /**
     * Affiche le formulaire de modification
     */
    public function edit()
    {

        // Valider
        if (empty($_GET["id"])) {
            $this->rediriger("gestion?id_inexistant");
        }

        $this->vue("gestion/editCompte", [
            "utilisateur" => (new Utilisateur)->utilisateurParId($_GET["id"]),
        ]);
    }

    /**
     * Traite le formulaire de modification
     */
    public function update()
    {

        // Valider
        if (empty($_POST["id"])) {
            $this->rediriger("gestion?id_inexistant");
        }

        // Paramètres présents
        if (
            empty($_POST["nom"]) ||
            empty($_POST["courriel"]) ||
            empty($_POST["mdp"]) ||
            empty($_POST["confirmer_mdp"])
        ) {
            $this->rediriger("compte-modifier?infos_requises&id=" . $_POST["id"]);
        }

        // Mot de passe est confirmé
        if ($_POST["mdp"] != $_POST["confirmer_mdp"]) {
            $this->rediriger("compte-modifier?mdp_incorrect&id=" . $_POST["id"]);
        }

        // Encryption du mot de passe
        $mdp_encrypte = password_hash($_POST["mdp"], PASSWORD_DEFAULT);

        // Sauvegarde des informations du compte
        $modele_utilisateur = new Utilisateur;
        $succes = $modele_utilisateur->modifier(
            $_POST["id"],
            $_POST["nom"],
            $_POST["courriel"],
            $mdp_encrypte
        );

        if (!$succes) {
            $this->rediriger("gestion?echec_modification_utilisateur");
        }

        $this->rediriger("gestion?succes_modification_utilisateur");
    }

    /**
     * Traite la suppression d'un utilisateur
     *
     * @return void
     */
    public function destroy()
    {

        // Protection de la route
        if (empty($_SESSION["utilisateur_id"])) {
            $this->rediriger("compte-connexion");
        }

        // Valider
        if (empty($_GET["id"])) {
            $this->rediriger("gestion?id_inexistant");
        }

        $succes = (new Utilisateur)->supprimer($_GET["id"]);

        if (!$succes) {
            $this->rediriger("gestion?echec_suppression_utilisateur");
        }

        $this->rediriger("gestion?succes_suppression_utilisateur");
    }

    /**
     * Traite la déconnexion
     */
    public function deconnecter()
    {
        session_destroy();
        $this->rediriger("compte-connexion?succes_deconnexion");
    }
}
