<?php
// Start performance monitoring
require_once __DIR__ . '/utils/PerformanceMonitor.php';
PerformanceMonitor::start();

// Configurar headers CORS
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');

// Handle preflight requests
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    PerformanceMonitor::end('OPTIONS');
    exit();
}

// Error handling
set_error_handler(function($severity, $message, $file, $line) {
    throw new ErrorException($message, 0, $severity, $file, $line);
});

try {
    // Incluir configuración y dependencias
    require_once __DIR__ . '/config/database.php';
    require_once __DIR__ . '/routes/auth.php';
    require_once __DIR__ . '/routes/projects.php';
    require_once __DIR__ . '/routes/rodales.php';
    require_once __DIR__ . '/routes/field-data.php';
    require_once __DIR__ . '/routes/species.php';
    require_once __DIR__ . '/routes/reports.php';

    // Obtener conexión a base de datos
    $database = new Database();
    $db = $database->getConnection();

    // Parsear la ruta
    $request_uri = $_SERVER['REQUEST_URI'];
    $path = parse_url($request_uri, PHP_URL_PATH);
    
    // Remover /api del path si existe
    $path = preg_replace('#^/api/?#', '', $path);
    $path = trim($path, '/');
    
    $method = $_SERVER['REQUEST_METHOD'];

    // Router principal
    $response = null;

    // Rutas de autenticación
    if (strpos($path, 'auth/') === 0) {
        $response = handleAuthRoutes($path, $method, $db);
    }
    // Rutas de proyectos
    elseif (strpos($path, 'projects') === 0) {
        $response = handleProjectRoutes($path, $method, $db);
    }
    // Rutas de rodales
    elseif (strpos($path, 'rodales') === 0 || preg_match('/^projects\/\d+\/rodales/', $path)) {
        $response = handleRodalRoutes($path, $method, $db);
    }
    // Rutas de datos de campo
    elseif (strpos($path, 'field-data') === 0 || preg_match('/^rodales\/\d+\/field-data/', $path)) {
        $response = handleFieldDataRoutes($path, $method, $db);
    }
    // Rutas de especies
    elseif (strpos($path, 'species') === 0) {
        $response = handleSpeciesRoutes($path, $method, $db);
    }
    // Rutas de seguridad
    elseif (strpos($path, 'security') === 0) {
        include __DIR__ . '/routes/security.php';
        return;
    }
    // Rutas de cache
    elseif (strpos($path, 'cache') === 0) {
        require_once __DIR__ . '/controllers/CacheController.php';
        $controller = new CacheController();
        
        if ($method === 'GET' && $path === 'cache/stats') {
            $response = $controller->getStats();
        } elseif ($method === 'DELETE' && $path === 'cache/clear') {
            $response = $controller->clearAll();
        } elseif ($method === 'DELETE' && $path === 'cache/cleanup') {
            $response = $controller->cleanup();
        } elseif ($method === 'DELETE' && preg_match('/^cache\/invalidate\/(.+)$/', $path, $matches)) {
            $response = $controller->invalidateTag($matches[1]);
        } elseif ($method === 'POST' && $path === 'cache/warm') {
            $response = $controller->warmUp();
        } else {
            http_response_code(404);
            $response = json_encode(['error' => 'Cache endpoint no encontrado']);
        }
    }
    // Rutas de reportes y cálculos
    elseif (preg_match('/^(rodales\/\d+\/(calculations|export-csv)|projects\/\d+\/summary|calculations\/refresh)/', $path)) {
        // Las rutas de reportes se manejan directamente en reports.php
        include __DIR__ . '/routes/reports.php';
        return;
    }

    // Si no se encontró ruta específica
    if ($response === null) {
        // Verificar si es la ruta raíz de la API
        if (empty($path) || $path === '/') {
            http_response_code(200);
            $response = json_encode([
                'success' => true,
                'message' => 'SIF-GT API v1.0',
                'version' => '1.0.0',
                'endpoints' => [
                    'auth' => [
                        'POST /auth/login' => 'Iniciar sesión',
                        'POST /auth/logout' => 'Cerrar sesión',
                        'POST /auth/refresh' => 'Renovar token',
                        'GET /auth/me' => 'Obtener usuario actual',
                        'POST /auth/change-password' => 'Cambiar contraseña',
                        'GET /auth/permissions' => 'Obtener permisos del usuario'
                    ],
                    'projects' => [
                        'GET /projects' => 'Obtener lista de proyectos',
                        'GET /projects/{id}' => 'Obtener proyecto específico',
                        'POST /projects' => 'Crear nuevo proyecto',
                        'PUT /projects/{id}' => 'Actualizar proyecto',
                        'DELETE /projects/{id}' => 'Eliminar proyecto',
                        'POST /projects/{id}/documents' => 'Subir documento PDF',
                        'GET /projects/{id}/documents/{type}' => 'Descargar documento',
                        'GET /projects/departments' => 'Obtener departamentos de Guatemala'
                    ],
                    'rodales' => [
                        'GET /projects/{projectId}/rodales' => 'Obtener rodales por proyecto',
                        'POST /projects/{projectId}/rodales' => 'Crear nuevo rodal',
                        'GET /rodales/{id}' => 'Obtener rodal específico con estadísticas',
                        'PUT /rodales/{id}' => 'Actualizar rodal',
                        'DELETE /rodales/{id}' => 'Eliminar rodal',
                        'GET /rodales/{id}/field-data' => 'Obtener datos de campo por rodal'
                    ],
                    'reports' => [
                        'GET /rodales/{id}/calculations' => 'Obtener cálculos forestales del rodal',
                        'GET /rodales/{id}/export-csv' => 'Exportar datos del rodal a CSV',
                        'GET /projects/{id}/summary' => 'Obtener resumen completo del proyecto',
                        'POST /calculations/refresh/{rodalId}' => 'Actualizar cálculos después de sincronización'
                    ],
                    'field-data' => [
                        'POST /field-data/sync' => 'Sincronización masiva de datos de campo',
                        'PUT /field-data/mark-synced' => 'Marcar registros como sincronizados',
                        'GET /field-data/pending-sync' => 'Obtener registros pendientes de sincronización',
                        'GET /field-data/{id}' => 'Obtener registro específico de campo',
                        'PUT /field-data/{id}' => 'Actualizar registro de campo',
                        'DELETE /field-data/{id}' => 'Eliminar registro de campo'
                    ],
                    'species' => [
                        'GET /species' => 'Obtener todas las especies activas',
                        'GET /species/recommended' => 'Obtener especies recomendadas para inventario',
                        'GET /species/search?q=term' => 'Buscar especies por nombre',
                        'GET /species/most-used' => 'Obtener especies más utilizadas',
                        'GET /species/stats' => 'Obtener estadísticas de uso de especies',
                        'GET /species/{id}' => 'Obtener especie específica',
                        'POST /species' => 'Crear nueva especie (Admin)',
                        'POST /species/initialize' => 'Inicializar catálogo de Guatemala (Admin)'
                    ],
                    'security' => [
                        'GET /security/stats' => 'Obtener estadísticas de seguridad (Admin)',
                        'GET /security/audit' => 'Realizar auditoría de seguridad (Admin)',
                        'POST /security/cleanup' => 'Limpiar archivos huérfanos y logs antiguos (Admin)'
                    ],
                    'cache' => [
                        'GET /cache/stats' => 'Obtener estadísticas de cache (Admin)',
                        'DELETE /cache/clear' => 'Limpiar todo el cache (Admin)',
                        'DELETE /cache/cleanup' => 'Limpiar entradas de cache expiradas (Admin)',
                        'DELETE /cache/invalidate/{tag}' => 'Invalidar cache por tag (Admin)',
                        'POST /cache/warm' => 'Precalentar cache con consultas frecuentes (Admin)'
                    ]
                ]
            ]);
        } else {
            // Ruta no encontrada
            http_response_code(404);
            $response = json_encode([
                'success' => false,
                'message' => 'Endpoint no encontrado',
                'path' => $path,
                'method' => $method
            ]);
        }
    }

    // Enviar respuesta
    echo $response;
    
    // End performance monitoring
    PerformanceMonitor::end($path);

} catch (Exception $e) {
    // Log del error
    error_log("API Error: " . $e->getMessage() . " in " . $e->getFile() . " on line " . $e->getLine());
    
    // End performance monitoring with error
    PerformanceMonitor::end($path ?? 'error', ['error' => $e->getMessage()]);
    
    // Respuesta de error genérica
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Error interno del servidor'
    ]);
}
?>