<?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");
}

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

// GET filtros
$institucion = trim((string)($_GET['institucion'] ?? 'ENC'));
$anio        = (int)($_GET['anio'] ?? (int)date('Y'));
$turno       = trim((string)($_GET['turno'] ?? 'Noche'));
$materiaId   = (int)($_GET['materia_id'] ?? 0);

$nivel   = trim((string)($_GET['nivel'] ?? ''));
$cursoId = (int)($_GET['curso_id'] ?? 0);
$seccId  = (int)($_GET['seccion_id'] ?? 0);

// si venís desde docentes.php
$prefDocenteId = (int)($_GET['docente_id'] ?? 0);

// Flash messages
$msg = $_SESSION['flash_msg'] ?? null;
$err = $_SESSION['flash_err'] ?? null;
unset($_SESSION['flash_msg'], $_SESSION['flash_err']);

// Catálogos
$instituciones = $pdo->query("
  SELECT DISTINCT institucion
  FROM cursos
  WHERE activo=1
  ORDER BY institucion
")->fetchAll(PDO::FETCH_COLUMN);

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

$docentes = $pdo->query("
  SELECT id, apellidos, nombres
  FROM docentes
  WHERE activo=1
  ORDER BY apellidos, nombres
")->fetchAll(PDO::FETCH_ASSOC);

$materias = $pdo->query("
  SELECT id, nombre, area
  FROM materias
  WHERE activo=1
  ORDER BY area, nombre
")->fetchAll(PDO::FETCH_ASSOC);

$stN = $pdo->prepare("
  SELECT DISTINCT nivel
  FROM cursos
  WHERE activo=1
    AND institucion=?
  ORDER BY nivel
");
$stN->execute([$institucion]);
$niveles = $stN->fetchAll(PDO::FETCH_COLUMN);

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

$secciones = $pdo->query("
  SELECT id, nombre
  FROM secciones
  WHERE activo=1
  ORDER BY nombre
")->fetchAll(PDO::FETCH_ASSOC);

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

  $institucionP = trim((string)($_POST['institucion'] ?? $institucion));
  $anioP        = (int)($_POST['anio'] ?? $anio);
  $turnoP       = trim((string)($_POST['turno'] ?? $turno));
  $materiaP     = (int)($_POST['materia_id'] ?? 0);
  $docenteP     = (int)($_POST['docente_id'] ?? 0);

  // replace = siempre pisa
  // only_empty = solo asigna si está vacío
  $modoP = trim((string)($_POST['modo'] ?? 'replace'));
  if (!in_array($modoP, ['replace', 'only_empty'], true)) {
    $modoP = 'replace';
  }

  // conservar filtros al volver
  $nivelP   = trim((string)($_POST['nivel'] ?? ''));
  $cursoIdP = (int)($_POST['curso_id'] ?? 0);
  $seccIdP  = (int)($_POST['seccion_id'] ?? 0);

  $claseIds = $_POST['clase_ids'] ?? [];

  try {
    if ($institucionP === '') throw new RuntimeException("Institución inválida.");
    if ($anioP <= 0) throw new RuntimeException("Año inválido.");
    if ($turnoP === '') throw new RuntimeException("Turno inválido.");
    if ($materiaP <= 0) throw new RuntimeException("Elegí una materia.");
    if ($docenteP <= 0) throw new RuntimeException("Elegí un docente.");

    if (!is_array($claseIds) || empty($claseIds)) {
      throw new RuntimeException("Marcá al menos una clase.");
    }

    $claseIds = array_values(array_filter(array_map('intval', $claseIds), fn($x) => $x > 0));
    if (empty($claseIds)) throw new RuntimeException("Selección inválida.");

    $in = implode(',', array_fill(0, count($claseIds), '?'));

    $sql = "
      UPDATE clases
      SET docente_id=?
      WHERE institucion=?
        AND anio_lectivo=?
        AND turno=?
        AND materia_id=?
        AND id IN ($in)
    ";

    if ($modoP === 'only_empty') {
      $sql .= " AND (docente_id IS NULL OR docente_id=0)";
    }

    $params = array_merge([$docenteP, $institucionP, $anioP, $turnoP, $materiaP], $claseIds);

    $st = $pdo->prepare($sql);
    $st->execute($params);

    $afectadas = (int)$st->rowCount();

    if ($afectadas === 0) {
      if ($modoP === 'only_empty') {
        $_SESSION['flash_err'] = "⚠️ No se asignó ninguna clase porque todas ya tenían docente (modo: Solo si está vacío).";
      } else {
        $_SESSION['flash_err'] = "⚠️ No se actualizó ninguna clase. Revisá si las clases existen en la institución/año/turno/materia seleccionados.";
      }
    } else {
      $_SESSION['flash_msg'] = ($modoP === 'only_empty')
        ? "✅ Docente agregado solo a las SIN asignar. Clases afectadas: {$afectadas}."
        : "✅ Docente actualizado (reemplazo). Clases afectadas: {$afectadas}.";
    }

  } catch (Throwable $e) {
    $_SESSION['flash_err'] = "❌ " . $e->getMessage();
  }

  header("Location: /Comercio/public/admin/asignar_clases.php?" . http_build_query([
    'institucion' => $institucionP,
    'anio'        => $anioP,
    'turno'       => $turnoP,
    'materia_id'  => $materiaP,
    'nivel'       => $nivelP,
    'curso_id'    => $cursoIdP,
    'seccion_id'  => $seccIdP,
    'docente_id'  => $docenteP,
  ]));
  exit;
}

/* =========================
   GET: listar clases
========================= */
$clases = [];
if ($materiaId > 0) {
  $sql = "
    SELECT
      c.id,
      c.institucion,
      c.nivel,
      c.turno,
      c.etapa,
      c.docente_id,
      cu.nombre AS curso,
      s.nombre AS seccion,
      d.apellidos AS d_apellidos,
      d.nombres AS d_nombres
    FROM clases c
    JOIN cursos cu ON cu.id = c.curso_id
    JOIN secciones s ON s.id = c.seccion_id
    LEFT JOIN docentes d ON d.id = c.docente_id
    WHERE c.institucion = :institucion
      AND c.anio_lectivo = :anio
      AND c.turno = :turno
      AND c.materia_id = :mid
      AND c.activo = 1
  ";
  $params = [
    ':institucion' => $institucion,
    ':anio'        => $anio,
    ':turno'       => $turno,
    ':mid'         => $materiaId,
  ];

  if ($nivel !== '') {
    $sql .= " AND c.nivel = :nivel";
    $params[':nivel'] = $nivel;
  }
  if ($cursoId > 0) {
    $sql .= " AND c.curso_id = :cid";
    $params[':cid'] = $cursoId;
  }
  if ($seccId > 0) {
    $sql .= " AND c.seccion_id = :sid";
    $params[':sid'] = $seccId;
  }

  $sql .= " ORDER BY c.nivel, cu.nombre, s.nombre, c.etapa";

  $st = $pdo->prepare($sql);
  $st->execute($params);
  $clases = $st->fetchAll(PDO::FETCH_ASSOC);
}

$title = "Asignar materias a docentes";
include __DIR__ . '/../../app/views/header.php';
?>

<style>
  .card-pro{
    border-radius:16px;
    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:rgba(248,249,250,1);
    font-size:.85rem;
    color:#6c757d;
    font-weight:800;
    white-space:nowrap;
  }
  .chip{
    display:inline-flex;
    align-items:center;
    gap:6px;
    padding:5px 10px;
    border-radius:999px;
    font-size:.82rem;
    border:1px solid rgba(0,0,0,.08);
    background:#fff;
  }
</style>

<div class="d-flex justify-content-between align-items-start flex-wrap gap-2 mb-3">
  <div>
    <h1 class="h5 mb-1">Asignar materias a docentes</h1>
    <div class="text-muted small">
      Elegí institución, materia y docente. Luego filtrá por curso, sección y nivel.
    </div>
  </div>
  <a class="btn btn-outline-secondary btn-sm" href="/Comercio/public/dashboard.php">← Dashboard</a>
</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">
  <form method="get" class="row g-2 align-items-end">
    <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-3">
      <label class="form-label">Materia</label>
      <select class="form-select" name="materia_id" required>
        <option value="0">— Elegir materia —</option>
        <?php foreach ($materias as $m): ?>
          <option value="<?= (int)$m['id'] ?>" <?= (int)$m['id'] === $materiaId ? 'selected' : '' ?>>
            <?= h(($m['area'] ? $m['area'].' · ' : '') . $m['nombre']) ?>
          </option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="col-6 col-md-1">
      <label class="form-label">Nivel</label>
      <select class="form-select" name="nivel" onchange="this.form.submit()">
        <option value="">*</option>
        <?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-6 col-md-1">
      <label class="form-label">Curso</label>
      <select class="form-select" name="curso_id">
        <option value="0">*</option>
        <?php foreach ($cursos as $c): ?>
          <option value="<?= (int)$c['id'] ?>" <?= (int)$c['id'] === $cursoId ? 'selected' : '' ?>>
            <?= h($c['nombre']) ?>
          </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_id">
        <option value="0">*</option>
        <?php foreach ($secciones as $s): ?>
          <option value="<?= (int)$s['id'] ?>" <?= (int)$s['id'] === $seccId ? 'selected' : '' ?>>
            <?= h($s['nombre']) ?>
          </option>
        <?php endforeach; ?>
      </select>
    </div>

    <input type="hidden" name="docente_id" value="<?= (int)$prefDocenteId ?>">

    <div class="col-12 d-flex gap-2">
      <button class="btn btn-primary w-100"><i class="bi bi-search me-1"></i>Buscar</button>
      <a class="btn btn-outline-secondary" href="/Comercio/public/admin/asignar_clases.php">Limpiar</a>
    </div>
  </form>
</div>

<?php if ($materiaId > 0): ?>
  <div class="card-pro p-3">
    <?php if (empty($clases)): ?>
      <div class="alert alert-warning mb-0">
        No hay clases ACTIVAS para esa materia con este filtro.
        <div class="small mt-1 text-muted">
          Si esperabas ver cursos acá, entonces todavía no existen registros en <code>clases</code> para esa institución/año/turno/materia.
        </div>
      </div>
    <?php else: ?>

      <form method="post" id="assignForm">
        <input type="hidden" name="csrf" value="<?= h(csrf_token()) ?>">
        <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="materia_id" value="<?= (int)$materiaId ?>">
        <input type="hidden" name="nivel" value="<?= h($nivel) ?>">
        <input type="hidden" name="curso_id" value="<?= (int)$cursoId ?>">
        <input type="hidden" name="seccion_id" value="<?= (int)$seccId ?>">
      </form>

      <div class="d-flex flex-wrap gap-2 align-items-center mb-3">
        <span class="chip"><b>Institución:</b> <?= h($institucion) ?></span>
        <span class="chip"><b>Año:</b> <?= (int)$anio ?></span>
        <span class="chip"><b>Turno:</b> <?= h($turno) ?></span>
        <span class="chip"><b>Clases encontradas:</b> <?= count($clases) ?></span>
      </div>

      <div class="row g-2 align-items-end mb-2">
        <div class="col-12 col-md-8">
          <label class="form-label">Docente</label>
          <select class="form-select" name="docente_id" required form="assignForm" id="docenteSelect">
            <option value="">— Elegir docente —</option>
            <?php foreach ($docentes as $d): ?>
              <option value="<?= (int)$d['id'] ?>" <?= ((int)$d['id'] === $prefDocenteId) ? 'selected' : '' ?>>
                <?= h($d['apellidos'].' '.$d['nombres']) ?>
              </option>
            <?php endforeach; ?>
          </select>
        </div>

        <div class="col-12 col-md-4">
          <label class="form-label">Acción</label>
          <select class="form-select" name="modo" form="assignForm">
            <option value="replace">Reemplazar (cambiar docente)</option>
            <option value="only_empty">Solo si está vacío</option>
          </select>

          <button class="btn btn-success w-100 mt-2" type="submit" form="assignForm">
            <i class="bi bi-check2-circle me-1"></i>Aplicar a seleccionadas
          </button>
        </div>

        <div class="col-12 d-flex gap-2">
          <button class="btn btn-outline-secondary btn-sm" type="button" id="btnAll">Marcar todo</button>
          <button class="btn btn-outline-secondary btn-sm" type="button" id="btnNone">Desmarcar todo</button>
          <button class="btn btn-outline-secondary btn-sm" type="button" id="btnOnlyEmpty">Marcar solo sin asignar</button>
        </div>
      </div>

      <div class="soft-table table-responsive">
        <table class="table table-sm align-middle mb-0">
          <thead>
            <tr>
              <th style="width:44px;"></th>
              <th>Curso</th>
              <th>Sección</th>
              <th>Nivel</th>
              <th>Turno</th>
              <th>Etapa</th>
              <th>Institución</th>
              <th>Docente actual</th>
            </tr>
          </thead>
          <tbody>
            <?php foreach ($clases as $c): ?>
              <?php $sin = empty($c['docente_id']); ?>
              <tr>
                <td>
                  <input class="form-check-input clase-check"
                         type="checkbox"
                         name="clase_ids[]"
                         value="<?= (int)$c['id'] ?>"
                         data-sin="<?= $sin ? '1' : '0' ?>"
                         form="assignForm">
                </td>
                <td class="fw-semibold"><?= h($c['curso']) ?></td>
                <td><?= h($c['seccion']) ?></td>
                <td><?= h($c['nivel']) ?></td>
                <td><?= h($c['turno']) ?></td>
                <td><?= h((string)($c['etapa'] ?? '-')) ?></td>
                <td><?= h($c['institucion']) ?></td>
                <td>
                  <?php if (!empty($c['d_apellidos'])): ?>
                    <?= h($c['d_apellidos'].' '.$c['d_nombres']) ?>
                  <?php else: ?>
                    <span class="text-danger fw-semibold">Sin asignar</span>
                  <?php endif; ?>
                </td>
              </tr>
            <?php endforeach; ?>
          </tbody>
        </table>
      </div>

      <script>
        const allBtn = document.getElementById('btnAll');
        const noneBtn = document.getElementById('btnNone');
        const onlyEmptyBtn = document.getElementById('btnOnlyEmpty');

        const checks = () => Array.from(document.querySelectorAll('.clase-check'));

        allBtn?.addEventListener('click', () => checks().forEach(c => c.checked = true));
        noneBtn?.addEventListener('click', () => checks().forEach(c => c.checked = false));
        onlyEmptyBtn?.addEventListener('click', () => {
          checks().forEach(c => c.checked = (c.dataset.sin === '1'));
        });
      </script>

    <?php endif; ?>
  </div>
<?php endif; ?>

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