<?php
declare(strict_types=1);

require_once __DIR__ . '/../../app/bootstrap.php';
require_login();

if (!(has_role('ADMIN') || has_role('DIRECTOR') || has_role('SECRETARIA'))) {
    http_response_code(403);
    die('Acceso no permitido');
}

require_once __DIR__ . '/../../app/services/biometricos/BiometricoFacade.php';

$pdo = db();
$selfUrl = '/Comercio/public/asistencia/sincronizar_nomina.php';

function h($v): string {
    return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');
}

function norm_str($v): string {
    return trim((string)$v);
}

function normalize_ci(string $ci): string {
    $ci = trim($ci);
    $ci = preg_replace('/\s+/', '', $ci);
    return (string)$ci;
}

function extract_device_user_id(array $item): string {
    $candidatos = [
        $item['device_user_id'] ?? null,
        $item['userid'] ?? null,
        $item['user_id'] ?? null,
        $item['ci'] ?? null,
        $item['pin'] ?? null,
        $item['id'] ?? null,
    ];

    foreach ($candidatos as $v) {
        $v = normalize_ci(norm_str($v));
        if ($v !== '') {
            return $v;
        }
    }
    return '';
}

function extract_nombre(array $item): string {
    $candidatos = [
        $item['nombre'] ?? null,
        $item['name'] ?? null,
        $item['employee_name'] ?? null,
        $item['person_name'] ?? null,
    ];

    foreach ($candidatos as $v) {
        $v = norm_str($v);
        if ($v !== '') {
            return $v;
        }
    }
    return '';
}

function extract_empleado_no(array $item): string {
    $candidatos = [
        $item['empleado_no'] ?? null,
        $item['emp_code'] ?? null,
        $item['employee_no'] ?? null,
        $item['staff_no'] ?? null,
    ];

    foreach ($candidatos as $v) {
        $v = norm_str($v);
        if ($v !== '') {
            return $v;
        }
    }
    return '';
}

function unique_non_empty(array $values): array {
    $out = [];
    foreach ($values as $v) {
        $v = trim((string)$v);
        if ($v !== '') {
            $out[$v] = $v;
        }
    }
    return array_values($out);
}

function in_placeholders(array $vals): array {
    $vals = array_values($vals);
    if (!$vals) {
        return ['', []];
    }
    return [implode(',', array_fill(0, count($vals), '?')), $vals];
}

function flash_set(string $key, string $val): void {
    start_session();
    $_SESSION['flash'][$key] = $val;
}

function flash_get(string $key): ?string {
    start_session();
    if (!isset($_SESSION['flash'][$key])) {
        return null;
    }
    $v = (string)$_SESSION['flash'][$key];
    unset($_SESSION['flash'][$key]);
    return $v;
}

function redirect_self(string $selfUrl, array $params): void {
    header('Location: ' . $selfUrl . '?' . http_build_query($params));
    exit;
}

function safe_rows(PDO $pdo, string $sql, array $params = [], int $mode = PDO::FETCH_ASSOC): array {
    try {
        $st = $pdo->prepare($sql);
        $st->execute($params);
        return $st->fetchAll($mode) ?: [];
    } catch (Throwable $e) {
        return [];
    }
}

$relojId = (int)($_REQUEST['reloj_id'] ?? 0);
if ($relojId <= 0) {
    die('Reloj inválido');
}

$institucion = trim((string)($_REQUEST['institucion'] ?? 'ENC'));
$anio        = (int)($_REQUEST['anio'] ?? (int)date('Y'));
$turno       = trim((string)($_REQUEST['turno'] ?? 'Noche'));
$nivel       = trim((string)($_REQUEST['nivel'] ?? ''));
$curso       = trim((string)($_REQUEST['curso'] ?? ''));
$seccion     = trim((string)($_REQUEST['seccion'] ?? 'A'));
$q           = trim((string)($_REQUEST['q'] ?? ''));
$soloPend     = (int)($_REQUEST['solo_pendientes'] ?? 0);

if ($institucion === '') $institucion = 'ENC';
if ($seccion === '') $seccion = 'A';

$facade = new BiometricoFacade();

/* ============================================================
   CATÁLOGOS
============================================================ */
$instituciones = safe_rows(
    $pdo,
    "SELECT DISTINCT institucion FROM cursos WHERE activo = 1 ORDER BY institucion",
    [],
    PDO::FETCH_COLUMN
);

