<?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 cliente

require_once __DIR__ . '/../models/clienteModel.php';
$clientemodel = new clienteModel;

// Validar sesión

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

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

// Manejo de opciones enviadas por URL

switch ($opt) {

    // LISTAR CLIENTES
    
    case 'clientes':

        // Utilizamos el modelo para obtener la lista de clientes

        $clientes = $clientemodel->listarClientes();
        ob_start();
        require __DIR__ . '/../views/clientes/listaClientesView.php';
        return ob_get_clean();

    // CREAR CLIENTE NUEVO

    case 'crear_cliente':

        // Se requiere la view del form

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

            $_SESSION['return_opt'] = $_GET['from'] ?? 'clientes';

            ob_start();
            require __DIR__ . '/../views/clientes/crearClienteView.php';
            return ob_get_clean();
        }

        // Datos recibidos del POST del formulario

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            
            $nombre = trim($_POST['nombre'] ?? '');
            $apellido = trim($_POST['apellido'] ?? '');
            $telefono = trim($_POST['telefono'] ?? '');
            $email = trim($_POST['email'] ?? '');
            $condIVA = trim($_POST['cond_iva'] ?? 'consumidor_final');

            $cuit1 = trim($_POST['cuit_1'] ?? '');
            $cuit2 = trim($_POST['cuit_2'] ?? '');
            $cuit3 = trim($_POST['cuit_3'] ?? '');

            $cuit = $cuit1 . $cuit2 . $cuit3;

            $errores = [];

            // Validaciones

            if ($nombre === '')
                $errores[] = "El nombre no puede estar vacío.";
            else if (!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.";
            } else if (strlen($nombre) < 2) {
                $errores[] = "El nombre debe tener al menos 2 caracteres.";
            } else if (strlen($nombre) > 50) {
                $errores[] = "El nombre no puede superar los 50 caracteres.";
            }

            if ($apellido === '')
                $errores[] = "El apellido no puede estar vacío.";
            else if (!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.";
            } else if (strlen($apellido) < 2) {
                $errores[] = "El apellido debe tener al menos 2 caracteres.";
            } else if (strlen($apellido) > 50) {
                $errores[] = "El apellido no puede superar los 50 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 ($email === '') {
                $errores[] = "El email no puede estar vacío.";
            } else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $errores[] = "Formato de email inválido.";
            } else if (strlen($email) > 100) {
                $errores[] = "El email no puede superar los 100 caracteres.";
            }

            $condicionesPermitidas = [
                'consumidor_final',
                'monotributo',
                'responsable_inscripto'
            ];

            if (!in_array($condIVA, $condicionesPermitidas, true)) {

                $errores[] = 'Condición de IVA inválida.';
            }

            if ($cuit !== '') {

                if (!preg_match('/^\d{11}$/', $cuit)) {

                    $errores[] = 'El CUIT debe contener 11 dígitos.';
                }
            } else {
                
                $cuit = null;
            }

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

            // Verificación de existencia de cliente

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

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

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

            if ($clientemodel->crearCliente([
                'nombre' => $nombre,
                'apellido' => $apellido,
                'telefono' => $telefono,
                'email' => $email,
                'cuit' => $cuit,
                'cond_iva' => $condIVA
            ])) {
                $_SESSION['flash_success'] = 'Cliente creado correctamente.';
            } else {
                $_SESSION['flash_error'] = 'Ocurrió un error al crear el cliente.';
            }

            $opt = $_SESSION['return_opt'];
            
            header("Location: index.php?opt=$opt");
            exit;
        }

    // EDITAR DATOS DE CLIENTE

    case 'editar_cliente':

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

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

        // Busca el cliente en la base de datos mediante el id

        $cliente = $clientemodel->obtenerPorId($idEditar);
        
        if (!$cliente) {
            $_SESSION['flash_error'] = 'No se encontró el cliente.';
            header("Location: index.php?opt=clientes");
            exit;
        }

        // Mostrar datos de cliente

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

        // En caso de modificar datos del cliente

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

            $nombre = trim($_POST['nombre'] ?? '');
            $apellido = trim($_POST['apellido'] ?? '');
            $telefono = trim($_POST['telefono'] ?? '');
            $email = trim($_POST['email'] ?? '');
            $condIVA = trim($_POST['cond_iva'] ?? 'consumidor_final');

            $cuit1 = trim($_POST['cuit_1'] ?? '');
            $cuit2 = trim($_POST['cuit_2'] ?? '');
            $cuit3 = trim($_POST['cuit_3'] ?? '');

            $cuit = $cuit1 . $cuit2 . $cuit3;

            $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 ($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 ($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.";
            }

            $condicionesPermitidas = [
                'consumidor_final',
                'monotributo',
                'responsable_inscripto'
            ];

            if (!in_array($condIVA, $condicionesPermitidas, true)) {

                $errores[] = 'Condición de IVA inválida.';
            }

            if (($condIVA !== 'consumidor_final') && ($cuit === '')) {

                $errores[] = 'Debe ingresar el CUIT';
            }

            if ($cuit !== '') {

                if (!preg_match('/^\d{11}$/', $cuit)) {

                    $errores[] = 'El CUIT debe contener 11 dígitos.';
                }
            } else {

                $cuit = null;
            }

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

            // Verificación de existencia de cliente

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

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

            $guardarData = [
                'nombre' => $nombre,
                'apellido' => $apellido,
                'telefono' => $telefono,
                'email' => $email,
                'cuit' => $cuit,
                'cond_iva' => $condIVA
            ];

            // Actualizar los datos del cliente

            if ($clientemodel->actualizarCliente($cliente['id'], $guardarData)) {
                $_SESSION['flash_success'] = 'Datos actualizados correctamente'; // Se guarda en $_SESSION el succes
            } else {
                $_SESSION['flash_error'] = 'No se pudo actualizar los datos.';
            }

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

    // DEFAULT (404)

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