<?php
declare(strict_types=1);
$authApp = 'juicios';
session_start();
require __DIR__ . '/../../config/auth.php';
require dirname(__DIR__, 5) . '/config/db2.php';
require __DIR__ . '/../../lib/helpers.php';

if (!perm('juicios', 'otras_acciones')) { http_response_code(403); exit('Sin permiso'); }

define('DOCS',   dirname(__DIR__, 2) . '/tmp');  // agendaJuicios/tmp/

// ── Descarga del log ──────────────────────────────────────────────────────────
if (($_GET['download'] ?? '') === 'log') {
    $logPath = DOCS . '/import_errors.log';
    if (!file_exists($logPath)) { http_response_code(404); exit('Log no encontrado.'); }
    header('Content-Type: text/plain; charset=UTF-8');
    header('Content-Disposition: attachment; filename="import_errors_' . date('Ymd_Hi') . '.log"');
    header('Content-Length: ' . filesize($logPath));
    readfile($logPath);
    exit;
}
define('PYTHON', 'python3');  // en Windows usar 'python' o ruta completa 'C:\\Python312\\python.exe'

// ── Helper: ejecutar archivo SQL via PDO, sentencia por sentencia ─────────────
function ejecutarSqlArchivo(PDO $pdo, string $path): array {
    $ok = 0; $errs = [];
    $buffer = '';
    foreach (file($path, FILE_IGNORE_NEW_LINES) as $line) {
        $line = trim($line);
        if ($line === '' || str_starts_with($line, '--') || str_starts_with($line, '#')) continue;
        $buffer .= ' ' . $line;
        if (str_ends_with($line, ';')) {
            $sql = trim($buffer); $buffer = '';
            if (!$sql || $sql === ';') continue;
            if (preg_match('/^SELECT\s/i', $sql)) continue;
            try { $pdo->exec($sql); $ok++; }
            catch (PDOException $e) {
                $errs[] = substr($e->getMessage(), 0, 220) . ' | SQL: ' . substr($sql, 0, 120);
            }
        }
    }
    return ['ok' => $ok, 'errores' => $errs];
}

$paginaActual = 'juicios';
require __DIR__ . '/../../config/menu.php';

$step    = 'upload';
$errores = [];
$data    = [];

// ── POST: generar SQL ─────────────────────────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['step'] ?? '') === 'generar') {

    $fecha_corte = trim($_POST['fecha_corte'] ?? '');
    if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $fecha_corte)) {
        $errores[] = 'Fecha de corte inválida.';
    }

    if (empty($errores)) {
        $fu = $_FILES['archivo'] ?? null;
        if (!$fu || $fu['error'] !== UPLOAD_ERR_OK) {
            $errores[] = 'No se recibió ningún archivo o hubo un error al subirlo (código ' . ($fu['error'] ?? '-') . ').';
        } else {
            $ext = strtolower(pathinfo($fu['name'], PATHINFO_EXTENSION));
            if (!in_array($ext, ['xlsx', 'xlsm'])) {
                $errores[] = 'Formato no válido. El generador solo admite .xlsx. Si tiene un archivo .ods, ábralo en Excel o LibreOffice y guárdelo como .xlsx.';
            } elseif (!move_uploaded_file($fu['tmp_name'], DOCS . '/AAyAgendamientos.xlsx')) {
                $errores[] = 'No se pudo guardar el archivo. Verifique permisos de escritura sobre ' . DOCS . '.';
            }
        }
    }

    if (empty($errores)) {
        $xlsxPath = DOCS . '/AAyAgendamientos.xlsx';
        $cmd      = 'cd ' . escapeshellarg(DOCS) . ' && ' . PYTHON . ' ' . escapeshellarg(DOCS . '/gen_sql.py') . ' ' . escapeshellarg($fecha_corte) . ' ' . escapeshellarg($xlsxPath) . ' 2>&1';
        $outLines = []; $retCode = 0;
        exec($cmd, $outLines, $retCode);
        $outTxt = implode("\n", $outLines);

        // Leer log de errores
        $logPath = DOCS . '/import_errors.log';
        $logMeta = []; $logErrs = [];
        if (file_exists($logPath)) {
            $all     = file($logPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            $logMeta = array_slice($all, 0, 2);
            $logErrs = array_slice($all, 2);
        }

        // Parsear estadísticas del output de Python
        $stats = ['autos' => null, 'agendamientos' => null, 'kb' => null];
        if (preg_match('/(\d+)\s*AAs?,\s*(\d+)\s*agendamientos,\s*(\d+)\s*KB/i', $outTxt, $m)) {
            $stats = ['autos' => (int)$m[1], 'agendamientos' => (int)$m[2], 'kb' => (int)$m[3]];
        }

        $data = [
            'fecha_corte' => $fecha_corte,
            'retCode'     => $retCode,
            'outTxt'      => $outTxt,
            'logMeta'     => $logMeta,
            'logErrs'     => $logErrs,
            'stats'       => $stats,
        ];
        $step = 'confirmar';
    }
}

