<?php

if (isset($_POST["submitted"]) && !isset($_SESSION["user_id"])) {
    $error_message = login();
}

if (isset($_POST["forgotten_password"]) && !isset($_SESSION["user_id"])) {
    $error_message = recuperateAccount();
}

if (isset($_GET["reset_password"]) && isset($_GET["token"]) && !isset($_SESSION["user_id"])) {
    $reset_data = $DB->query("SELECT `id`, `email` FROM `users` WHERE `forgotten_password` = '" . htmlspecialchars($_GET["token"]) . "';")->fetch();
    if ($reset_data === FALSE) {
        header("Location: $URL_BASE/connexion");
        exit();
    }
    
    if (isset($_POST["reset_password"]))
        $error_message = resetPassword();
}

if (isset($_GET["confirmation-mail"]) && !isset($_SESSION["user_id"])) {
    $error_message = sendConfirmEmail();
}

function login() {
    global $URL_BASE;

    $email = htmlspecialchars($_POST["email"]);

    if (!filter_var($email, FILTER_VALIDATE_EMAIL))
        return "L'email entrée est invalide.";

    $password = htmlspecialchars($_POST["password"]);

    $user = User::fromEmail($email);
    if ($user === FALSE)
        return "Le compte n'existe pas.";
    
    if ($user->getConfirmEmailToken() !== NULL) {
		$_SESSION["confirm_email"] = $email;
		return "L'adresse mail n'a pas été validée. Veuillez vérifier votre boîte mail (surtout vos spams). <a href=\"$URL_BASE/connexion/confirmation-mail\">Cliquez ici pour renvoyer le mail de confirmation</a>.";
	}
    
    if (!$user->checkPassword($password))
        return "Le mot de passe est incorrect.";

    $_SESSION["user_id"] = $user->getId();
	loadUserValues();

    return false;
}

function recuperateAccount() {
    global $MAIL_ADDRESS, $URL_BASE;
    
	$email = htmlspecialchars($_POST["email"]);
	
	if (!filter_var($email, FILTER_VALIDATE_EMAIL))
		return "L'email entrée est invalide.";
	
	$user = User::fromEmail($email);
	if ($user == null)
	    return "Le compte n'existe pas.";
    
	$token = uniqid();

	$user->setForgottenPasswordToken($token);
	
	$msg = "Bonjour,\r\n\r\n"
            . "Vous avez indiqué avoir oublié votre mot de passe. Veuillez cliquer ici pour le réinitialiser : $URL_BASE/connexion/reinitialiser_mdp/$token\r\n\r\n"
            . "Si vous n'êtes pas à l'origine de cette manipulation, vous pouvez ignorer ce message.\r\n\r\n"
            . "Cordialement,\r\n\r\n"
            . "Le comité national d'organisation du TFJM².";
	mail("$email", "Mot de passe oublié - TFJM²", $msg, "From: $MAIL_ADDRESS\r\n");
	
	return false;
}

function resetPassword() {
    global $DB, $MAIL_ADDRESS, $reset_data;

    $id = $reset_data["id"];
    $email = $reset_data["email"];
    $password = htmlspecialchars($_POST["password"]);
    $confirm = htmlspecialchars($_POST["confirm_password"]);
	
	if (strlen($password) < 8)
		return "Le mot de passe doit comporter au moins 8 caractères.";
	
	if ($password != $confirm)
		return "Les deux mots de passe sont différents.";

	$hash = password_hash($password, PASSWORD_BCRYPT);

	$DB->prepare("UPDATE `users` SET `pwd_hash` = ?, `forgotten_password` = NULL WHERE `id` = ?;")->execute([$hash, $id]);
	
	$msg = "Bonjour,\r\n\r\nNous vous informons que votre mot de passe vient d'être modifié. "
        . "Si vous n'êtes pas à l'origine de cette manipulation, veuillez immédiatement vérifier vos accès à votre boîte mail et changer votre mot de passe sur la plateforme d'inscription.\r\n\r\n"
		. "Cordialement,\r\n\r\nLe comité national d'organisation du TFJM²";
	mail($email, "Mot de passe modifié TFJM²", $msg, "From: $MAIL_ADDRESS\r\n");
	
	return false;
}

function sendConfirmEmail() {
    global $URL_BASE, $MAIL_ADDRESS, $YEAR;
    
    $email = htmlspecialchars($_SESSION["confirm_email"]);
    
    if (!isset($email)) {
        header("Location: $URL_BASE/connexion");
        exit();
    }

    $user = User::fromEmail($email);
    
    if ($user === null) {
        unset($_SESSION["confirm_email"]);
		header("Location: $URL_BASE/connexion");
		exit();
    }
	
	$confirm_email_uid = $user->getConfirmEmailToken();
	
	$msg = "Bonjour,\r\n\r\nPour confirmer votre adresse mail, cliquez ici : $URL_BASE/confirmer_mail/$confirm_email_uid\r\n\r\n"
            . "Cordialement,\r\n\r\nLe comité national d'organisation du TFJM²";
	mail($email, "Confirmation d'adresse mail TFJM² $YEAR", $msg, "From: $MAIL_ADDRESS\r\n");
    
    return false;
}

require_once "server_files/views/connexion.php";