<?php
/**
 * ZLETS - Front Controller / Router
 * 
 * Punto de entrada único de la aplicación.
 * Determina qué controlador y acción ejecutar basándose en los parámetros GET.
 * 
 * Rutas:
 *   ?c=dashboard             → DashboardController::index()
 *   ?c=letras                → LetraController::index()
 *   ?c=letras&a=crear        → LetraController::crear()
 *   ?c=letras&a=guardar      → LetraController::guardar()  [POST]
 *   ?c=letras&a=editar&id=X  → LetraController::editar()
 *   ?c=letras&a=actualizar   → LetraController::actualizar() [POST]
 *   ?c=letras&a=eliminar     → LetraController::eliminar() [POST]
 *   ?c=empresas              → EmpresaController::index()
 *   ?c=empresas&a=crear      → EmpresaController::crear()
 *   ?c=empresas&a=guardar    → EmpresaController::guardar() [POST]
 *   ?c=empresas&a=editar&id=X→ EmpresaController::editar()
 *   ?c=empresas&a=eliminar   → EmpresaController::eliminar() [POST]
 *   ?c=reportes              → ReporteController::index()
 *   ?c=reportes&a=generar    → ReporteController::generar()
 *   ?c=reportes&a=exportarExcel → ReporteController::exportarExcel()
 */

// Configuración de errores (desactivar en producción)
ini_set('display_errors', 1);
error_reporting(E_ALL);

// Zona horaria de Perú
date_default_timezone_set('America/Bogota');

// Sesión para mensajes flash
session_start();

// Autoload de configuración y clases
require_once __DIR__ . '/config/conexion.php';

// Definir constante de ruta base
define('BASE_URL', '/zlets/');
define('BASE_PATH', __DIR__ . '/');

/**
 * Función helper para cargar vistas
 */
function loadView(string $view, array $data = []): void
{
    // Extraer variables para que estén disponibles en la vista
    extract($data);
    
    $viewFile = BASE_PATH . 'views/' . $view . '.php';
    
    if (file_exists($viewFile)) {
        require $viewFile;
    } else {
        http_response_code(404);
        echo "<h1>Vista no encontrada: {$view}</h1>";
    }
}

/**
 * Función helper para redirección
 */
function redirect(string $url): void
{
    header('Location: ' . BASE_URL . $url);
    exit;
}

/**
 * Función helper para mensajes flash
 */
function setFlash(string $tipo, string $mensaje): void
{
    $_SESSION['flash'] = ['tipo' => $tipo, 'mensaje' => $mensaje];
}

function getFlash(): ?array
{
    if (isset($_SESSION['flash'])) {
        $flash = $_SESSION['flash'];
        unset($_SESSION['flash']);
        return $flash;
    }
    return null;
}

// ============================================================
// ROUTER
// ============================================================

// Obtener controlador y acción de los parámetros GET
$controllerName = isset($_GET['c']) ? strtolower(trim($_GET['c'])) : 'dashboard';
$actionName     = isset($_GET['a']) ? strtolower(trim($_GET['a'])) : 'index';

// Mapa de controladores
$controllers = [
    'dashboard'     => 'DashboardController',
    'letras'        => 'LetraController',
    'empresas'      => 'EmpresaController',
    'reportes'      => 'ReporteController',
    'mantenimiento' => 'MantenimientoController',
];

// Verificar que el controlador existe
if (!array_key_exists($controllerName, $controllers)) {
    http_response_code(404);
    echo "<h1>Página no encontrada</h1>";
    exit;
}

// Cargar modelo(s) y controlador
$controllerClass = $controllers[$controllerName];
$controllerFile  = BASE_PATH . 'controllers/' . $controllerClass . '.php';

// Cargar modelos necesarios
$modelFiles = glob(BASE_PATH . 'models/*.php');
foreach ($modelFiles as $modelFile) {
    require_once $modelFile;
}

// Cargar controlador
if (file_exists($controllerFile)) {
    require_once $controllerFile;
} else {
    http_response_code(500);
    echo "<h1>Error: Controlador no encontrado ({$controllerClass})</h1>";
    exit;
}

// Instanciar controlador y ejecutar acción
$controller = new $controllerClass();

if (method_exists($controller, $actionName)) {
    $controller->$actionName();
} else {
    http_response_code(404);
    echo "<h1>Acción no encontrada: {$controllerClass}::{$actionName}()</h1>";
    exit;
}
