<?php

declare(strict_types=1);

if (!defined('BASE_PATH')) {
    define('BASE_PATH', __DIR__);
}

require_once BASE_PATH . '/lib/Env.php';
require_once BASE_PATH . '/lib/Security.php';

Env::load(BASE_PATH . '/.env');

if (!defined('APP_ENV')) {
    define('APP_ENV', Env::get('APP_ENV', 'production'));
}
if (!defined('APP_DEBUG')) {
    define('APP_DEBUG', Env::bool('APP_DEBUG', false));
}
if (!defined('APP_KEY')) {
    define('APP_KEY', Env::get('APP_KEY', ''));
}
if (!defined('LEGACY_ENCRYPTION_KEY')) {
    define('LEGACY_ENCRYPTION_KEY', Env::get('LEGACY_ENCRYPTION_KEY', ''));
}
if (!defined('LEGACY_ENCRYPTION_IV')) {
    define('LEGACY_ENCRYPTION_IV', Env::get('LEGACY_ENCRYPTION_IV', ''));
}
if (!defined('SESSION_NAME')) {
    define('SESSION_NAME', Env::get('SESSION_NAME', 'AFENIXXSESSID'));
}
if (!defined('SESSION_IDLE_TIMEOUT')) {
    define('SESSION_IDLE_TIMEOUT', Env::int('SESSION_IDLE_TIMEOUT', 7200));
}
if (!defined('SESSION_ABSOLUTE_TIMEOUT')) {
    define('SESSION_ABSOLUTE_TIMEOUT', Env::int('SESSION_ABSOLUTE_TIMEOUT', 43200));
}

// Alias temporales para archivos antiguos. No contienen secretos en el código.
if (!defined('ENCRYPTION_KEY')) {
    define('ENCRYPTION_KEY', LEGACY_ENCRYPTION_KEY);
}
if (!defined('ENCRYPTION_SECRET_IV')) {
    define('ENCRYPTION_SECRET_IV', LEGACY_ENCRYPTION_IV);
}

$timezone = Env::get('APP_TIMEZONE', 'America/Lima');
if (!@date_default_timezone_set($timezone)) {
    date_default_timezone_set('America/Lima');
}

ini_set('display_errors', APP_DEBUG ? '1' : '0');
ini_set('display_startup_errors', APP_DEBUG ? '1' : '0');
ini_set('log_errors', '1');
error_reporting(E_ALL);

$logDirectory = BASE_PATH . '/storage/logs';
if (!is_dir($logDirectory)) {
    @mkdir($logDirectory, 0750, true);
}
if (is_dir($logDirectory) && is_writable($logDirectory)) {
    ini_set('error_log', $logDirectory . '/php-error.log');
}

Security::startSession(SESSION_NAME);

$dbHost = Env::get('DB_HOST', 'localhost');
$dbPort = Env::int('DB_PORT', 3306);
$dbName = Env::get('DB_NAME');
$dbUser = Env::get('DB_USER');
$dbPass = Env::get('DB_PASS', '');
$dbCharset = Env::get('DB_CHARSET', 'utf8mb4');

if ($dbName === null || $dbUser === null) {
    error_log('Configuración incompleta: DB_NAME y DB_USER son obligatorios.');
    http_response_code(500);
    exit(APP_DEBUG
        ? 'Faltan DB_NAME o DB_USER en el archivo .env.'
        : 'El sistema no está configurado correctamente.');
}

$dsn = sprintf(
    'mysql:host=%s;port=%d;dbname=%s;charset=%s',
    $dbHost,
    $dbPort,
    $dbName,
    $dbCharset
);

$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_STRINGIFY_FETCHES => false,
];

try {
    $pdo = new PDO($dsn, $dbUser, $dbPass, $options);
} catch (PDOException $e) {
    error_log('Fallo de conexión PDO: ' . $e->getMessage());
    http_response_code(500);
    exit(APP_DEBUG
        ? 'No se pudo conectar con la base de datos: ' . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8')
        : 'No fue posible conectar con el servicio de datos.');
}
