<?php // index.php session_start(); // Configuración de errores para desarrollo error_reporting(E_ALL); ini_set('display_errors', 1); // Router simple $controller = $_GET['controller'] ?? 'auth'; $action = $_GET['action'] ?? 'index'; // VALIDACIÓN DE AUTENTICACIÓN // Rutas públicas que no requieren autenticación $publicRoutes = [ 'auth' => ['index', 'login'] ]; // Verificar si la ruta actual es pública $isPublicRoute = isset($publicRoutes[$controller]) && in_array($action, $publicRoutes[$controller]); // Si NO es ruta pública y el usuario NO está autenticado, redirigir al login if (!$isPublicRoute && !isset($_SESSION['user_id'])) { header('Location: index.php?controller=auth&action=index'); exit; } // Si está autenticado e intenta acceder al login, redirigir al panel if ($controller === 'auth' && $action === 'index' && isset($_SESSION['user_id'])) { header('Location: index.php?controller=requisicion&action=panel'); exit; } // Determinar si es una vista HTML o una petición API $isHTMLView = in_array($action, ['formulario', 'panel', 'gestion', 'detalle', 'index', 'detalleCandidato']); // Solo configurar headers JSON si NO es una vista HTML if(!$isHTMLView) { header('Content-Type: application/json; charset=utf-8'); header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE'); header('Access-Control-Allow-Headers: Content-Type'); } // Autoload de clases spl_autoload_register(function ($class) { // Mapeo de nombres de clases a archivos $classMap = [ 'RequisicionController' => 'controllers/RequisicionController.php', 'CandidatoController' => 'controllers/CandidatoController.php', 'AuthController' => 'controllers/AuthController.php', 'Requisicion' => 'models/requisicionModel.php', 'Candidato' => 'models/candidatoModel.php', 'Entrevista' => 'models/entrevistaModel.php', 'Examen' => 'models/examenModel.php', 'Usuario' => 'models/UsuarioModel.php', 'Database' => 'config/Database.php' ]; if (isset($classMap[$class])) { $file = __DIR__ . '/' . $classMap[$class]; if (file_exists($file)) { require_once $file; return; } } // Fallback: buscar en las carpetas estándar $paths = [ 'controllers/', 'models/', 'config/' ]; foreach ($paths as $path) { $file = __DIR__ . '/' . $path . $class . '.php'; if (file_exists($file)) { require_once $file; return; } } }); try { switch($controller) { // CONTROLADOR DE AUTENTICACIÓN case 'auth': $ctrl = new AuthController(); switch($action) { case 'index': $ctrl->index(); break; case 'login': $ctrl->login(); break; case 'logout': $ctrl->logout(); break; default: echo json_encode(['success' => false, 'message' => 'Acción no válida']); } break; // CONTROLADOR DE REQUISICIONES case 'requisicion': $ctrl = new RequisicionController(); switch($action) { case 'formulario': // ✅ Llamar al método del controlador que carga las áreas $ctrl->formulario(); break; case 'panel': require_once 'views/requisicion/panel.php'; break; case 'crear': $ctrl->crear(); break; case 'listar': $ctrl->listar(); break; case 'obtener': $ctrl->obtener($_GET['id']); break; case 'actualizarEstado': $ctrl->actualizarEstado(); break; case 'estadisticas': $ctrl->estadisticas(); break; case 'detalle': $ctrl->detalle(); break; default: echo json_encode(['success' => false, 'message' => 'Acción no válida']); } break; // ======================================== // CONTROLADOR DE CANDIDATOS // ======================================== case 'candidato': $ctrl = new CandidatoController(); switch($action) { case 'gestion': require_once 'views/candidato/gestion.php'; break; case 'crearFase1': $ctrl->crearFase1(); break; case 'crearFase2': $ctrl->crearFase2(); break; case 'crearFase3': $ctrl->crearFase3(); break; case 'listarPorFase': $ctrl->listarPorFase(); break; case 'obtenerCompleto': $ctrl->obtenerCompleto($_GET['id']); break; case 'obtenerAlertas': $ctrl->obtenerAlertas(); break; case 'actualizarFase2': $ctrl->actualizarFase2(); break; case 'actualizarFase3': $ctrl->actualizarFase3(); break; case 'buscarPorCedulas': $ctrl->buscarPorCedulas(); break; case 'detalleCandidato': $ctrl->detalleCandidato(); break; default: echo json_encode(['success' => false, 'message' => 'Acción no válida']); } break; default: // Si el controlador no existe, redirigir al login header('Location: index.php?controller=auth&action=index'); exit; } } catch(Exception $e) { if($isHTMLView) { echo '<h1>Error</h1><p>' . $e->getMessage() . '</p>'; } else { echo json_encode([ 'success' => false, 'message' => 'Error del servidor: ' . $e->getMessage() ]); } } ?>