<?php
/**
 * Bootstrap del sistema - Inicialización
 */

// Configurar zona horaria
date_default_timezone_set('America/Lima');

// Configurar errores según el entorno
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Cargar variables de entorno
if (file_exists(__DIR__ . '/../.env')) {
    $lines = file(__DIR__ . '/../.env', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    foreach ($lines as $line) {
        if (strpos(trim($line), '#') === 0) {
            continue;
        }
        
        if (strpos($line, '=') !== false) {
            [$name, $value] = explode('=', $line, 2);
            $_ENV[trim($name)] = trim($value);
        }
    }
}

// Configurar sesiones seguras
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', isset($_SERVER['HTTPS']) ? 1 : 0);
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_samesite', 'Lax');

// Configurar duración de sesión
ini_set('session.gc_maxlifetime', ($_ENV['SESSION_LIFETIME'] ?? 120) * 60);

// Iniciar sesión
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// Regenerar ID de sesión periódicamente para seguridad
if (!isset($_SESSION['last_regeneration'])) {
    $_SESSION['last_regeneration'] = time();
} elseif (time() - $_SESSION['last_regeneration'] > 300) { // 5 minutos
    session_regenerate_id(true);
    $_SESSION['last_regeneration'] = time();
}

// Headers de seguridad
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: DENY');
header('X-XSS-Protection: 1; mode=block');

// Autoloader simple
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $base_dir = __DIR__ . '/';

    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        return;
    }

    $relative_class = substr($class, $len);
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';

    if (file_exists($file)) {
        require $file;
    }
});

// Función helper para cargar configuraciones
function config($key, $default = null) {
    static $configs = [];
    
    $parts = explode('.', $key);
    $configFile = array_shift($parts);
    
    if (!isset($configs[$configFile])) {
        $configPath = __DIR__ . '/../config/' . $configFile . '.php';
        if (file_exists($configPath)) {
            $configs[$configFile] = require $configPath;
        } else {
            return $default;
        }
    }
    
    $value = $configs[$configFile];
    
    foreach ($parts as $part) {
        if (!is_array($value) || !array_key_exists($part, $value)) {
            return $default;
        }
        $value = $value[$part];
    }
    
    return $value;
}

// Función helper para escape HTML
function e($string) {
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

// Función helper para debug (solo en desarrollo)
function dd($var) {
    if ($_ENV['APP_DEBUG'] ?? false) {
        echo '<pre>';
        var_dump($var);
        echo '</pre>';
        die();
    }
}

// Funciones helper globales
if (!function_exists('csrf_token')) {
    function csrf_token(): string {
        if (!isset($_SESSION['csrf_token'])) {
            $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
        }
        return $_SESSION['csrf_token'];
    }
}

if (!function_exists('old')) {
    function old(string $key, mixed $default = ''): mixed {
        return $_SESSION['old_input'][$key] ?? $default;
    }
}

if (!function_exists('flash')) {
    function flash(string $key, mixed $default = null): mixed {
        $value = $_SESSION[$key] ?? $default;
        if (isset($_SESSION[$key])) {
            unset($_SESSION[$key]);
        }
        return $value;
    }
}