// ── POST: ejecutar importación ────────────────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['step'] ?? '') === 'ejecutar') {
    $borrarPath   = DOCS . '/01_borrar.sql';
    $insertarPath = DOCS . '/02_insertar.sql';

    if (!file_exists($borrarPath) || !file_exists($insertarPath)) {
        $errores[] = 'Archivos SQL no encontrados. Genere el SQL primero.';
    } else {
        try {
            $resBorrar   = ejecutarSqlArchivo($pdo, $borrarPath);
            $resInsertar = ejecutarSqlArchivo($pdo, $insertarPath);

            $statsDB = [];
            foreach (['agj_autos_apertura','agj_agendamientos','agj_aa_litigantes','agj_aa_jueces_ipp'] as $t) {
                $statsDB[$t] = (int)$pdo->query("SELECT COUNT(*) FROM $t")->fetchColumn();
            }

            // Litigantes/jueces que no se encontraron en BD (tabla _nf generada por el SQL)
            $notFound = [];
            try {
                $notFound = $pdo->query(
                    "SELECT tipo, nombre, fila, columna FROM _nf ORDER BY tipo, nombre"
                )->fetchAll(PDO::FETCH_ASSOC);
            } catch (PDOException $e) { /* silencio — tabla puede no existir en SQL viejo */ }

            // Agregar no encontrados al log de errores
            if (!empty($notFound)) {
                $logPath = DOCS . '/import_errors.log';
                $lines   = array_map(
                    fn($r) => '[NO ENCONTRADO] Fila ' . $r['fila'] . ' | Col ' . $r['columna'] . ' | ' . $r['tipo'] . ': ' . $r['nombre'],
                    $notFound
                );
                file_put_contents($logPath, implode("\n", $lines) . "\n", FILE_APPEND);
            }

            $data = [
                'resBorrar'   => $resBorrar,
                'resInsertar' => $resInsertar,
                'statsDB'     => $statsDB,
                'notFound'    => $notFound,
            ];
            $step = 'resultado';
        } catch (PDOException $e) {
            $errores[] = 'Error crítico al ejecutar SQL: ' . $e->getMessage();
        }
    }
}
?>

<div class="ph">
  <div>
    <h1>Importar Agenda de Juicios</h1>
    <div class="bc">OGJ Rosario · <?= date('d/m/Y') ?></div>
  </div>
  <a href="<?= BASE_URL ?>/public/juicios/tablero.php" class="btn btn-g btn-sm">← Tablero</a>
</div>

<?php foreach ($errores as $err): ?>
<div class="msg msg-err"><?= htmlspecialchars($err) ?></div>
<?php endforeach; ?>

<?php if ($step === 'upload'): ?>
<!-- ═══════════════════ PASO 1: Formulario ═══════════════════════════════════ -->
<div class="card">
  <div class="sec">Paso 1 — Seleccionar archivo y fecha de corte</div>

  <div style="background:#fef2f2;border:1px solid #fecaca;border-radius:8px;padding:12px 16px;margin-bottom:20px;font-size:13px;color:#991b1b">
    ⚠ <strong>Atención:</strong> esta importación <strong>borrará todos los datos existentes</strong>
    de autos de apertura, agendamientos y litigantes antes de insertar los nuevos. La operación es irreversible.
  </div>

  <form method="POST" enctype="multipart/form-data">
    <input type="hidden" name="step" value="generar">
    <div style="display:flex;flex-direction:column;gap:18px;max-width:540px">

      <div>
        <label style="display:block;font-size:13px;font-weight:600;color:#374151;margin-bottom:6px">
          Archivo de agenda
        </label>
        <input type="file" name="archivo" accept=".xlsx,.xlsm" required
               style="font-size:13px">
        <div style="font-size:11px;color:#64748b;margin-top:4px">
          Solo <strong>.xlsx</strong> — el generador usa openpyxl que no soporta .ods.
          Si tiene ODS: abrir en Excel o LibreOffice → Guardar como .xlsx.
        </div>
      </div>

      <div>
        <label style="display:block;font-size:13px;font-weight:600;color:#374151;margin-bottom:6px">
          Fecha de corte
        </label>
        <input type="date" name="fecha_corte" value="<?= date('Y') . '-12-31' ?>" required
               style="padding:6px 10px;border:1px solid #d1d5db;border-radius:5px;font-size:13px">
        <div style="font-size:11px;color:#64748b;margin-top:4px">
          Solo se importarán agendamientos con fecha de debate ≤ esta fecha
        </div>
      </div>

      <div>
        <button type="submit" class="btn btn-p">Generar SQL →</button>
      </div>

    </div>
  </form>