if (!empty($instituciones) && !in_array($institucion, array_map('strval', $instituciones), true)) {
    $institucion = (string)$instituciones[0];
}

$niveles = safe_rows(
    $pdo,
    "SELECT DISTINCT nivel
     FROM cursos
     WHERE activo = 1
       AND institucion = ?
     ORDER BY nivel",
    [$institucion],
    PDO::FETCH_COLUMN
);

if ($nivel === '' && !empty($niveles)) {
    $nivel = (string)$niveles[0];
}

$cursosTxt = [];
if ($nivel !== '') {
    $st = $pdo->prepare("
        SELECT nombre
        FROM cursos
        WHERE activo = 1
          AND institucion = ?
          AND nivel = ?
        ORDER BY orden, nombre
    ");
    $st->execute([$institucion, $nivel]);
    $cursosTxt = $st->fetchAll(PDO::FETCH_COLUMN) ?: [];
}

if ($curso === '' && !empty($cursosTxt)) {
    $curso = (string)$cursosTxt[0];
}

$secciones = safe_rows(
    $pdo,
    "SELECT nombre FROM secciones WHERE activo = 1 ORDER BY nombre",
    [],
    PDO::FETCH_COLUMN
);

if ($seccion === '' && !empty($secciones)) {
    $seccion = (string)$secciones[0];
}

/* ============================================================
   POST
============================================================ */
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    csrf_check();

    $action = (string)($_POST['action'] ?? '');

    $relojIdP      = (int)($_POST['reloj_id'] ?? $relojId);
    $institucionP  = trim((string)($_POST['institucion'] ?? $institucion));
    $anioP         = (int)($_POST['anio'] ?? $anio);
    $turnoP        = trim((string)($_POST['turno'] ?? $turno));
    $nivelP        = trim((string)($_POST['nivel'] ?? $nivel));
    $cursoP        = trim((string)($_POST['curso'] ?? $curso));
    $seccionP      = trim((string)($_POST['seccion'] ?? $seccion));
    $qP            = trim((string)($_POST['q'] ?? $q));
    $soloPendP     = (int)($_POST['solo_pendientes'] ?? $soloPend);

    $redirectParams = [
        'reloj_id'         => $relojIdP,
        'institucion'      => $institucionP,
        'anio'             => $anioP,
        'turno'            => $turnoP,
        'nivel'            => $nivelP,
        'curso'            => $cursoP,
        'seccion'          => $seccionP,
        'q'                => $qP,
        'solo_pendientes'  => $soloPendP,
    ];

    try {
        if ($action === 'enviar_matriculados_seleccionados') {
            $seleccionados = $_POST['seleccionados'] ?? [];
            if (!is_array($seleccionados) || empty($seleccionados)) {
                throw new RuntimeException('No seleccionaste alumnos para enviar al reloj.');
            }

            $ids = array_values(array_filter(array_map('intval', $seleccionados), fn($x) => $x > 0));
            if (!$ids) {
                throw new RuntimeException('La selección es inválida.');
            }

            $ph = implode(',', array_fill(0, count($ids), '?'));
            $st = $pdo->prepare("
                SELECT id, ci, nombres, apellidos
                FROM estudiantes
                WHERE id IN ($ph)
            ");
            $st->execute($ids);
            $rows = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];

            $ok = 0;
            $ya = 0;
            $errCount = 0;
            $sinCi = 0;

            foreach ($rows as $est) {
                $ci = normalize_ci((string)($est['ci'] ?? ''));
                if ($ci === '') {
                    $sinCi++;
                    continue;
                }

                $envio = $facade->enviarEstudianteExistenteAlReloj($relojIdP, $est);

                if (!empty($envio['ok'])) {
                    if (!empty($envio['resultado']['already_exists']) || !empty($envio['already_exists'])) {
                        $ya++;
                    } else {
                        $ok++;
                    }
                } else {
                    $errCount++;
                }
            }

            flash_set('msg', "✅ Envío completado. Nuevos enviados: {$ok}. Ya existentes: {$ya}. Sin CI: {$sinCi}. Errores: {$errCount}.");
            redirect_self($selfUrl, $redirectParams);
        }

        if ($action === 'enviar_pendientes_del_filtro') {
            if ($nivelP === '' || $cursoP === '') {
                throw new RuntimeException('Debes elegir nivel y curso.');
            }

            $st = $pdo->prepare("
                SELECT DISTINCT
                    e.id,
                    e.ci,
                    e.nombres,
                    e.apellidos
                FROM matriculas m
                JOIN estudiantes e ON e.id = m.estudiante_id
                WHERE m.institucion = ?
                  AND m.anio_lectivo = ?
                  AND m.nivel = ?
                  AND m.curso = ?
                  AND COALESCE(m.seccion, 'A') = ?
                  AND m.turno = ?
                  AND m.estado = 'ACTIVO'
                  AND e.activo = 1
                ORDER BY e.nombres
            ");
            $st->execute([$institucionP, $anioP, $nivelP, $cursoP, $seccionP, $turnoP]);
            $rows = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];

            if (!$rows) {
                throw new RuntimeException('No hay matriculados activos en ese filtro.');
            }

            $dataTmp = $facade->sincronizarNomina($relojIdP);
            if (empty($dataTmp['reloj'])) {
                throw new RuntimeException($dataTmp['error'] ?? 'No se pudo consultar el reloj.');
            }

            $nominaLive = is_array($dataTmp['nomina'] ?? null) ? $dataTmp['nomina'] : [];
            $deviceLiveByCi = [];
            foreach ($nominaLive as $item) {
                if (!is_array($item)) continue;
                $ciLive = extract_device_user_id($item);
                if ($ciLive !== '') {
                    $deviceLiveByCi[$ciLive] = $item;
                }
            }

            $cis = [];
            foreach ($rows as $r) {
                $ci = normalize_ci((string)($r['ci'] ?? ''));
                if ($ci !== '') $cis[] = $ci;
            }
            $cis = unique_non_empty($cis);

            $guardados = [];
            if ($cis) {
                [$ph2, $args2] = in_placeholders($cis);
                $stG = $pdo->prepare("
                    SELECT device_user_id
                    FROM reloj_nomina
                    WHERE reloj_id = ?
                      AND device_user_id IN ($ph2)
                ");
                $stG->execute(array_merge([$relojIdP], $args2));
                foreach ($stG->fetchAll(PDO::FETCH_COLUMN) ?: [] as $duid) {
                    $guardados[normalize_ci((string)$duid)] = true;
                }
            }

            $ok = 0;
            $ya = 0;
            $errCount = 0;
            $sinCi = 0;
            $omitidos = 0;

            foreach ($rows as $est) {
                $ci = normalize_ci((string)($est['ci'] ?? ''));
                if ($ci === '') {
                    $sinCi++;
                    continue;
                }

                if (isset($deviceLiveByCi[$ci]) || isset($guardados[$ci])) {
                    $omitidos++;
                    continue;
                }

                $envio = $facade->enviarEstudianteExistenteAlReloj($relojIdP, $est);
                if (!empty($envio['ok'])) {
                    if (!empty($envio['resultado']['already_exists']) || !empty($envio['already_exists'])) {
                        $ya++;
                    } else {
                        $ok++;
                    }
                } else {
                    $errCount++;
                }
            }

            flash_set('msg', "✅ Pendientes procesados. Nuevos enviados: {$ok}. Ya existentes: {$ya}. Omitidos por ya estar detectados: {$omitidos}. Sin CI: {$sinCi}. Errores: {$errCount}.");
            redirect_self($selfUrl, $redirectParams);
        }

    } catch (Throwable $e) {
        flash_set('err', '❌ ' . $e->getMessage());
        redirect_self($selfUrl, $redirectParams);
    }
}

/* ============================================================
   GET: consultar reloj
============================================================ */
$data = $facade->sincronizarNomina($relojId);

if (empty($data['reloj'])) {
    die($data['error'] ?? 'Error al sincronizar nómina');
}

$reloj = $data['reloj'];
$nomina = is_array($data['nomina'] ?? null) ? $data['nomina'] : [];

$deviceLiveByCi = [];
$deviceIds = [];

foreach ($nomina as $item) {
    if (!is_array($item)) continue;
    $duid = extract_device_user_id($item);
    if ($duid !== '') {
        $deviceIds[] = $duid;
        $deviceLiveByCi[$duid] = $item;
    }
}
$deviceIds = unique_non_empty($deviceIds);

/* ============================================================
   reloj_nomina guardado local
============================================================ */
$nominaGuardadaPorDevice = [];
if ($deviceIds) {
    [$ph, $args] = in_placeholders($deviceIds);
    $sql = "
        SELECT id, reloj_id, device_user_id, nombre, empleado_no, actualizado_en
        FROM reloj_nomina
        WHERE reloj_id = ?
          AND device_user_id IN ($ph)
    ";
    $st = $pdo->prepare($sql);
    $st->execute(array_merge([$relojId], $args));
    foreach ($st->fetchAll(PDO::FETCH_ASSOC) ?: [] as $row) {
        $duid = normalize_ci((string)($row['device_user_id'] ?? ''));
        if ($duid !== '') {
            $nominaGuardadaPorDevice[$duid] = $row;
        }
    }
}

/* ============================================================
   Matriculados del curso seleccionado
============================================================ */
$matriculadosCurso = [];
if ($nivel !== '' && $curso !== '') {
    $st = $pdo->prepare("
        SELECT DISTINCT
            m.id AS matricula_id,
            m.institucion,
            m.anio_lectivo,
            m.nivel,
            m.curso,
            COALESCE(m.seccion, 'A') AS seccion,
            m.turno,
            e.id AS estudiante_id,
            e.ci,
            e.nombres,
            e.apellidos,
            e.activo
        FROM matriculas m
        JOIN estudiantes e ON e.id = m.estudiante_id
        WHERE m.institucion = ?
          AND m.anio_lectivo = ?
          AND m.nivel = ?
          AND m.curso = ?
          AND COALESCE(m.seccion, 'A') = ?
          AND m.turno = ?
          AND m.estado = 'ACTIVO'
          AND e.activo = 1
        ORDER BY e.nombres
    ");
    $st->execute([$institucion, $anio, $nivel, $curso, $seccion, $turno]);
    $matriculadosCurso = $st->fetchAll(PDO::FETCH_ASSOC) ?: [];
}

/* ============================================================
   Filas del curso con estado de reloj
============================================================ */
$filasCurso = [];
$resumenCurso = [
    'total' => 0,
    'en_reloj' => 0,
    'guardado_local' => 0,
    'pendientes' => 0,
    'sin_ci' => 0,
];

foreach ($matriculadosCurso as $row) {
    $ci = normalize_ci((string)($row['ci'] ?? ''));
    $enRelojLive = ($ci !== '' && isset($deviceLiveByCi[$ci]));
    $enRelojGuardado = ($ci !== '' && isset($nominaGuardadaPorDevice[$ci]));

    if ($ci === '') {
        $estadoReloj = 'SIN_CI';
    } elseif ($enRelojLive && $enRelojGuardado) {
        $estadoReloj = 'EN_RELOJ_Y_GUARDADO';
    } elseif ($enRelojLive) {
        $estadoReloj = 'EN_RELOJ';
    } elseif ($enRelojGuardado) {
        $estadoReloj = 'GUARDADO_LOCAL';
    } else {
        $estadoReloj = 'PENDIENTE';
    }

    $searchIndex = mb_strtolower(trim(
        ($row['ci'] ?? '') . ' ' .
        ($row['nombres'] ?? '') . ' ' .
        ($row['apellidos'] ?? '') . ' ' .
        ($row['nivel'] ?? '') . ' ' .
        ($row['curso'] ?? '') . ' ' .
        ($row['seccion'] ?? '') . ' ' .
        ($row['turno'] ?? '') . ' ' .
        $estadoReloj
    ));

    $item = [
        'matricula_id'       => (int)$row['matricula_id'],
        'estudiante_id'      => (int)$row['estudiante_id'],
        'ci'                 => $ci,
        'nombres'            => (string)($row['nombres'] ?? ''),
        'apellidos'          => (string)($row['apellidos'] ?? ''),
        'institucion'        => (string)($row['institucion'] ?? ''),
        'anio_lectivo'       => (int)($row['anio_lectivo'] ?? 0),
        'nivel'              => (string)($row['nivel'] ?? ''),
        'curso'              => (string)($row['curso'] ?? ''),
        'seccion'            => (string)($row['seccion'] ?? 'A'),
        'turno'              => (string)($row['turno'] ?? ''),
        'estado_reloj'       => $estadoReloj,
        'en_reloj_live'      => $enRelojLive,
        'en_reloj_guardado'  => $enRelojGuardado,
        'search_index'       => $searchIndex,
    ];

    if ($soloPend === 1 && $estadoReloj !== 'PENDIENTE') {
        continue;
    }

    if ($q !== '' && mb_stripos($searchIndex, mb_strtolower($q)) === false) {
        continue;
    }

    $filasCurso[] = $item;

    $resumenCurso['total']++;
    if ($estadoReloj === 'SIN_CI') $resumenCurso['sin_ci']++;
    if ($estadoReloj === 'PENDIENTE') $resumenCurso['pendientes']++;
    if ($estadoReloj === 'GUARDADO_LOCAL') $resumenCurso['guardado_local']++;
    if ($estadoReloj === 'EN_RELOJ' || $estadoReloj === 'EN_RELOJ_Y_GUARDADO') $resumenCurso['en_reloj']++;
}

/* ============================================================
   Personas del reloj que no existen en estudiantes
============================================================ */
$estudiantesPorCi = [];
if ($deviceIds) {
    [$ph, $args] = in_placeholders($deviceIds);
    $sql = "
        SELECT id, ci, nombres, apellidos, activo
        FROM estudiantes
        WHERE ci IN ($ph)
    ";
    $st = $pdo->prepare($sql);
    $st->execute($args);
    foreach ($st->fetchAll(PDO::FETCH_ASSOC) ?: [] as $row) {
        $ci = normalize_ci((string)($row['ci'] ?? ''));
        if ($ci !== '') {
            $estudiantesPorCi[$ci] = $row;
        }
    }
}

$soloReloj = [];
foreach ($nomina as $item) {
    if (!is_array($item)) continue;

    $ci = extract_device_user_id($item);
    $nombre = extract_nombre($item);
    $empleadoNo = extract_empleado_no($item);

    if ($ci === '') continue;
    if (isset($estudiantesPorCi[$ci])) continue;

    $soloReloj[] = [
        'ci' => $ci,
        'nombre' => $nombre,
        'empleado_no' => $empleadoNo,
    ];
}

$err = flash_get('err');
$msg = flash_get('msg');

$title = 'Sincronizar nómina';
include __DIR__ . '/../../app/views/header.php';
?>

<style>
  :root{
    --brand-blue:#0d6efd;
    --brand-blue-2:#0b5ed7;
    --ok:#198754;
    --warn:#f59f00;
    --danger:#dc3545;
    --muted:#6c757d;
  }

  .card-pro{
    border-radius:18px;
    border:1px solid rgba(0,0,0,.06);
    background:#fff;
    box-shadow:0 8px 22px rgba(0,0,0,.04);
  }

  .soft-table{
    border-radius:16px;
    overflow:hidden;
    border:1px solid rgba(0,0,0,.06);
  }

  .soft-table thead th{
    background:#f8f9fa;
    font-size:.84rem;
    color:#6c757d;
    font-weight:900;
    letter-spacing:.2px;
    white-space:nowrap;
  }

  .chip{
    display:inline-flex;
    align-items:center;
    gap:6px;
    padding:6px 10px;
    border-radius:999px;
    font-size:.85rem;
    border:1px solid rgba(0,0,0,.08);
    background:#fff;
  }

  .badge-pill{
    display:inline-flex;
    align-items:center;
    justify-content:center;
    border-radius:999px;
    padding:5px 10px;
    font-size:.78rem;
    font-weight:800;
  }

  .badge-ok{
    background:rgba(25,135,84,.14);
    color:var(--ok);
  }

  .badge-warn{
    background:rgba(245,159,0,.16);
    color:#8a5a00;
  }

  .badge-muted{
    background:rgba(108,117,125,.14);
    color:#495057;
  }

  .badge-danger-soft{
    background:rgba(220,53,69,.12);
    color:var(--danger);
  }

  .mini{
    font-size:.86rem;
    color:#6c757d;
  }

  .row-hidden{
    display:none !important;
  }
</style>

<div class="d-flex justify-content-between align-items-start flex-wrap gap-2 mb-3">
  <div>
    <h1 class="h5 mb-1">Sincronizar nómina al reloj</h1>
    <div class="text-muted small">
      Vista principal basada en <b>estudiantes matriculados del sistema</b>. Ideal para enviar al reloj solo los nuevos del curso.
    </div>
  </div>
  <div class="d-flex gap-2">
    <a class="btn btn-outline-secondary btn-sm" href="/Comercio/public/dashboard.php">
      <i class="bi bi-arrow-left"></i> Volver
    </a>
  </div>
</div>

<?php if ($err): ?>
  <div class="alert alert-danger"><?= h($err) ?></div>
<?php endif; ?>

<?php if ($msg): ?>
  <div class="alert alert-info"><?= h($msg) ?></div>
<?php endif; ?>

<div class="card-pro p-3 mb-3">
  <div class="row g-2 align-items-end">
    <div class="col-12 col-md-3">
      <label class="form-label">Reloj</label>
      <input type="text" class="form-control" value="<?= h($reloj['nombre'] ?? ('Reloj #' . $relojId)) ?>" readonly>
    </div>
    <div class="col-12 col-md-3">
      <label class="form-label">Estado conexión</label>
      <input type="text" class="form-control" value="<?= h($reloj['estado'] ?? 'Disponible') ?>" readonly>
    </div>
    <div class="col-12 col-md-3">
      <label class="form-label">Registros detectados en reloj</label>
      <input type="text" class="form-control" value="<?= (int)count($nomina) ?>" readonly>
    </div>
    <div class="col-12 col-md-3">
      <label class="form-label">ID reloj</label>
      <input type="text" class="form-control" value="<?= (int)$relojId ?>" readonly>
    </div>
  </div>
</div>

<div class="card-pro p-3 mb-3">
  <form method="get" class="row g-2 align-items-end">
    <input type="hidden" name="reloj_id" value="<?= (int)$relojId ?>">

    <div class="col-6 col-md-2">
      <label class="form-label">Institución</label>
      <select class="form-select" name="institucion" onchange="this.form.submit()">
        <?php foreach ($instituciones as $inst): ?>
          <option value="<?= h((string)$inst) ?>" <?= $institucion === (string)$inst ? 'selected' : '' ?>>
            <?= h((string)$inst) ?>
          </option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="col-6 col-md-2">
      <label class="form-label">Año</label>
      <input class="form-control" type="number" name="anio" value="<?= (int)$anio ?>">
    </div>

    <div class="col-6 col-md-2">
      <label class="form-label">Turno</label>
      <select class="form-select" name="turno">
        <?php foreach (['Noche', 'Mañana', 'Tarde'] as $t): ?>
          <option value="<?= h($t) ?>" <?= $turno === $t ? 'selected' : '' ?>><?= h($t) ?></option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="col-12 col-md-2">
      <label class="form-label">Nivel</label>
      <select class="form-select" name="nivel" onchange="this.form.submit()">
        <?php foreach ($niveles as $n): ?>
          <option value="<?= h((string)$n) ?>" <?= $nivel === (string)$n ? 'selected' : '' ?>>
            <?= h((string)$n) ?>
          </option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="col-12 col-md-2">
      <label class="form-label">Curso</label>
      <select class="form-select" name="curso" onchange="this.form.submit()">
        <?php foreach ($cursosTxt as $c): ?>
          <option value="<?= h((string)$c) ?>" <?= $curso === (string)$c ? 'selected' : '' ?>>
            <?= h((string)$c) ?>
          </option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="col-6 col-md-1">
      <label class="form-label">Sección</label>
      <select class="form-select" name="seccion">
        <?php foreach ($secciones as $s): ?>
          <option value="<?= h((string)$s) ?>" <?= $seccion === (string)$s ? 'selected' : '' ?>>
            <?= h((string)$s) ?>
          </option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="col-6 col-md-1">
      <label class="form-label">Pend.</label>
      <select class="form-select" name="solo_pendientes">
        <option value="0" <?= $soloPend === 0 ? 'selected' : '' ?>>Todos</option>
        <option value="1" <?= $soloPend === 1 ? 'selected' : '' ?>>Solo pend.</option>
      </select>
    </div>

    <div class="col-12 col-lg-8">
      <label class="form-label">Buscar</label>
      <input
        type="text"
        class="form-control"
        name="q"
        value="<?= h($q) ?>"
        placeholder="CI, nombre, apellido, estado..."
      >
    </div>

    <div class="col-12 col-lg-4 d-flex gap-2">
      <button class="btn btn-primary w-100" type="submit">
        <i class="bi bi-funnel me-1"></i>Aplicar filtro
      </button>
      <a class="btn btn-outline-secondary" href="<?= h($selfUrl . '?reloj_id=' . $relojId) ?>">Limpiar</a>
    </div>
  </form>

  <div class="d-flex flex-wrap gap-2 mt-3 align-items-center">
    <span class="chip"><i class="bi bi-building"></i> Institución: <b><?= h($institucion) ?></b></span>
    <span class="chip"><i class="bi bi-mortarboard"></i> Curso: <b><?= h($nivel . ' / ' . $curso . ' / ' . $seccion . ' / ' . $turno) ?></b></span>
    <span class="chip"><i class="bi bi-people"></i> Matriculados visibles: <b><?= (int)$resumenCurso['total'] ?></b></span>
    <span class="chip"><i class="bi bi-clock-history"></i> Pendientes: <b><?= (int)$resumenCurso['pendientes'] ?></b></span>
    <span class="chip"><i class="bi bi-check-circle"></i> En reloj: <b><?= (int)$resumenCurso['en_reloj'] ?></b></span>
    <span class="chip"><i class="bi bi-database-check"></i> Guardado local: <b><?= (int)$resumenCurso['guardado_local'] ?></b></span>
    <span class="chip"><i class="bi bi-exclamation-triangle"></i> Sin CI: <b><?= (int)$resumenCurso['sin_ci'] ?></b></span>
  </div>
</div>

<div class="row g-3">
  <div class="col-12 col-xl-8">
    <div class="card-pro p-3">
      <div class="d-flex justify-content-between align-items-center mb-3 flex-wrap gap-2">
        <div>
          <div class="fw-bold">Matriculados del curso</div>
          <div class="mini">Esta es la vista principal para enviar alumnos del sistema al reloj.</div>
        </div>

        <form method="post" class="d-flex gap-2 flex-wrap">
          <input type="hidden" name="csrf" value="<?= h(csrf_token()) ?>">
          <input type="hidden" name="action" value="enviar_pendientes_del_filtro">
          <input type="hidden" name="reloj_id" value="<?= (int)$relojId ?>">
          <input type="hidden" name="institucion" value="<?= h($institucion) ?>">
          <input type="hidden" name="anio" value="<?= (int)$anio ?>">
          <input type="hidden" name="turno" value="<?= h($turno) ?>">
          <input type="hidden" name="nivel" value="<?= h($nivel) ?>">
          <input type="hidden" name="curso" value="<?= h($curso) ?>">
          <input type="hidden" name="seccion" value="<?= h($seccion) ?>">
          <input type="hidden" name="q" value="<?= h($q) ?>">
          <input type="hidden" name="solo_pendientes" value="<?= (int)$soloPend ?>">
          <button class="btn btn-outline-primary" type="submit">
            <i class="bi bi-send me-1"></i>Enviar pendientes del filtro
          </button>
        </form>
      </div>

      <?php if (empty($filasCurso)): ?>
        <div class="text-muted">No hay alumnos matriculados con este filtro.</div>
      <?php else: ?>
        <form method="post" id="frmEnvioCurso">
          <input type="hidden" name="csrf" value="<?= h(csrf_token()) ?>">
          <input type="hidden" name="action" value="enviar_matriculados_seleccionados">
          <input type="hidden" name="reloj_id" value="<?= (int)$relojId ?>">
          <input type="hidden" name="institucion" value="<?= h($institucion) ?>">
          <input type="hidden" name="anio" value="<?= (int)$anio ?>">
          <input type="hidden" name="turno" value="<?= h($turno) ?>">
          <input type="hidden" name="nivel" value="<?= h($nivel) ?>">
          <input type="hidden" name="curso" value="<?= h($curso) ?>">
          <input type="hidden" name="seccion" value="<?= h($seccion) ?>">
          <input type="hidden" name="q" value="<?= h($q) ?>">
          <input type="hidden" name="solo_pendientes" value="<?= (int)$soloPend ?>">

          <div class="d-flex justify-content-between align-items-center mb-2">
            <label class="mini">
              <input type="checkbox" id="chkAllCurso" class="form-check-input me-1">
              Seleccionar visibles
            </label>

            <button class="btn btn-primary btn-sm" type="submit">
              <i class="bi bi-send-check me-1"></i>Enviar seleccionados al reloj
            </button>
          </div>

          <div class="soft-table table-responsive" style="max-height:72vh;">
            <table class="table table-sm align-middle mb-0">
              <thead class="sticky-top">
                <tr>
                  <th style="width:42px;"></th>
                  <th>Alumno</th>
                  <th>CI</th>
                  <th>Curso</th>
                  <th>Estado reloj</th>
                </tr>
              </thead>
              <tbody>
                <?php foreach ($filasCurso as $f): ?>
                  <tr>
                    <td class="text-center">
                      <?php if ($f['estado_reloj'] === 'PENDIENTE'): ?>
                        <input
                          type="checkbox"
                          class="form-check-input chkCurso"
                          name="seleccionados[]"
                          value="<?= (int)$f['estudiante_id'] ?>"
                        >
                      <?php endif; ?>
                    </td>
                    <td class="fw-semibold">
                      <?= h($f['nombres']) ?>
                      <?php if ($f['apellidos'] !== '' && $f['apellidos'] !== '-'): ?>
                        <div class="mini"><?= h($f['apellidos']) ?></div>
                      <?php endif; ?>
                    </td>
                    <td><?= h($f['ci'] !== '' ? $f['ci'] : '-') ?></td>
                    <td><?= h($f['nivel'] . ' / ' . $f['curso'] . ' / ' . $f['seccion'] . ' / ' . $f['turno']) ?></td>
                    <td>
                      <?php if ($f['estado_reloj'] === 'EN_RELOJ_Y_GUARDADO'): ?>
                        <span class="badge-pill badge-ok">Ya está en reloj</span>
                      <?php elseif ($f['estado_reloj'] === 'EN_RELOJ'): ?>
                        <span class="badge-pill badge-ok">Detectado en reloj</span>
                      <?php elseif ($f['estado_reloj'] === 'GUARDADO_LOCAL'): ?>
                        <span class="badge-pill badge-muted">Guardado local</span>
                      <?php elseif ($f['estado_reloj'] === 'SIN_CI'): ?>
                        <span class="badge-pill badge-danger-soft">Sin CI</span>
                      <?php else: ?>
                        <span class="badge-pill badge-warn">Pendiente de enviar</span>
                      <?php endif; ?>
                    </td>
                  </tr>
                <?php endforeach; ?>
              </tbody>
            </table>
          </div>
        </form>
      <?php endif; ?>
    </div>
  </div>

  <div class="col-12 col-xl-4">
    <div class="card-pro p-3 mb-3">
      <div class="fw-bold mb-2">Lectura actual del reloj</div>
      <div class="mini mb-2">
        Personas detectadas en el reloj que todavía no existen en <b>estudiantes</b>.
      </div>

      <?php if (empty($soloReloj)): ?>
        <div class="text-muted">No hay registros “solo en reloj”.</div>
      <?php else: ?>
        <div class="soft-table table-responsive" style="max-height:60vh;">
          <table class="table table-sm align-middle mb-0">
            <thead class="sticky-top">
              <tr>
                <th>CI</th>
                <th>Nombre</th>
              </tr>
            </thead>
            <tbody>
              <?php foreach ($soloReloj as $r): ?>
                <tr>
                  <td><?= h($r['ci']) ?></td>
                  <td>
                    <?= h($r['nombre'] !== '' ? $r['nombre'] : '-') ?>
                    <?php if ($r['empleado_no'] !== ''): ?>
                      <div class="mini">Empleado: <?= h($r['empleado_no']) ?></div>
                    <?php endif; ?>
                  </td>
                </tr>
              <?php endforeach; ?>
            </tbody>
          </table>
        </div>
      <?php endif; ?>
    </div>

    <div class="card-pro p-3">
      <div class="fw-bold mb-2">Cómo usar esta pantalla</div>
      <div class="mini">
        1. Cargas alumnos nuevos en <b>estudiantes</b>.<br>
        2. Los matriculas en su curso.<br>
        3. Entras aquí, filtras por curso.<br>
        4. Ves quién está <b>Pendiente de enviar</b>.<br>
        5. Envías solo esos al reloj.
      </div>
    </div>
  </div>
</div>

<script>
(function () {
  const chkAll = document.getElementById('chkAllCurso');
  const frm = document.getElementById('frmEnvioCurso');

  if (chkAll && frm) {
    chkAll.addEventListener('change', function () {
      const checks = frm.querySelectorAll('.chkCurso');
      checks.forEach(ch => ch.checked = chkAll.checked);
    });
  }
})();
</script>

<?php include __DIR__ . '/../../app/views/footer.php'; ?>