<?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;
    }
}

// Librería domPDF

require __DIR__ . '/../libs/dompdf/autoload.inc.php';

use Dompdf\Dompdf;
use Dompdf\Options;

// Validar sesión

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

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

// Manejo de opt

switch ($opt) {

    // LISTAR PEDIDOS

    case 'listar_pedidos':

        // Requiere el modelo de pedidos

        require_once __DIR__ . '/../models/pedidoModel.php';
        $pedidomodel = new pedidoModel();

        $anioActual = date('Y');
        $anioSeleccionado = $_GET['anio'] ?? $anioActual;

        $pedidos = $pedidomodel->listarPedidos($anioSeleccionado);

        // Reordenamiento de fecha (para poder ordenar correctamente con dataTables)

        foreach ($pedidos as $i => $p) {

            if (!empty($p['fecha'])) {

                $dt = new DateTime($p['fecha']);

                // Para ordenar

                $pedidos[$i]['fecha'] = $dt->format('Y-m-d');

                // Para mostrar

                $pedidos[$i]['fecha_formateada'] = $dt->format('d/m/Y');

            } else {
                $pedidos[$i]['fecha'] = '-';
                $pedidos[$i]['fecha_formateada'] = '-';
            }
        }

        ob_start();
        require __DIR__ . '/../views/pedidos/listaPedidosView.php';
        return ob_get_clean();

    // MOSTRAR DETALLE DE PRODUCTOS DE UN PEDIDO

    case 'detalle_pedido':

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

        if ($idPedido <= 0) {
            $_SESSION['flash_error'] = 'Datos inválidos.';
            header('Location: index.php?opt=listar_pedidos');
            exit;
        }

        require_once __DIR__ . '/../models/pedidoModel.php';
        $pedidomodel = new pedidoModel();

        $pedido_detalle = $pedidomodel->getDetallePedido($idPedido);

        ob_start();
        require __DIR__ . '/../views/pedidos/pedidoDetalleView.php';
        return ob_get_clean();

    // CREAR PEDIDO

    case 'crear_pedido':

        // Se muestra vista de carga de pedidos

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

            $condIVA = $_SESSION['pedido']['cond_iva'] ?? $_SESSION['pedido']['proveedor']['cond_iva'] ?? 'consumidor_final';
            $cuit = $_SESSION['pedido']['cuit'] ?? $_SESSION['pedido']['proveedor']['cuit'] ?? '00000000000';

            // Se obtienen los productos almacenados en caja (puede estar vacía)

            require_once __DIR__ . '/../models/cajaModel.php';
            $cajamodel = new cajaModel();

            $productos = $cajamodel->listarProductosPedido();

            if (isset($_SESSION['pedido']['proveedor'])) {
                $proveedor = $_SESSION['pedido']['proveedor'];
            } else {
                $proveedor = '';
            }

            // Cálculo de total

            $total = $cajamodel->calcularPrecioTotalPedido() ?? 0;

            ob_start();
            require __DIR__ . '/../views/pedidos/crearPedidoView.php';
            return ob_get_clean();
        }

    // AGREGAR PRODUCTO AL PEDIDO

    case 'agregar_producto_pedido':

        // Guardo datos en $_SESSION para persistencia

        $_SESSION['pedido']['cond_iva'] = $_POST['cond_iva'] ?? '';
        $_SESSION['pedido']['cuit'] = ($_POST['cuit_1'] ?? '') . ($_POST['cuit_2'] ?? '') . ($_POST['cuit_3'] ?? '');

        // Requiero el modelo de producto

        require_once __DIR__ . '/../models/productoModel.php';
        $productomodel = new productoModel();

        $productos = $productomodel->listarProductosPedido();

        foreach ($productos as $i => $p) {

            if (!isset($p['id'])) {
                unset($productos[$i]);
                continue;
            }

            if ($p['stock'] === null || $p['stock'] === 0) {
                $productos[$i]['stock'] = '-';
            }
        }

        ob_start();
        require __DIR__ . '/../views/pedidos/agregarProductoPedidoView.php';
        return ob_get_clean();

    // SELECCIONAR PROVEEDOR

    case 'seleccionar_proveedor':

        // Requiero el modelo de proveedor

        require_once __DIR__ . '/../models/proveedorModel.php';
        $proveedormodel = new proveedorModel();

        // Se muestra la vista de selección de cliente

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

            $proveedores = $proveedormodel->listarProveedores();

            ob_start();
            require __DIR__ . '/../views/pedidos/seleccionarProveedorView.php';
            return ob_get_clean();
        }

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

            $idProveedor = (int) ($_POST['id_proveedor'] ?? 0);

            if ($idProveedor <= 0) {
                $_SESSION['flash_error'] = "No se seleccionó ningún proveedor.";
                header("Location: index.php?opt=seleccionar_proveedor");
                exit;
            }

            $proveedor = $proveedormodel->obtenerPorId($idProveedor);

            if (!$proveedor) {
                $_SESSION['flash_error'] = "Proveedor inválido.";
                header("Location: index.php?opt=seleccionar_proveedor");
                exit;
            }

            // Guardo proveedor en $_SESSION

            $_SESSION['pedido']['proveedor'] = [
                'id' => $proveedor['id'],
                'razon_social' => $proveedor['razon_social'],
                'telefono' => $proveedor['telefono'],
                'email' => $proveedor['email'],
                'cuit' => $proveedor['cuit'],
                'cond_iva' => $proveedor['cond_iva']
            ];

            $_SESSION['pedido']['cond_iva'] = $proveedor['cond_iva'];
            $_SESSION['pedido']['cuit'] = $proveedor['cuit'];

            $_SESSION['flash_success'] = "Proveedor agregado correctamente.";
            header("Location: index.php?opt=crear_pedido");
            exit;
        }

    // ELIMINAR PROVEEDOR

    case 'eliminar_proveedor':

        unset($_SESSION['pedido']['cond_iva']);
        unset($_SESSION['pedido']['cuit']);

        if (isset($_SESSION['pedido']['proveedor'])) {
            unset($_SESSION['pedido']['proveedor']);

            $_SESSION['flash_success'] = "Proveedor eliminado correctamente.";
        } else {
            $_SESSION['flash_error'] = "No había proveedor seleccionado.";
        }
        
        header("Location: index.php?opt=crear_pedido");
        exit;

    // GENERACION DE REMITO PDF MEDIANTE USO DE LIBRERIA DOMPDF

    case 'generar_remito_pdf':

        // CARGAMOS LA VISTA

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

            $numeroRemito = $_SESSION['ultimo_pedido_id'];

            ob_start();
            require __DIR__ . '/../views/pedidos/descargarRemito.php';
            return ob_get_clean();
        }

        // GENERACIÓN DEL PDF

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

            // Requiero datos de empresa y configuración

            require __DIR__ . '/../models/configuracionModel.php';
            $configuracionmodel = new configuracionModel();

            $datosEmpresa = $configuracionmodel->obtenerConfiguracion();

            $mapCondIVA = [
                'consumidor_final' => 'Consumidor Final',
                'responsable_inscripto' => 'Responsable Inscripto',
                'monotributo' => 'Monotributo',
            ];

            $datosEmpresa['cond_iva'] = $mapCondIVA[$datosEmpresa['cond_iva']];

            // Obtenemos en la variable los datos guardados en $_SESSION durante la confirmación del pedido

            $datosRemito = $_SESSION['remito_pdf'] ?? null;

            if (!$datosRemito) {
                $_SESSION['flash_error'] = 'No hay datos disponibles para generar el remito.';
                header('Location: index.php?opt=crear_pedido');
                exit;
            }

            // Preparamos las variables con los datos

            $productos = $datosRemito['productos'];
            $proveedor = $datosRemito['proveedor'];
            $vendedor = $datosRemito['vendedor'];
            $total = $datosRemito['total'];
            $condIVA = $datosRemito['cond_iva'];
            $cuit = $datosRemito['cuit'];

            // VALIDACIONES BASE

            if (!$proveedor || empty($productos)) {
                $_SESSION['flash_error'] = 'Datos incompletos para generar el remito.';
                header('Location: index.php?opt=crear_pedido');
                exit;
            }

            if (!$vendedor) {
                $_SESSION['flash_error'] = 'No se pudo identificar el usuario.';
                header('Location: index.php?opt=crear_pedido');
                exit;
            }

            // VALIDACIÓN CONDICIÓN IVA

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

            if (!in_array($condIVA, $condIvaPermitidas, true)) {
                $_SESSION['flash_error'] = 'Condición de IVA inválida.';
                header('Location: index.php?opt=crear_pedido');
                exit;
            }

            // VALIDACIÓN CUIT

            $cuit = trim($cuit);

            if (!preg_match('/^\d{10,11}$/', $cuit)) {
                $_SESSION['flash_error'] = 'CUIT inválido.';
                header('Location: index.php?opt=crear_pedido');
                exit;
            }

            if ($total <= 0) {
                $_SESSION['flash_error'] = 'Total inválido.';
                header('Location: index.php?opt=crear_pedido');
                exit;
            }

            // MAPEOS PARA PDF

            $mapCondIVA = [
                'consumidor_final' => 'Consumidor Final',
                'responsable_inscripto' => 'Responsable Inscripto',
                'monotributo' => 'Monotributo',
            ];

            $condIVALabel = $mapCondIVA[$condIVA];

            // Obtenemos código ID del pedido generado

            $numero = $_SESSION['ultimo_pedido_id'] ?? null;

            if (!$numero) {
                $_SESSION['flash_error'] = 'No se encontró el número de remito.';
                header('Location: index.php?opt=crear_pedido');
                exit;
            }

            // Guardamos en la vatiable para mostrar el código en la vista

            $numeroRemito = '0001-' . str_pad($numero, 8, '0', STR_PAD_LEFT);

            // RENDER PDF

            ob_start();
            require __DIR__ . '/../pdf/pedidos/remitoPDF.php';
            $html = ob_get_clean();

            $cssPath = '/var/www/html/css/stylesRemitoPDF.css';
            $css = file_get_contents($cssPath);

            // Configuración de opciones

            $options = new Options();
            $options->set('isRemoteEnabled', true); // Permite cargar recursos externos (CSS, imágenes, etc.)
            $options->set('chroot', '/var/www/html'); // Define directorios base para recursos locales
            $options->set('defaultFont', 'DejaVu Sans');

            // Creación de instancia Dompdf con las opciones seteadas

            $dompdf = new Dompdf($options);

            // Cargar el HTML que se va a convertir en PDF

            $dompdf->loadHtml("
                <style>$css</style>
                $html
            ");

            $dompdf->setPaper('A4', 'portrait'); // Define el tamanio de hoja y la orientación
            $dompdf->render(); // Renderiza el PDF (procesa el HTML)

            // Enviar el PDF al browser

            $dompdf->stream(
                'Remito N° ' . $numeroRemito . '.pdf',
                ['Attachment' => true]
            );

            // Liberamos datos del array $_SESSION

            unset($_SESSION['remito_pdf']);

            exit;
        }

    // CONTINUAR SIN DESCARGAR EL REMITO PDF

    case 'continuar_sin_remito':

        // Liberamos $_SESSION

        unset($_SESSION['remito_pdf']);
        unset($_SESSION['ultimo_pedido_id']);

        $_SESSION['flash_success'] = 'Pedido finalizado correctamente.';

        header('Location: index.php?opt=crear_pedido');
        exit;

    // CONFIRMAR PEDIDO

    case 'confirmar_pedido':

        // Requiero modelos necesarios

        require_once __DIR__ . '/../models/cajaModel.php';
        $cajamodel = new cajaModel();

        require_once __DIR__ . '/../models/proveedorModel.php';
        $proveedormodel = new proveedorModel();

        require_once __DIR__ . '/../models/pedidoModel.php';
        $pedidomodel = new pedidoModel();

        // Condición IVA

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

        $condIva = $_POST['cond_iva'] ?? 'consumidor_final';

        if (!in_array($condIva, $condIvaPermitidas, true)) {

            $_SESSION['flash_error'] = 'Condición de IVA inválida.';
            header('Location: index.php?opt=resumen_venta');
            exit;
        }

        // CUIT

        $cuit = ($_POST['cuit_1'] ?? '') . ($_POST['cuit_2'] ?? '') . ($_POST['cuit_3'] ?? '');

        $cuit = trim($cuit);

        if ($cuit === '') {

            $_SESSION['flash_error'] = 'Debe ingresar un CUIT.';
            header('Location: index.php?opt=resumen_venta');
            exit;
        }

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

            $_SESSION['flash_error'] = 'El CUIT debe contener 11 dígitos.';
            header('Location: index.php?opt=resumen_venta');
            exit;
        }

        $idProveedor = $_SESSION['pedido']['proveedor']['id'] ?? null;

        $vendedor = $_SESSION['user'] ?? null;

        if ($idProveedor === null) {
            $_SESSION['flash_error'] = 'No seleccionó un proveedor.';
            header('Location: index.php?opt=crear_pedido');
            exit;
        }

        if (!$vendedor) {
            $_SESSION['flash_error'] = 'No se pudo identificar el usuario.';
            header('Location: index.php?opt=crear_pedido');
            exit;
        }

        $productosFinales = $cajamodel->listarProductosPedido();
        $proveedor = $proveedormodel->obtenerPorId($idProveedor);
        $total = $cajamodel->calcularPrecioTotalPedido();

        if (empty($productosFinales)) {
            $_SESSION['flash_error'] = 'No hay productos en el pedido.';
            header('Location: index.php?opt=crear_pedido');
            exit;
        }

        foreach ($productosFinales as $p) {
            if (empty($p['id_producto']) || empty($p['cantidad']) || $p['cantidad'] <= 0) {
                $_SESSION['flash_error'] = 'Pedido con productos inválidos.';
                header('Location: index.php?opt=crear_pedido');
                exit;
            }
        }

        if (!$proveedor) {
            $_SESSION['flash_error'] = 'Proveedor inválido.';
            header('Location: index.php?opt=crear_pedido');
            exit;
        }

        if ($total <= 0) {
            $_SESSION['flash_error'] = 'El total del pedido es inválido.';
            header('Location: index.php?opt=crear_pedido');
            exit;
        }

        // Guardamos el pedido y obtenemos el ID autoincremental desde la base de datos

        $idPedido = $pedidomodel->guardarPedido($productosFinales, $proveedor, $vendedor, $total);

        // Verificamos si se obtuvo el ID o si ocurrió algún error

        if ($idPedido !== false) {

            // Guardamos datos para utilizar en la generación del PDF

            $_SESSION['ultimo_pedido_id'] = $idPedido;

            $_SESSION['remito_pdf'] = [
                'productos' => $productosFinales,
                'proveedor' => $proveedor,
                'vendedor' => $vendedor,
                'total' => $total,
                'cond_iva' => $condIva,
                'cuit' => $cuit
            ];

            // Liberamos

            $cajamodel->vaciarCajaPedido();
            unset($_SESSION['pedido']);

            $_SESSION['flash_success'] = "Pedido guardado correctamente.";

        } else {
            $_SESSION['flash_error'] = $pedidomodel->getError() ?? 'No se pudo guardar el pedido.';
        }

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

    // DEFAULT

    default:

        ob_start();
        header("Location: index.php?opt=404View.php");
        return ob_get_clean();
}