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

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

// Defaults
$institucionDef = trim((string)($_GET['institucion'] ?? 'ENC'));
$anioDef = (int)($_GET['anio'] ?? (int)date('Y'));
$turnosDisponibles = ['Noche','Mañana','Tarde'];

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

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

/* =========================
   Datos base filtrados por institución
========================= */
$stCursos = $pdo->prepare("
  SELECT id, institucion, nivel, nombre, orden
  FROM cursos
  WHERE activo = 1
    AND institucion = ?
  ORDER BY nivel, orden, nombre
");
$stCursos->execute([$institucionDef]);
$cursos = $stCursos->fetchAll(PDO::FETCH_ASSOC);

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

// Etapas
$etapas = [];
try {
  $etapas = $pdo->query("
    SELECT id, nombre
    FROM etapas
    ORDER BY id
    LIMIT 2
  ")->fetchAll(PDO::FETCH_ASSOC);
} catch (Throwable $e) {
  $etapas = [
    ['id'=>1,'nombre'=>'Etapa 1'],
    ['id'=>2,'nombre'=>'Etapa 2'],
  ];
}

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

  $institucionP = trim((string)($_POST['institucion'] ?? $institucionDef));
  $anioP        = (int)($_POST['anio'] ?? 0);
  $turnosP      = $_POST['turnos'] ?? [];
  $cursoIdsP    = $_POST['curso_ids'] ?? [];
  $seccionIdsP  = $_POST['seccion_ids'] ?? [];
  $etapaIdsP    = $_POST['etapa_ids'] ?? [];

  try {
    if ($institucionP === '') throw new RuntimeException("Institución inválida.");
    if ($anioP <= 0) throw new RuntimeException("Año inválido.");

    if (!is_array($turnosP) || empty($turnosP)) {
      throw new RuntimeException("Seleccioná al menos un turno.");
    }
    $turnosP = array_values(array_unique(array_filter(array_map('strval', $turnosP))));
    foreach ($turnosP as $t) {
      if (!in_array($t, $turnosDisponibles, true)) {
        throw new RuntimeException("Turno inválido: " . h($t));
      }
    }

    if (!is_array($cursoIdsP) || empty($cursoIdsP)) {
      throw new RuntimeException("Seleccioná al menos un curso.");
    }
    $cursoIdsP = array_values(array_filter(array_map('intval', $cursoIdsP), fn($x) => $x > 0));
    if (empty($cursoIdsP)) throw new RuntimeException("Cursos inválidos.");

    if (!is_array($seccionIdsP) || empty($seccionIdsP)) {
      throw new RuntimeException("Seleccioná al menos una sección.");
    }
    $seccionIdsP = array_values(array_filter(array_map('intval', $seccionIdsP), fn($x) => $x > 0));
    if (empty($seccionIdsP)) throw new RuntimeException("Secciones inválidas.");

    if (!is_array($etapaIdsP) || empty($etapaIdsP)) {
      throw new RuntimeException("Seleccioná al menos una etapa.");
    }
    $etapaIdsP = array_values(array_filter(array_map('intval', $etapaIdsP), fn($x) => $x > 0));
    if (empty($etapaIdsP)) throw new RuntimeException("Etapas inválidas.");

    // validar que los cursos seleccionados pertenezcan a la institución elegida
    $inCursosValid = implode(',', array_fill(0, count($cursoIdsP), '?'));
    $stValid = $pdo->prepare("
      SELECT COUNT(*)
      FROM cursos
      WHERE activo = 1
        AND institucion = ?
        AND id IN ($inCursosValid)
    ");
    $stValid->execute(array_merge([$institucionP], $cursoIdsP));
    $countValid = (int)$stValid->fetchColumn();

    if ($countValid !== count($cursoIdsP)) {
      throw new RuntimeException("Hay cursos seleccionados que no pertenecen a la institución elegida.");
    }

    // Turnos desde whitelist
    $turnosUnion = implode(" UNION ALL ", array_map(
      fn($t) => "SELECT " . $pdo->quote($t) . " AS turno",
      $turnosP
    ));

    // Etapas
    $etapasUnionParts = [];
    $i = 1;
    foreach ($etapaIdsP as $eid) {
      $etapasUnionParts[] = "SELECT " . (int)$i . " AS etapa_num, " . (int)$eid . " AS etapa_id";
      $i++;
    }
    $etapasUnion = implode(" UNION ALL ", $etapasUnionParts);

    $inCursos = implode(',', array_fill(0, count($cursoIdsP), '?'));
    $inSecc   = implode(',', array_fill(0, count($seccionIdsP), '?'));

    $sql = "
      INSERT IGNORE INTO clases
        (institucion, anio_lectivo, etapa, etapa_id, nivel, curso_id, seccion_id, turno, materia_id, docente_id, activo)
      SELECT
        ? AS institucion,
        ? AS anio_lectivo,
        e.etapa_num,
        e.etapa_id,
        cu.nivel,
        cu.id AS curso_id,
        s.id  AS seccion_id,
        t.turno,
        mpc.materia_id,
        0 AS docente_id,
        1 AS activo
      FROM cursos cu
      JOIN materias_por_curso mpc ON mpc.curso_id = cu.id
      JOIN secciones s ON s.id IN ($inSecc)
      JOIN ($turnosUnion) t
      JOIN ($etapasUnion) e
      WHERE cu.activo = 1
        AND cu.institucion = ?
        AND cu.id IN ($inCursos)
    ";

    $pdo->beginTransaction();
    $st = $pdo->prepare($sql);

    $params = array_merge(
      [$institucionP, $anioP],
      $seccionIdsP,
      [$institucionP],
      $cursoIdsP
    );

    $st->execute($params);

    $insertadas = (int)$st->rowCount();
    $pdo->commit();

    $_SESSION['flash_msg'] = "✅ Generación completada para {$institucionP}. Clases creadas: {$insertadas}. (Si ya existían, se omitieron automáticamente.)";
    header("Location: /Comercio/public/admin/generar_anio.php?" . http_build_query([
      'institucion' => $institucionP,
      'anio' => $anioP
    ]));
    exit;

  } catch (Throwable $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    $_SESSION['flash_err'] = "❌ " . $e->getMessage();
    header("Location: /Comercio/public/admin/generar_anio.php?" . http_build_query([
      'institucion' => $institucionP,
      'anio' => $anioP
    ]));
    exit;
  }
}

$title = "Generar clases del año";
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);
  }
  .curso-box{
    border:1px solid rgba(0,0,0,.08);
    border-radius:12px;
    padding:12px;
    background:#fff;
    height:100%;
  }
  .curso-chip{
    display:inline-flex;
    align-items:center;
    gap:6px;
    padding:4px 10px;
    border-radius:999px;
    font-size:.82rem;
    background:#f8f9fa;
    border:1px solid rgba(0,0,0,.08);
  }