</div>

<?php elseif ($step === 'confirmar'): ?>
<!-- ═══════════════════ PASO 2: Resultados de generación ═════════════════════ -->
<?php
$retCode = $data['retCode'];
$stats   = $data['stats'];
$logErrs = $data['logErrs'];
$logMeta = $data['logMeta'];
$outTxt  = $data['outTxt'];
?>

<div class="card">
  <div class="sec">Paso 2 — Resultado de la generación</div>

  <?php if ($retCode !== 0): ?>
  <div class="msg msg-err">
    Error al ejecutar gen_sql.py (código <?= $retCode ?>):<br>
    <pre style="font-size:12px;margin-top:8px;white-space:pre-wrap"><?= htmlspecialchars($outTxt) ?></pre>
  </div>
  <a href="importarAgenda.php" class="btn btn-g">← Volver</a>

  <?php else: ?>

  <!-- Stats de generación -->
  <div style="display:flex;gap:12px;flex-wrap:wrap;margin-bottom:20px">
    <?php
    $statItems = [
        ['Autos de Apertura', $stats['autos'] ?? '?', '#2563eb'],
        ['Agendamientos',     $stats['agendamientos'] ?? '?', '#7c3aed'],
        ['Tamaño SQL',        ($stats['kb'] ?? '?') . ' KB', '#0891b2'],
    ];
    foreach ($statItems as [$lbl, $val, $col]):
    ?>
    <div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 20px;min-width:130px;text-align:center">
      <div style="font-size:22px;font-weight:700;color:<?= $col ?>"><?= htmlspecialchars((string)$val) ?></div>
      <div style="font-size:12px;color:#64748b;margin-top:2px"><?= $lbl ?></div>
    </div>
    <?php endforeach; ?>
    <div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 20px;min-width:130px;text-align:center">
      <div style="font-size:22px;font-weight:700;color:<?= $logErrs ? '#dc2626' : '#16a34a' ?>"><?= count($logErrs) ?></div>
      <div style="font-size:12px;color:#64748b;margin-top:2px">Filas con errores</div>
    </div>
  </div>

  <!-- Fecha de generación -->
  <?php if ($logMeta): ?>
  <div style="font-size:12px;color:#64748b;margin-bottom:12px">
    <?= htmlspecialchars(implode(' · ', $logMeta)) ?>
  </div>
  <?php endif; ?>

  <!-- Errores de filas -->
  <?php if ($logErrs): ?>
  <div style="margin-bottom:20px">
    <div style="font-size:13px;font-weight:600;color:#dc2626;margin-bottom:8px">
      Filas con datos faltantes o litigantes no encontrados (<?= count($logErrs) ?>):
    </div>
    <div style="background:#fef2f2;border:1px solid #fecaca;border-radius:6px;padding:10px 14px;
                max-height:260px;overflow-y:auto;font-size:12px;font-family:monospace;line-height:1.6">
      <?php foreach ($logErrs as $err): ?>
      <div><?= htmlspecialchars($err) ?></div>
      <?php endforeach; ?>
    </div>
    <div style="font-size:11px;color:#64748b;margin-top:6px">
      Estas filas fueron ignoradas. Las demás se importarán correctamente.
    </div>
  </div>
  <?php else: ?>
  <div class="msg msg-ok" style="margin-bottom:20px">✓ Sin errores de generación</div>
  <?php endif; ?>

  <!-- Confirmación -->
  <div style="background:#fffbeb;border:1px solid #fde68a;border-radius:8px;padding:14px 16px;margin-bottom:20px;font-size:13px">
    <strong>¿Ejecutar la importación?</strong><br>
    Esto borrará <strong>todos los datos actuales</strong> de autos, agendamientos y litigantes
    e insertará los <?= htmlspecialchars((string)($stats['autos'] ?? '?')) ?> AAs
    y <?= htmlspecialchars((string)($stats['agendamientos'] ?? '?')) ?> agendamientos generados.
    <strong>La operación es irreversible.</strong>
  </div>

  <div style="display:flex;gap:10px;align-items:center">
    <form method="POST">
      <input type="hidden" name="step" value="ejecutar">
      <button type="submit" class="btn btn-r"
              onclick="return confirm('¿Confirmar? Se borrarán TODOS los datos existentes y se importarán los nuevos.')">
        Importar ahora
      </button>
    </form>
    <a href="importarAgenda.php" class="btn btn-g">Cancelar</a>
  </div>

  <?php endif; ?>
