<?php
/**
 * lib/db.php — Conexión PDO a SQLite.
 *
 * Devuelve una única instancia PDO (singleton) apuntando a data/panel.sqlite.
 * Crea el directorio data/ si no existe y activa claves foráneas.
 */

declare(strict_types=1);

/**
 * Ruta absoluta al archivo de base de datos SQLite.
 */
function db_path(): string
{
    return __DIR__ . '/../data/panel.sqlite';
}

/**
 * Devuelve la conexión PDO compartida.
 * - Activa excepciones para que ningún error SQL pase silencioso.
 * - Activa foreign_keys (SQLite las trae apagadas por defecto).
 */
function db(): PDO
{
    static $pdo = null;

    if ($pdo instanceof PDO) {
        return $pdo;
    }

    $dir = dirname(db_path());
    // Auto-crear el directorio data/ con permisos razonables.
    if (!is_dir($dir)) {
        @mkdir($dir, 0775, true);
    }

    $pdo = new PDO('sqlite:' . db_path());
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    // Pragmas: claves foráneas + WAL + menos fsync (seguro con WAL) + espera ante bloqueos.
    // Reduce la latencia de escritura (cada boot/login hace un upsert) en hosting compartido.
    $pdo->exec('PRAGMA foreign_keys = ON;');
    $pdo->exec('PRAGMA journal_mode = WAL;');
    $pdo->exec('PRAGMA synchronous = NORMAL;');
    $pdo->exec('PRAGMA busy_timeout = 5000;');
    $pdo->exec('PRAGMA temp_store = MEMORY;');

    return $pdo;
}
