<?php
// CONFIGURACIÓN DE ERRORES PARA PRODUCCIÓN

// Forzar modo desarrollo si estamos en localhost, para no depender de variables de entorno
$is_development_env = (
    (isset($_SERVER['SERVER_NAME']) && strpos($_SERVER['SERVER_NAME'], 'localhost') !== false) ||
    (php_sapi_name() === 'cli')
);

// Configurar manejo de errores según entorno
if (!$is_development_env && ($_ENV['APP_ENV'] === 'production' || !isset($_ENV['APP_ENV']))) {
    // PRODUCCIÓN: No mostrar errores al usuario
    ini_set('display_errors', 0);
    ini_set('display_startup_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', '/var/log/ggee/php_errors.log');
    error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
} else {
    // DESARROLLO: Mostrar errores
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
}

// Handler personalizado para errores no fatales
function productionErrorHandler($errno, $errstr, $errfile, $errline)
{
    // No mostrar al usuario en producción
    if ($_ENV['APP_ENV'] === 'production') {
        error_log("Error [$errno]: $errstr en $errfile:$errline");
        return true; // No ejecutar el handler por defecto
    }
    return false; // Ejecutar handler por defecto en desarrollo
}

// Handler para excepciones no capturadas
function productionExceptionHandler($exception)
{
    if ($_ENV['APP_ENV'] === 'production') {
        error_log("Excepción no capturada: " . $exception->getMessage() .
            " en " . $exception->getFile() . ":" . $exception->getLine());

        // Mostrar página de error genérica
        http_response_code(500);
        include __DIR__ . '/../views/error_500.php';
    } else {
        // En desarrollo, mostrar detalles
        echo "<h1>Excepción no capturada</h1>";
        echo "<p><strong>Mensaje:</strong> " . htmlspecialchars($exception->getMessage()) . "</p>";
        echo "<p><strong>Archivo:</strong> " . htmlspecialchars($exception->getFile()) . "</p>";
        echo "<p><strong>Línea:</strong> " . $exception->getLine() . "</p>";
        echo "<pre>" . htmlspecialchars($exception->getTraceAsString()) . "</pre>";
    }
    exit;
}

// Handler para errores fatales
function productionShutdownHandler()
{
    $error = error_get_last();
    if ($error && in_array($error['type'], [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE])) {
        if ($_ENV['APP_ENV'] === 'production') {
            error_log("Error fatal: {$error['message']} en {$error['file']}:{$error['line']}");

            if (!headers_sent()) {
                http_response_code(500);
                include __DIR__ . '/../views/error_500.php';
            }
        }
    }
}

// Registrar handlers
set_error_handler('productionErrorHandler');
set_exception_handler('productionExceptionHandler');
register_shutdown_function('productionShutdownHandler');

// Función para manejar errores de base de datos
function handleDatabaseError($e, $context = '')
{
    $error_id = uniqid();
    $message = "Error de BD [{$error_id}]: " . $e->getMessage();

    if ($context) {
        $message .= " Contexto: $context";
    }

    error_log($message);

    if ($_ENV['APP_ENV'] === 'production') {
        throw new Exception("Error interno del sistema. ID: $error_id");
    } else {
        throw $e; // Re-lanzar en desarrollo
    }
}

// Función para errores de validación
function handleValidationError($field, $message)
{
    $error = [
        'type' => 'validation',
        'field' => $field,
        'message' => $message,
        'timestamp' => date('Y-m-d H:i:s')
    ];

    error_log("Error de validación: " . json_encode($error));
    return $error;
}