</div>

<?php elseif ($step === 'resultado'): ?>
<!-- ═══════════════════ PASO 3: Resultado de la importación ══════════════════ -->
<?php
$resBorrar   = $data['resBorrar'];
$resInsertar = $data['resInsertar'];
$statsDB     = $data['statsDB'];
$notFound    = $data['notFound'] ?? [];
$totalErrs   = count($resBorrar['errores']) + count($resInsertar['errores']);
?>

<div class="card">
  <div class="sec">Paso 3 — Importación completada</div>

  <?php if ($totalErrs === 0): ?>
  <div class="msg msg-ok">✓ Importación ejecutada sin errores</div>
  <?php else: ?>
  <div class="msg msg-err">
    Se produjeron <?= $totalErrs ?> error<?= $totalErrs === 1 ? '' : 'es' ?> durante la ejecución.
  </div>
  <?php endif; ?>

  <!-- Conteos en BD -->
  <div style="margin:20px 0">
    <div style="font-size:13px;font-weight:600;color:#374151;margin-bottom:10px">Registros en base de datos:</div>
    <div style="display:flex;gap:10px;flex-wrap:wrap">
      <?php
      $dbLabels = [
          'agj_autos_apertura' => ['Autos de Apertura', '#2563eb'],
          'agj_agendamientos'  => ['Agendamientos',     '#7c3aed'],
          'agj_aa_litigantes'  => ['Litigantes',        '#0891b2'],
          'agj_aa_jueces_ipp'  => ['Jueces IPP',        '#16a34a'],
      ];
      foreach ($dbLabels as $tabla => [$lbl, $col]):
      ?>
      <div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:12px 18px;text-align:center;min-width:120px">
        <div style="font-size:22px;font-weight:700;color:<?= $col ?>"><?= $statsDB[$tabla] ?? 0 ?></div>
        <div style="font-size:11px;color:#64748b;margin-top:2px"><?= $lbl ?></div>
      </div>
      <?php endforeach; ?>
    </div>
  </div>

  <!-- Errores SQL si los hubo -->
  <?php if ($totalErrs > 0): ?>
  <div style="margin-bottom:16px">
    <div style="font-size:13px;font-weight:600;color:#dc2626;margin-bottom:8px">Detalle de errores SQL:</div>
    <div style="background:#fef2f2;border:1px solid #fecaca;border-radius:6px;padding:10px 14px;
                max-height:220px;overflow-y:auto;font-size:12px;font-family:monospace;line-height:1.6">
      <?php foreach (array_merge($resBorrar['errores'], $resInsertar['errores']) as $e): ?>
      <div><?= htmlspecialchars($e) ?></div>
      <?php endforeach; ?>
    </div>
  </div>
  <?php endif; ?>

  <!-- Litigantes/jueces no encontrados en BD -->
  <?php if (!empty($notFound)): ?>
  <div style="margin-bottom:16px">
    <div style="font-size:13px;font-weight:600;color:#d97706;margin-bottom:8px">
      Litigantes/jueces no encontrados en la base (<?= count($notFound) ?>):
    </div>
    <div style="background:#fffbeb;border:1px solid #fde68a;border-radius:6px;padding:10px 14px;
                max-height:220px;overflow-y:auto;font-size:12px;font-family:monospace;line-height:1.6">
      <?php foreach ($notFound as $nf): ?>
      <div><?= htmlspecialchars($nf['tipo']) ?>: <?= htmlspecialchars($nf['nombre']) ?> <span style="color:#94a3b8">(fila <?= (int)$nf['fila'] ?>, col <?= htmlspecialchars($nf['columna']) ?>)</span></div>
      <?php endforeach; ?>
    </div>
    <div style="font-size:11px;color:#64748b;margin-top:6px">
      Estos nombres no se encontraron en mrbs_juez / v_litigantes. Los registros afectados se importaron sin ese dato. También fueron agregados a import_errors.log.
    </div>
  </div>
  <?php endif; ?>

  <div style="display:flex;gap:10px;flex-wrap:wrap">
    <a href="<?= BASE_URL ?>/public/juicios/tablero.php" class="btn btn-p">Ir al Tablero</a>
    <a href="importarAgenda.php" class="btn btn-g">Nueva importación</a>
    <?php if (file_exists(DOCS . '/import_errors.log')): ?>
    <a href="importarAgenda.php?download=log" class="btn btn-i">Descargar log de errores</a>
    <?php endif; ?>
  </div>
</div>

<?php endif; ?>

</div></body></html>
