<?php

// Validacion de token

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { // Recorre todos los caracteres (siempre) y retorna true or false
        $_SESSION['flash_error'] = 'Acción inválida.';
        header('Location: index.php?opt=inicio_operador');
        exit;
    }
}

// Requiere modelo de usuario

require_once __DIR__ . '/../models/usuarioModel.php';
$usuariomodel = new usuarioModel();

// Validar sesión

if (!isset($_SESSION['user'])) {
    header("Location: index.php?opt=login_operador");
    exit;
}

$user = $_SESSION['user']; // Defino el array del usuario dentro de una variable
$rol = $user['rol']; // Defino el rol dentro de la variable
$esAdmin = ($rol === 'admin'); // Variable booleana, true = admin

$opt = $_GET['opt'] ?? null;

// Manejo de opciones enviadas por URL

switch ($opt) {

    // USUARIO REQUIERE SUS DATOS, O ADMIN BUSCA EDITAR UNO

    case 'datos_usuario':

        $idEditar = null;

        $idEditar = (int) ($_GET['id'] ?? $user['id']);

        if ($idEditar <= 0) {
            header("Location: index.php?opt=usuarios");
            exit;
        }

        // Buscamos el usuario en la base mediante el ID

        $usuario = $usuariomodel->obtenerPorId($idEditar);

        if (!$usuario) {
            $_SESSION['flash_error'] = "No se encontró el usuario.";
            header("Location: index.php?opt=usuarios"); // Si no se encontró al usuario se redirige a la lista de usuarios
            exit;
        } 

        if ($_SERVER['REQUEST_METHOD'] === 'GET') {

            if ($esAdmin) {
                $return = 'inicio_admin';
            } else {
                $return = 'inicio_operador';
            }

            $_SESSION['return_opt'] = $_GET['from'] ?? "$return";
            $return = $_SESSION['return_opt'];

            ob_start();
            require __DIR__ . '/../views/usuarios/datosUsuarioView.php';
            return ob_get_clean();
        }

        // En caso de modificar datos de un usuario

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {

            // Si no es admin no puede editar usuarios

            if (!$esAdmin) {
                header("Location: index.php?opt=home_operador");
                exit;
            }

            $nombre = trim($_POST['nombre'] ?? '');
            $apellido = trim($_POST['apellido'] ?? '');
            $email = trim($_POST['email'] ?? '');
            $telefono = trim($_POST['telefono'] ?? '');
            $password = trim($_POST['password'] ?? '');
            $usuarioInput = $usuario['usuario'] ?? '';
            $rol = trim($_POST['rol']) ?? 'operador';

            $errores = [];

            // Validaciones

            if ($nombre === '') {
                $errores[] = "El nombre no puede estar vacío.";
            } elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $nombre)) {
                $errores[] = "El nombre debe comenzar con mayúscula y solo contener letras y espacios.";
            } elseif (strlen($nombre) < 2) {
                $errores[] = "El nombre debe tener al menos 2 caracteres.";
            } elseif (strlen($nombre) > 50) {
                $errores[] = "El nombre no puede superar los 50 caracteres.";
            }

            if ($apellido === '') {
                $errores[] = "El apellido no puede estar vacío.";
            } elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $apellido)) {
                $errores[] = "El apellido debe comenzar con mayúscula y solo contener letras y espacios.";
            } elseif (strlen($apellido) < 2) {
                $errores[] = "El apellido debe tener al menos 2 caracteres.";
            } elseif (strlen($apellido) > 50) {
                $errores[] = "El apellido no puede superar los 50 caracteres.";
            }

            if ($email === '') {
                $errores[] = "El email no puede estar vacío.";
            } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $errores[] = "Formato de email inválido.";
            } elseif (strlen($email) > 100) {
                $errores[] = "El email no puede superar los 100 caracteres.";
            }

            if ($telefono === '') {
                $errores[] = "El teléfono no puede estar vacío.";
            } else if (!preg_match('/^[0-9]{10}$/', $telefono)) {
                $errores[] = "El teléfono debe tener 10 dígitos.";
            }

            // Password (si se ingresa)

            if (!empty($password)) {
                if ($password === '') {
                    $errores[] = "La contraseña no puede estar vacía.";
                } elseif (strpos($password, ' ') !== false) {
                    $errores[] = "La contraseña no puede contener espacios.";
                } elseif (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,}$/', $password)) {
                    $errores[] = "La contraseña debe tener al menos una mayúscula, una minúscula y un número, y mínimo 6 caracteres.";
                }
            }
                
            if (!in_array($rol, ['admin', 'operador'], true)) {
                $errores[] = "El rol es incorrecto.";
            }

            // Un admin no puede modificar su rol

            if (($idEditar === $user['id']) && ($rol === 'operador')) {
                $_SESSION['flash_error'] = 'No puede modificar su propio rol';
                header("Location: index.php?opt=datos_usuario&id=$idEditar&from=usuarios");
                exit;
            }

            if (!empty($errores)) {
                $_SESSION['flash_error'] = implode('<br>', $errores); // Se guarda en $_SESSION el error
                header("Location: index.php?opt=datos_usuario&id=$idEditar&from=usuarios");
                exit;
            }

            // Verificación de existencia de usuario

            if ($usuariomodel->verificarExistencia([
                'nombre' => $nombre,
                'apellido' => $apellido,
                'email' => $email,
                'usuario' => $usuarioInput
            ], $idEditar)) {
                $_SESSION['flash_error'] = "El usuario ya existe o el mail ya está registrado.";

                header("Location: index.php?opt=datos_usuario&id=$idEditar&from=usuarios");
                exit;
            }

            $guardarData = [
                'nombre' => $nombre,
                'apellido' => $apellido,
                'email' => $email,
                'telefono' => $telefono,
                'usuario' => $usuarioInput,
                'rol' => $rol
            ];

            if (!empty($password)) {
                $guardarData['password'] = password_hash($password, PASSWORD_DEFAULT); // Hasheo de contraseña
            }

            // Actualiza los datos del usuario

            if ($usuariomodel->actualizarUsuario($idEditar, $guardarData)) {
                $_SESSION['flash_success'] = 'Datos actualizados correctamente.'; // Se guarda en $_SESSION el success
            } else {
                $_SESSION['flash_error'] = 'No se pudo actualizar los datos.';
            }

            if ($idEditar === $user['id']) {
                $_SESSION['user'] = $usuariomodel->obtenerPorId($idEditar);
            }

            header("Location: index.php?opt=usuarios");
            exit;
        }

    // LISTAR USUARIOS

    case 'usuarios':

        if (!$esAdmin) {
            header("Location: index.php?opt=home_operador");
            exit;
        }

        // Utilizamos el modelo para obtener la lista completa de usuarios

        $usuarios = $usuariomodel->listarUsuarios();

        ob_start();
        require __DIR__ . '/../views/usuarios/listaUsuariosView.php';
        return ob_get_clean();

    // CREACIÓN DE NUEVO USUARIO

    case 'crear_usuario':

        if (!$esAdmin) {
            header("Location: index.php?opt=home_operador");
            exit;
        }

        // Se requiere la view del form

        if ($_SERVER['REQUEST_METHOD'] === 'GET') {
            ob_start();
            require __DIR__ . '/../views/usuarios/crearUsuarioView.php';
            return ob_get_clean();
        }

        // Datos recibidos del POST del formulario

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            
            $nombre = trim($_POST['nombre'] ?? '');
            $apellido = trim($_POST['apellido'] ?? '');
            $email = trim($_POST['email'] ?? '');
            $telefono = trim($_POST['telefono'] ?? '');
            $usuarioInput = trim($_POST['usuario'] ?? '');
            $password = trim($_POST['password'] ?? '');
            $rol = trim($_POST['rol']) ?? 'operador';

            $errores = [];

            // Validaciones

            if ($nombre === '') {
                $errores[] = "El nombre no puede estar vacío.";
            } elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $nombre)) {
                $errores[] = "El nombre debe comenzar con mayúscula y solo contener letras y espacios.";
            } elseif (strlen($nombre) < 2) {
                $errores[] = "El nombre debe tener al menos 2 caracteres.";
            } elseif (strlen($nombre) > 50) {
                $errores[] = "El nombre no puede superar los 50 caracteres.";
            }

            if ($apellido === '') {
                $errores[] = "El apellido no puede estar vacío.";
            } elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $apellido)) {
                $errores[] = "El apellido debe comenzar con mayúscula y solo contener letras y espacios.";
            } elseif (strlen($apellido) < 2) {
                $errores[] = "El apellido debe tener al menos 2 caracteres.";
            } elseif (strlen($apellido) > 50) {
                $errores[] = "El apellido no puede superar los 50 caracteres.";
            }

            if ($email === '') {
                $errores[] = "El email no puede estar vacío.";
            } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $errores[] = "Formato de email inválido.";
            } elseif (strlen($email) > 100) {
                $errores[] = "El email no puede superar los 100 caracteres.";
            }

            if ($telefono === '') {
                $errores[] = "El teléfono no puede estar vacío.";
            } else if (!preg_match('/^[0-9]{10}$/', $telefono)) {
                $errores[] = "El teléfono debe tener 10 dígitos.";
            }

            if ($usuarioInput === '') {
                $errores[] = "El usuario no puede estar vacío.";
            } elseif (!preg_match('/^[a-zA-Z0-9._]+$/', $usuarioInput)) {
                $errores[] = "El usuario solo puede contener letras, números, puntos y guiones bajos.";
            } elseif (strlen($usuarioInput) < 5) {
                $errores[] = "El usuario debe tener al menos 5 caracteres.";
            } elseif (strlen($usuarioInput) > 30) {
                $errores[] = "El usuario no puede superar los 30 caracteres.";
            }

            if ($password === '') {
                $errores[] = "La contraseña no puede estar vacía.";
            } elseif (strpos($password, ' ') !== false) {
                $errores[] = "La contraseña no puede contener espacios.";
            } elseif (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,}$/', $password)) {
                $errores[] = "La contraseña debe tener al menos una mayúscula, una minúscula y un número, y mínimo 6 caracteres.";
            }

            if (!in_array($rol, ['admin', 'operador'], true)) {
                $rol = 'operador';
            }

            if (!empty($errores)) {
                $_SESSION['flash_error'] = implode('<br>', $errores);
                header("Location: index.php?opt=crear_usuario");
                exit;
            }

            // Verificación de existencia de usuario

            if ($usuariomodel->verificarExistencia([
                'nombre' => $nombre,
                'apellido' => $apellido,
                'email' => $email,
                'usuario' => $usuarioInput
            ])) {
                $_SESSION['flash_error'] = "El usuario ya existe o el mail ya está registrado.";

                header("Location: index.php?opt=crear_usuario");
                exit;
            }

            // Se llama a la función para crear el usuario

             if ($usuariomodel->crearUsuario([
                'nombre' => $nombre,
                'apellido' => $apellido,
                'email' => $email,
                'telefono' => $telefono,
                'usuario' => $usuarioInput,
                'password' => password_hash($password, PASSWORD_DEFAULT),
                'rol' => $rol
            ])) {
                $_SESSION['flash_success'] = 'Usuario creado correctamente';
            } else {
                $_SESSION['flash_error'] = 'Ocurrió un error al crear el usuario.';
            }

            header("Location: index.php?opt=usuarios");
            exit;
        }

    // ELIMINAR USUARIO (BAJA LÓGICA)

    case 'eliminar_usuario':

        $idEliminar = $_POST['id'] ?? 0;

        if ($idEliminar <= 0) {
            header("Location: index.php?opt=usuarios");
            exit;
        }

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {

            if ($idEliminar == $user['id']) {
                $_SESSION['flash_error'] = "No puede eliminar su usuario.";
                header("Location:index.php?opt=usuarios");
                exit;
            }

            if ($usuariomodel->eliminarUsuario($idEliminar)) {
                $_SESSION['flash_success'] = "Usuario eliminado correctamente.";
            } else {
                $_SESSION['flash_error'] = "Ocurrió un error al eliminar el usuario.";
            }

            header("Location:index.php?opt=usuarios");
            exit;
        }

    // DEFAULT (404)

    default:
        ob_start();
        require __DIR__ . '/../views/404View.php';
        return ob_get_clean();
}