<?php
/**
 * Runner — Migración 003: Módulo Turnero (Oleada 1)
 *
 * Uso desde terminal:
 *   php run_003_turnero.php
 *
 * O desde el navegador (solo en desarrollo, no exponer en producción):
 *   https://tu-dominio/run_003_turnero.php
 */

// Cargar config primero para que MIGRATION_TOKEN esté disponible
require_once __DIR__ . '/config/config.php';

// Ejecutar solo desde CLI o con token de protección básica en web
if (php_sapi_name() !== 'cli') {
    $token = $_GET['token'] ?? '';
    if (empty($token) || $token !== (defined('MIGRATION_TOKEN') ? MIGRATION_TOKEN : '')) {
        http_response_code(403);
        die("Acceso denegado. Usa CLI: php run_003_turnero.php\n");
    }
}

$sqlFile = __DIR__ . '/migrations/003_turnero.sql';

if (!file_exists($sqlFile)) {
    echo "❌ Archivo no encontrado: $sqlFile\n";
    exit(1);
}

try {
    $db  = Database::getInstance();
    $pdo = $db->getConnection();

    $sql        = file_get_contents($sqlFile);
    $statements = [];

    // Separar sentencias por ; respetando comentarios de línea y bloques
    $lines      = explode("\n", $sql);
    $current    = '';

    foreach ($lines as $line) {
        $trimmed = trim($line);

        // Saltar líneas de comentario
        if (str_starts_with($trimmed, '--') || str_starts_with($trimmed, '#')) {
            continue;
        }

        $current .= ' ' . $trimmed;

        if (str_ends_with($trimmed, ';')) {
            $stmt = trim($current);
            if (!empty($stmt) && $stmt !== ';') {
                $statements[] = $stmt;
            }
            $current = '';
        }
    }

    echo "\n🚀 Ejecutando Migración 003 — Turnero\n";
    echo str_repeat('─', 60) . "\n\n";

    $ok  = 0;
    $err = 0;

    foreach ($statements as $stmt) {
        $preview = substr(preg_replace('/\s+/', ' ', $stmt), 0, 90);

        try {
            $pdo->exec($stmt);
            echo "  ✓ " . $preview . "\n";
            $ok++;
        } catch (PDOException $e) {
            $msg = $e->getMessage();

            // Errores ignorables: duplicado, ya existe, columna ya existe
            $ignorable = (
                str_contains($msg, 'Duplicate entry')   ||
                str_contains($msg, 'already exists')    ||
                str_contains($msg, "Duplicate key name")||
                str_contains($msg, 'errno: 1050')       ||   // table exists
                str_contains($msg, 'errno: 1060')       ||   // column exists
                str_contains($msg, 'errno: 1061')            // key exists
            );

            if ($ignorable) {
                echo "  ℹ️  (ya existía) " . $preview . "\n";
                $ok++;
            } else {
                echo "  ✗ ERROR: " . $msg . "\n";
                echo "    SQL: " . $preview . "\n\n";
                $err++;
            }
        }
    }

    echo "\n" . str_repeat('─', 60) . "\n";
    echo "✅ Completado: $ok OK";
    if ($err) {
        echo " | ⚠️  $err errores";
    }
    echo "\n\n";

    // ── Verificación post-migración ──────────────────────────
    echo "📋 Verificación de tablas creadas:\n";

    $tablas = [
        'exam_tipos', 'exam_tipo_consentimientos',
        'turnero_lugares', 'turnero_prioridades',
        'turnero_sesiones', 'turnero_turnos',
        'turnero_solicitudes', 'turnero_examen_items',
        'turnero_consentimientos',
    ];

    foreach ($tablas as $tabla) {
        try {
            $count = $pdo->query("SELECT COUNT(*) FROM `$tabla`")->fetchColumn();
            echo "  ✓ $tabla ($count filas)\n";
        } catch (PDOException $e) {
            echo "  ✗ $tabla — NO ENCONTRADA\n";
        }
    }

    // Verificar columna tipo en lab_formularios
    try {
        $cols = $pdo->query("SHOW COLUMNS FROM lab_formularios LIKE 'tipo'")->fetchAll();
        if (!empty($cols)) {
            echo "  ✓ lab_formularios.tipo (ENUM)\n";
        } else {
            echo "  ✗ lab_formularios.tipo — NO SE AGREGÓ\n";
        }
    } catch (PDOException $e) {
        echo "  ✗ lab_formularios — " . $e->getMessage() . "\n";
    }

    // Verificar prioridades
    echo "\n🎫 Prioridades insertadas:\n";
    $prios = $pdo->query("SELECT codigo, nombre, color FROM turnero_prioridades ORDER BY orden_peso")->fetchAll(PDO::FETCH_ASSOC);
    foreach ($prios as $p) {
        echo "  [{$p['codigo']}] {$p['nombre']}  {$p['color']}\n";
    }

    // Verificar lugares
    echo "\n📍 Lugares creados:\n";
    $lugares = $pdo->query("SELECT id, nombre FROM turnero_lugares ORDER BY sort_order")->fetchAll(PDO::FETCH_ASSOC);
    foreach ($lugares as $l) {
        echo "  [{$l['id']}] {$l['nombre']}\n";
    }

    // Verificar exámenes de ejemplo
    echo "\n🧪 Tipos de examen de ejemplo:\n";
    $exams = $pdo->query("SELECT codigo, nombre, categoria FROM exam_tipos ORDER BY id")->fetchAll(PDO::FETCH_ASSOC);
    foreach ($exams as $e) {
        echo "  [{$e['codigo']}] {$e['nombre']} — {$e['categoria']}\n";
    }

    echo "\n✅ Migración 003 lista. Continúa con FASE 3.2 (Motor de cola + API).\n\n";

} catch (Exception $e) {
    echo "❌ Error fatal: " . $e->getMessage() . "\n";
    exit(1);
}
