<?php
    error_reporting(E_ALL ^ E_NOTICE);

    if (isset($_POST['module'])) {
        $indexing = 1;
        include 'functions/func.php';
        include 'functions/PasswordHash.php'; 
        include 'configs.php'; 

        $errores = 0;
        $error_text = '';
        header('Content-Type: application/json');

        switch (htmlentities($_POST['module'])) {
            case 'reminder': // Crear mail de recupero de cuenta
                // Variables 
                $mail = vCode($_POST['email']);
                $token = generar_token(32); // Token de 32 caracteres

                // Chequeos
                // Chequeo de mail
                if (!spamcheck($mail)) {
                    $errores = 1;
                    $error_text = '<p>- El mail ingresado es inválido.</p>';
                } else {
                    $mail_query = $pdo->query("SELECT correo FROM accounts WHERE correo='$mail'");
                    if ($mail_query->rowCount() == 0) {
                        $errores = 1;
                        $error_text = '<p>- El mail ingresado no se encuentra registrado</p>';
                    }
                }

                // Almaceno el token en la base de datos
                if (!$errores) {
                    $pdo->query("UPDATE accounts SET token_password='$token' WHERE correo='$mail'");
                }

                // Preparación para envío de mail
                if (!$errores) {
                    // Headers
                    $headers = "MIME-Version: 1.0" . "\r\n";
                    $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
                    $headers .= "From: $nombre_pagina <$mail_loc>";
                    $to = $mail;

                    // Cabecera del mensaje
                    $subject = "Recuperación de cuenta";
                    
                    // URL con el token
                    $url_msg = $url_pg.'nueva_con.php?tk='.urlencode($token);

                    // Contenido del mensaje
                    ob_start();
                    $m_access = 1;
                    include 'mail_template/recuperar.php';
                    $html = ob_get_clean();
                    ob_flush();

                    // Envía el mail
                    if (!mail($to, $subject, $html, $headers)) {
                        $errores = 1;
                        $error_text = '<p>Lo sentimos!!</p><p>Por un error interno no se pudo enviar el correo. Intente realizar la operación más tarde</p>';
                    }
                }

                // Respuesta
                if ($errores) {
                    echo json_encode(array(
                        "text" => $error_text,
                        "status" => "error"
                    ));
                } else {
                    echo json_encode(array(
                        "text" => "<p class='mb-2 h4'>Se ha enviado un correo con los pasos a seguir</p><p>El mensaje puede tardar hasta un minuto en llegar. Si no lo encuentra, revise la carpeta de spam</p>",
                        "status" => "success",
                        "time_show" => "9000"
                    ));
                }
                break;

            case 'newpass': // Guarda nueva contraseña
                // Variables
                $password = vCode($_POST['password']);
                $token_p = vCode($_POST['token']);

                // Chequeo contraseña
                if ($password=='' || strlen($password)<6) {
                    $errores = 1;
                    $error_text .= '<p>- La contraseña debe contener como mínimo 6 caracteres</p>';
                }

                // Chequeo de existencia de token
                $token_query = $pdo->query("SELECT id, correo, token_password FROM accounts WHERE token_password='$token_p'");
                if ($token_query->rowCount() == 0) {
                    $errores = 1;
                    $error_text .= '<p>- Token inválido. Asegúrese de haber copiado el enlace del correo correctamente</p>';
                }

                // Si no hay errores procedo con el cambio de contraseña
                if ($errores==0) {
                    // Encriptar y actualizar la contraseña
                    $pass_encrypt = base64_encode(pack("H*", sha1(utf8_encode($password))));
                    $pdo->query("UPDATE accounts SET password='$pass_encrypt', token_password=NULL WHERE token_password='$token_p'");
                    
                    echo json_encode(array(
                        "text" => "<p class='mb-2 h4'>Contraseña actualizada correctamente</p>",
                        "status" => "success"
                    ));
                } else {
                    echo json_encode(array(
                        "text" => $error_text,
                        "status" => "error"
                    ));
                }
                break;

            case 'signup': // Crear cuenta
                // Variables
                $mail = vCode($_POST['email']);
                $username = vCode($_POST['username']);
                $password = vCode($_POST['password']);
                $terms = vCode($_POST['terms']);

                // Chequeos
                // Chequeo de mail
                if (!spamcheck($mail)) {
                    $errores = 1;
                    $error_text .= '<p>- El mail ingresado es inválido.</p>';
                } else {
                    $mail_query = $pdo->query("SELECT correo FROM accounts WHERE correo='$mail'");
                    if ($mail_query->rowCount() > 0) {
                        $errores = 1;
                        $error_text .= '<p>- El mail ingresado ya se encuentra registrado</p>';
                    }
                }

                // Chequeo de usuario ingresado
                if ($username=='' || strlen($username)<3) {
                    $errores = 1;
                    $error_text .= '<p>- El usuario debe contener como mínimo 3 caracteres</p>';
                } else {
                    $user_query = $pdo->query("SELECT login FROM accounts WHERE login='$username'");
                    if ($user_query->rowCount() > 0) {
                        $errores = 1;
                        $error_text .= '<p>- El usuario ingresado ya se encuentra registrado</p>';
                    }
                }

                // Chequeo contraseña
                if ($password=='' || strlen($password)<6) {
                    $errores = 1;
                    $error_text .= '<p>- La contraseña debe contener como mínimo 6 caracteres</p>';
                }

                // Chequeo términos
                if ($terms=='' || $terms == 'off') {
                    $errores = 1;
                    $error_text .= '<p>- Debe aceptar las reglas para continuar</p>';
                }

                // Si no hay errores procedo con la creación de la cuenta
                if ($errores==0) {
                    $token = generar_token(32); // Token de 32 caracteres

                    // Encriptar contraseña
                    $pass_encrypt = base64_encode(pack("H*", sha1(utf8_encode($password))));

                    // Guarda la cuenta en BD
                    $pdo->query("INSERT INTO accounts (`login`,`password`,`access_level`,`correo`,`token`,`id_tipo`) VALUES ('$username','$pass_encrypt','0','$mail','$token','2')");

                    // Preparación para envío de mail
                    $headers = "MIME-Version: 1.0" . "\r\n";
                    $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
                    $headers .= "From: $nombre_pagina <$mail_loc>";
                    $to = $mail;

                    // Cabecera del mensaje
                    $subject = "Cuenta creada";

                    // URL con el token
                    $url_msg = $url_pg.'verify_acc.php?tk='.urlencode($token);

                    // Contenido del mensaje
                    ob_start();
                    $m_access = 1;
                    include 'mail_template/account_new2.php';
                    $html = ob_get_clean();
                    ob_flush();

                    // Envía el mail
                    if (!mail($to, $subject, $html, $headers)) {
                        $errores = 1;
                        $error_text = '<p>Lo sentimos!!</p><p>Por un error interno no se pudo enviar el correo. Intente realizar la operación más tarde</p>';
                    }

                    // Respuesta
                    if ($errores) {
                        echo json_encode(array(
                            "text" => $error_text,
                            "status" => "error"
                        ));
                    } else {
                        echo json_encode(array(
                            "text" => "<p class='mb-2 h4'>Cuenta creada correctamente</p><p>¡Muchas gracias por registrarte! En breve te estará llegando un correo con los datos de tu cuenta!</p>",
                            "status" => "success"
                        ));
                    }
                } else {
                    echo json_encode(array(
                        "text" => $error_text,
                        "status" => "error"
                    ));
                }
                break;
        }
    }
?>