</style>

<div class="d-flex justify-content-between align-items-start flex-wrap gap-2 mb-3">
  <div>
    <h1 class="h5 mb-1">Generar clases del año</h1>
    <div class="text-muted small">
      Crea automáticamente las clases usando <b>materias_por_curso</b>, cursos y secciones activas, separadas por institución.
    </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 card-pro p-3">
  <form method="post" class="row g-3">
    <input type="hidden" name="csrf" value="<?= h(csrf_token()) ?>">

    <div class="col-12 col-md-3">
      <label class="form-label">Institución</label>
      <select class="form-select" name="institucion" onchange="window.location='?institucion=' + encodeURIComponent(this.value) + '&anio=<?= (int)$anioDef ?>'">
        <?php foreach ($instituciones as $inst): ?>
          <option value="<?= h((string)$inst) ?>" <?= $institucionDef === (string)$inst ? 'selected' : '' ?>>
            <?= h((string)$inst) ?>
          </option>
        <?php endforeach; ?>
      </select>
    </div>

    <div class="col-12 col-md-3">
      <label class="form-label">Año lectivo</label>
      <input class="form-control" type="number" name="anio" value="<?= (int)$anioDef ?>" required>
    </div>

    <div class="col-12 col-md-6">
      <label class="form-label">Turnos</label>
      <div class="d-flex flex-wrap gap-3">
        <?php foreach ($turnosDisponibles as $t): ?>
          <label class="form-check">
            <input class="form-check-input" type="checkbox" name="turnos[]" value="<?= h($t) ?>" <?= $t === 'Noche' ? 'checked' : '' ?>>
            <span class="form-check-label"><?= h($t) ?></span>
          </label>
        <?php endforeach; ?>
      </div>
      <div class="text-muted small mt-1">Elegí para qué turnos generar las clases.</div>
    </div>

    <div class="col-12 col-md-6">
      <label class="form-label">Etapas</label>
      <div class="d-flex flex-column gap-2">
        <?php foreach ($etapas as $e): ?>
          <label class="form-check">
            <input class="form-check-input" type="checkbox" name="etapa_ids[]" value="<?= (int)$e['id'] ?>" checked>
            <span class="form-check-label"><?= h(($e['nombre'] ?? 'Etapa') . ' (#' . (int)$e['id'] . ')') ?></span>
          </label>
        <?php endforeach; ?>
      </div>
      <div class="text-muted small mt-1">Genera las mismas asignaturas para cada etapa elegida.</div>
    </div>

    <div class="col-12 col-md-6">
      <label class="form-label">Secciones</label>
      <div class="d-flex flex-wrap gap-3">
        <?php foreach ($secciones as $s): ?>
          <label class="form-check">
            <input class="form-check-input" type="checkbox" name="seccion_ids[]" value="<?= (int)$s['id'] ?>" checked>
            <span class="form-check-label"><?= h($s['nombre']) ?></span>
          </label>
        <?php endforeach; ?>
      </div>
      <div class="text-muted small mt-1">Podés generar A, B, C o las que uses.</div>
    </div>

    <div class="col-12">
      <div class="d-flex justify-content-between align-items-center flex-wrap gap-2 mb-2">
        <label class="form-label m-0">Cursos de <?= h($institucionDef) ?></label>
        <div class="d-flex gap-2">
          <button type="button" class="btn btn-outline-secondary btn-sm" onclick="toggleCursos(true)">Marcar todos</button>
          <button type="button" class="btn btn-outline-secondary btn-sm" onclick="toggleCursos(false)">Desmarcar</button>
        </div>
      </div>

      <?php if (empty($cursos)): ?>
        <div class="alert alert-warning mb-0">
          No hay cursos activos para la institución <b><?= h($institucionDef) ?></b>.
        </div>
      <?php else: ?>
        <div class="row g-2">
          <?php foreach ($cursos as $c): ?>
            <div class="col-12 col-md-6 col-lg-4">
              <label class="curso-box w-100">
                <div class="d-flex align-items-start gap-2">
                  <input class="form-check-input curso-check mt-1" type="checkbox" name="curso_ids[]" value="<?= (int)$c['id'] ?>" checked>
                  <div>
                    <div class="fw-bold"><?= h($c['nombre']) ?></div>
                    <div class="mt-1 d-flex flex-wrap gap-2">
                      <span class="curso-chip"><?= h($c['institucion']) ?></span>
                      <span class="curso-chip"><?= h($c['nivel']) ?></span>
                    </div>
                  </div>
                </div>
              </label>
            </div>
          <?php endforeach; ?>
        </div>
      <?php endif; ?>

      <div class="text-muted small mt-2">
        Esto usa <code>materias_por_curso</code>. Si a un curso le faltan materias en el plan, no se generará nada para ese curso.
      </div>
    </div>

    <div class="col-12 d-flex gap-2">
      <button class="btn btn-primary">
        <i class="bi bi-magic me-1"></i>Generar clases
      </button>
      <a class="btn btn-outline-secondary" href="/Comercio/public/admin/asignar_clases.php?institucion=<?= urlencode($institucionDef) ?>">
        <i class="bi bi-diagram-3 me-1"></i>Ir a asignar docentes
      </a>
    </div>

    <div class="col-12">
      <div class="alert alert-warning mb-0">
        <b>Recomendación:</b> usá índice único por institución para evitar duplicados.
        <div class="small mt-1">
<pre class="mb-0"><code>ALTER TABLE clases
ADD UNIQUE KEY uq_clase_anio_etapa_turno_inst (
  institucion,
  anio_lectivo,
  etapa_id,
  turno,
  curso_id,
  seccion_id,
  materia_id
);</code></pre>
        </div>
      </div>
    </div>
  </form>
</div>

<script>
  function toggleCursos(on) {
    document.querySelectorAll('.curso-check').forEach(ch => ch.checked = !!on);
  }
</script>

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