<?php

declare(strict_types=1);

/**
 * Ejecuta el parche SQL para inicializar el módulo de Recursos Humanos (RRHH).
 * Ejecutar: php bin/db-patch-hr.php
 */

require_once dirname(__DIR__) . '/config/bootstrap.php';

use ApiModel\Infrastructure\Persistence\Database;

$sqlFile = dirname(__DIR__) . '/docs/db_patch_hr.sql';

echo "=== APLICANDO PARCHE DE RECURSOS HUMANOS (RRHH) ===\n";

if (! is_file($sqlFile)) {
    fwrite(STDERR, "No se encontró el archivo: {$sqlFile}\n");
    exit(1);
}

try {
    $pdo = Database::connect();
    $driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
    echo "Conectado a la base de datos ({$driver}).\n";

    $sql = file_get_contents($sqlFile);
    if ($sql === false) {
        throw new RuntimeException("No se pudo leer el archivo SQL");
    }

    if ($driver === 'sqlite') {
        echo "Adaptando patch para SQLite...\n";
        // Eliminar schemas en SQLite
        $sql = str_replace('CREATE SCHEMA IF NOT EXISTS hr;', '', $sql);
        $sql = str_replace('auth.', '', $sql);
        $sql = str_replace('hr.', '', $sql);
        $sql = str_replace('DEFAULT gen_random_uuid()', '', $sql);
        $sql = str_replace('CURRENT_TIMESTAMP', "datetime('now')", $sql);
        // SQLite no soporta validaciones ON CONFLICT en multiples tablas complejas de la misma manera si no hay pk
        // Pero las tablas del menu tienen id/pk, por lo que ON CONFLICT funciona.
    } else {
        // En PostgreSQL nos aseguramos de que el esquema hr exista primero.
        $pdo->exec('CREATE SCHEMA IF NOT EXISTS hr;');
    }

    // Dividimos por punto y coma para ejecutar sentencias individuales en SQLite si es necesario, 
    // pero exec() puede manejar múltiples comandos en PDO.
    $pdo->exec($sql);
    echo "Parche de RRHH aplicado exitosamente.\n";
    echo "=== PROCESO COMPLETADO ===\n";
} catch (Throwable $e) {
    fwrite(STDERR, "ERROR: " . $e->getMessage() . "\n");
    exit(1);
}
