<?php

// Inicio de sesión

session_start();

// Generación de token (previene Cross-Site y Request Forgery)

if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Evitar Back-Forward Cache en Chrome

header("Cache-Control: no-store");

// Funcion principal para obtener el body a mostrar

function getBodyContent() {

    $opt = $_GET['opt'] ?? null; // Obtiene parámetro enviado desde URL (es el parámetro que maneja todas las acciones dentro del sistema)


    /* ----- REDIRECCIONES ----- */


    // USUARIO LOGUEADO SIN OPT (en caso de ingresar localhost/ en la barra de direcciones)
    
    if (isset($_SESSION['user']) && $opt === null) {
        if ($_SESSION['user']['rol'] === 'admin') {
            header("Location: index.php?opt=inicio_admin"); // Redirección HTTP
        } else {
            header("Location: index.php?opt=inicio_operador");
        }
        exit;
    }

    // OPCIONES DE RECUPERACION DE CUENTA (lo maneja logInController)

    $opcionesRecuperacion = [
        'recuperar_cuenta',
        'verificar_codigo',
        'restablecer_contrasenia'
    ];

    if (in_array($opt, $opcionesRecuperacion, true)) {
        return require __DIR__ . '/../controllers/logInController.php';
    }

    // USUARIO NO LOGUEADO

    if (!isset($_SESSION['user'])) {

        if ($opt === 'login') {
            return require __DIR__ . '/../controllers/logInController.php';
        }

        header("Location: index.php?opt=login"); // Envía cabeceras http al navegador, obliga a mostrar el login
        exit; // Importante usar exit para cortar ejecución
    }

    // SETEA EL USUARIO EN $_SESSION EN CASO DE QUE EL ROL SE CAMBIÓ. ADEMÁS HACE LOGOUT SI FUÉ DESACTIVADO

    if (isset($_SESSION['user'])) {

        require_once __DIR__ . '/../models/logInModel.php';
        $loginmodel = new logInModel();

        $usuario = $loginmodel->buscarPorUsuario($_SESSION['user']['usuario']);

        if (!$usuario || !(bool)$usuario['activo']) {
            session_unset();
            session_destroy();
            setcookie(session_name(), '', time() - 3600, '/');

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

        $_SESSION['user'] = $usuario;

        if ($_SESSION['user']['activo'] !== true) {
            header("Location:index.php?opt=logout");
        }
    }


    /* ----- OPCIONES DE ACCIONES EN SISTEMA ----- */

    
    // USUARIO LOGUEADO (HOME / LOGOUT)
    
    $opcioneslogueado = [
        'inicio_admin',
        'inicio_operador',
        'home_operador',
        'home_admin',
        'logout',
        'readme'
    ];

    if (in_array($opt, $opcioneslogueado, true)) { // Parámetro $strict en true, PHP compara el valor y también el tipo de dato
        return require __DIR__ . '/../controllers/logInController.php';
    }

    // OPCIONES DE USUARIO (PERFIL + ADMINISTRACION)

    $opcionesusuarios = [
        'datos_usuario',
        'usuarios',
        'crear_usuario',
        'eliminar_usuario'
    ];

    if (in_array($opt, $opcionesusuarios, true)) {
        return require __DIR__ . '/../controllers/usuarioController.php';
    }

    // CLIENTES

    $opcionesclientes = [
        'clientes',
        'crear_cliente',
        'editar_cliente'
    ];

    if (in_array($opt, $opcionesclientes, true)) {
        return require __DIR__ . '/../controllers/clienteController.php';
    }

    // PROVEEDORES

    $opcionesproveedores = [
        'proveedores',
        'crear_proveedor',
        'editar_proveedor'
    ];

    if (in_array($opt, $opcionesproveedores, true)) {
        return require __DIR__ . '/../controllers/proveedorController.php';
    }

    // PRODUCTOS

    $opcionesproductos = [
        
        // Manejo de productos

        'productos',
        'productos_inactivos',
        'crear_producto',
        'editar_producto',
        'cambiar_estado',

        // Manejo de categoría de productos

        'categorias',
        'crear_categoria',
        'editar_categoria'
    ];

    if (in_array($opt, $opcionesproductos, true)) {
        return require __DIR__ . '/../controllers/productoController.php';
    }

    // VENTAS

    $opcionesventas = [
        'listar_ventas',
        'crear_venta',
        'agregar_producto',
        'seleccionar_cliente',
        'eliminar_cliente',
        'resumen_venta',
        'guardar_datos_venta',
        'generar_venta_pdf',
        'continuar_sin_comprobante',
        'confirmar_venta',
        'detalle_venta'
    ];

    if (in_array($opt, $opcionesventas, true)) {
        return require __DIR__ . '/../controllers/ventaController.php';
    }

    // PEDIDOS

    $opcionespedidos = [
        'listar_pedidos',
        'detalle_pedido',
        'crear_pedido',
        'agregar_producto_pedido',
        'seleccionar_proveedor',
        'eliminar_proveedor',
        'generar_remito_pdf',
        'continuar_sin_remito',
        'confirmar_pedido'
    ];

    if (in_array($opt, $opcionespedidos, true)) {
        return require __DIR__ . '/../controllers/pedidoController.php';
    }

    // SERVICIOS

    $opcionesservicios = [
        'crear_servicio',
        'guardar_servicio', // Guardado inicial del servicio (cuando viene el cliente al local)
        'generar_servicio_pdf',
        'seleccionar_cliente_servicio',
        'eliminar_cliente_servicio',
        'listar_servicios',
        'actualizar_servicio', // Actualización del servicio (se cargan los datos a realizar e insumos a utilizar)
        'agregar_insumo',
        'finalizar_servicio', // Actualización del servicio (el cliente decidió llevar a cabo el servicio, al terminar se marca como finalizado en la base de datos)
        'cancelar_servicio', // Según regla de negocio (caso en donde el cliente decide no realizar el servicio)
        'detalle_servicio',
        'detalle_insumos_servicio',
        'resetear_datos_servicio', // Para resetar caja y datos en $_SESSION al ingresar a la vista de actualización
        'agregar_mano_obra'
    ];

    if (in_array($opt, $opcionesservicios, true)) {
        return require __DIR__ . '/../controllers/servicioController.php';
    }

    // MANEJO GENERAL DE CAJA

    $opcionescaja = [

        // MANEJO DE VENTAS

        'agregar_producto_caja',
        'eliminar_producto',
        'editar_cantidad',
        'vaciar_caja_venta',

        // MANEJO DE PEDIDOS

        'agregar_producto_pedido_caja',
        'eliminar_producto_pedido',
        'editar_datos_producto',
        'vaciar_caja_pedido',

        // MANEJO DE SERVICIOS

        'agregar_insumo_caja',
        'vaciar_caja_servicio',
        'eliminar_insumo',
        'editar_cantidad_insumo'
    ];

    if (in_array($opt, $opcionescaja, true)) {
        return require __DIR__ . '/../controllers/cajaController.php';
    }

    // PRESUPUESTOS

    $opcionespresupuestos = [
        'crear_presupuesto',
        'seleccionar_cliente_presupuesto',
        'eliminar_cliente_presupuesto',
        'agregar_producto_presupuesto',
        'eliminar_producto_presupuesto',
        'vaciar_caja_presupuesto',
        'editar_cantidad_presupuesto',
        'resumen_presupuesto',
        'guardar_datos_presupuesto',
        'generar_presupuesto_pdf'
    ];

    if (in_array($opt, $opcionespresupuestos, true)) {
        return require __DIR__ . '/../controllers/presupuestoController.php';
    }

    // INFORMES

    $opcionesinformes = [
        'generar_balance_anual',
        'generar_cuentas_por_cobrar',
        'informe'
    ];

    if (in_array($opt, $opcionesinformes, true)) {
        return require __DIR__ . '/../controllers/informeController.php';
    }

    // CONFIGURACIÓN DEL SISTEMA (controla configuración general y también backups)

    $opcionesconfiguracion = [
        'configuracion',
        'actualizar_config',
        'backups',
        'generar_backup',
        'descargar_backup',
        'eliminar_backup',
        'restaurar_backup'
    ];

    if (in_array($opt, $opcionesconfiguracion, true)) {
        return require __DIR__ . '/../controllers/configuracionController.php';
    }

    // CHATBOT

    $opcioneschatbot = [
        'chatbot'
    ];

    if (in_array($opt, $opcioneschatbot, true)) {
        
        ob_start();

        require __DIR__ . '/../views/chatbot/chatbotView.php';

        return ob_get_clean();
    }

    // DEFAULT (404)
    
    ob_start(); // Inicia búfer de salida en PHP, lo guarda en memoria
    require __DIR__ . '/../views/404View.php';
    return ob_get_clean(); // Devuelve el contenido almacenado en el búfer como string
}