<?php
/**
 * Migración: Módulo Administrativo de Laboratorio
 * Ejecuta las 7 migraciones SQL del módulo en orden
 *
 * Uso:
 *   php migrations/20260302_lab_run_migrations.php
 *   php migrations/20260302_lab_run_migrations.php --rollback
 *
 * Las tablas se crean en este orden para respetar las FK:
 *   1. lab_pacientes         (depende de users)
 *   2. lab_enfermeras        (independiente)
 *   3. lab_ordenes_medicas   (depende de lab_pacientes, conversations, admin_users)
 *   4. lab_domicilios        (depende de lab_ordenes_medicas, lab_pacientes)
 *   5. lab_asignaciones      (depende de lab_domicilios, lab_enfermeras)
 *   6. lab_autorizaciones    (depende de lab_ordenes_medicas)
 *   7. lab_actividad_admin   (depende de admin_users)
 */

require_once __DIR__ . '/../config/config.php';

$isRollback = in_array('--rollback', $argv ?? []);
$line       = str_repeat('─', 60);

echo "\n$line\n";
echo $isRollback
    ? "  🔄  ROLLBACK — Módulo Administrativo Lab\n"
    : "  🚀  MIGRACIÓN — Módulo Administrativo Lab\n";
echo "$line\n\n";

// ── Archivos en orden de ejecución (rollback = inverso) ──────────────────────
$migrations = [
    '20260302_lab_01_pacientes.sql',
    '20260302_lab_02_enfermeras.sql',
    '20260302_lab_03_ordenes_medicas.sql',
    '20260302_lab_04_domicilios.sql',
    '20260302_lab_05_asignaciones.sql',
    '20260302_lab_06_autorizaciones.sql',
    '20260302_lab_07_actividad_admin.sql',
];

// ── Sentencias DROP para rollback (orden inverso para respetar FK) ───────────
$rollback = [
    'DROP TABLE IF EXISTS `lab_actividad_admin`',
    'DROP TABLE IF EXISTS `lab_autorizaciones`',
    'DROP TABLE IF EXISTS `lab_asignaciones`',
    'DROP TABLE IF EXISTS `lab_domicilios`',
    'DROP TABLE IF EXISTS `lab_ordenes_medicas`',
    'DROP TABLE IF EXISTS `lab_enfermeras`',
    'DROP TABLE IF EXISTS `lab_pacientes`',
];

try {
    $db  = Database::getInstance();
    $pdo = $db->getConnection();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    if ($isRollback) {
        // ── ROLLBACK ─────────────────────────────────────────────────────────
        foreach ($rollback as $sql) {
            $table = preg_replace('/.*`(lab_\w+)`.*/', '$1', $sql);
            $pdo->exec($sql);
            echo "  ✅  DROP $table\n";
        }
        echo "\n  ✔  Rollback completado correctamente.\n\n";
    } else {
        // ── MIGRACIÓN ────────────────────────────────────────────────────────
        $dir = __DIR__;

        foreach ($migrations as $file) {
            $path = "$dir/$file";

            if (!file_exists($path)) {
                echo "  ⚠️  Archivo no encontrado: $file  (omitido)\n";
                continue;
            }

            $sql = file_get_contents($path);

            // Separar sentencias por ';' pero solo las CREATE TABLE
            // (Los archivos contienen una sola sentencia CREATE TABLE)
            $pdo->exec($sql);

            // Extraer nombre de tabla del archivo para feedback
            preg_match('/CREATE TABLE IF NOT EXISTS `(\w+)`/i', $sql, $m);
            $table = $m[1] ?? $file;
            echo "  ✅  $table\n";
        }

        echo "\n$line\n";
        echo "  ✔  Todas las migraciones ejecutadas correctamente.\n";
        echo "$line\n\n";

        // ── Tabla de control de migraciones ejecutadas en system_logs ────────
        try {
            $pdo->prepare("
                INSERT INTO system_logs (level, message, context, created_at)
                VALUES ('info', 'lab_module_migration', ?, NOW())
            ")->execute([json_encode([
                'version'   => '20260302',
                'module'    => 'lab_admin',
                'tables'    => 7,
                'executed'  => date('Y-m-d H:i:s'),
            ])]);
        } catch (Exception $e) {
            // system_logs puede no tener estas columnas — no falla la migración
        }
    }
} catch (PDOException $e) {
    echo "\n  ❌  ERROR: " . $e->getMessage() . "\n\n";
    echo "  Ejecuta --rollback para deshacer los cambios parciales.\n\n";
    exit(1);
}
