<?php
declare(strict_types=1);

error_reporting(E_ALL);
ini_set('display_errors','1');

require_once __DIR__ . '/../../app/auth.php';
require_once __DIR__ . '/../../app/db.php';
require_once __DIR__ . '/../../app/helpers.php';

start_session();
require_login();

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

$pdo = db();
$msg = null;

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

  $anio = (int)($_POST['anio'] ?? date('Y'));
  $fecha = $_POST['fecha'] ?? date('Y-m-d');

  try {
    $pdo->beginTransaction();

    // 1) insertar ausentes por defecto (todos los matriculados activos del año)
    $pdo->prepare(
      "INSERT INTO asistencia_diaria (estudiante_id, anio_lectivo, fecha, presente, tardanza_min)
       SELECT m.estudiante_id, m.anio_lectivo, ?, 0, 0
       FROM matriculas m
       JOIN estudiantes e ON e.id = m.estudiante_id
       WHERE m.anio_lectivo = ? AND m.estado='ACTIVO' AND e.activo=1
       ON DUPLICATE KEY UPDATE presente=presente"
    )->execute([$fecha, $anio]);

    // 2) marcar presentes (primera/última marcación del día por alumno)
    $pdo->prepare(
      "UPDATE asistencia_diaria a
       JOIN (
         SELECT eb.estudiante_id,
                DATE(m.fecha_hora) AS f,
                MIN(TIME(m.fecha_hora)) AS entrada,
                MAX(TIME(m.fecha_hora)) AS salida
         FROM marcaciones m
         JOIN estudiantes_biometrico eb
           ON eb.reloj_id = m.reloj_id AND eb.device_user_id = m.device_user_id AND eb.activo=1
         WHERE DATE(m.fecha_hora) = ?
         GROUP BY eb.estudiante_id, DATE(m.fecha_hora)
       ) x ON x.estudiante_id = a.estudiante_id AND a.fecha = x.f AND a.anio_lectivo = ?
       SET a.hora_entrada = x.entrada,
           a.hora_salida = x.salida,
           a.presente = 1"
    )->execute([$fecha, $anio]);

    // 3) tardanza según turno (matriculas.turno + configuracion_asistencia)
    // Si el alumno está presente, calculamos diferencia vs (hora_inicio + tolerancia)
    $pdo->prepare(
      "UPDATE asistencia_diaria a
       JOIN matriculas m ON m.estudiante_id = a.estudiante_id AND m.anio_lectivo = a.anio_lectivo
       JOIN configuracion_asistencia c ON c.anio_lectivo = a.anio_lectivo AND c.turno = m.turno
       SET a.tardanza_min =
         CASE
           WHEN a.presente = 1 AND a.hora_entrada IS NOT NULL THEN
             GREATEST(0, TIMESTAMPDIFF(MINUTE,
               CONCAT(a.fecha,' ', ADDTIME(c.hora_inicio, SEC_TO_TIME(c.tolerancia_min*60))),
               CONCAT(a.fecha,' ', a.hora_entrada)
             ))
           ELSE 0
         END
       WHERE a.fecha = ? AND a.anio_lectivo = ?"
    )->execute([$fecha, $anio]);

    $pdo->commit();
    $msg = "✅ Asistencia generada para $fecha (año $anio).";
  } catch(Throwable $e) {
    $pdo->rollBack();
    $msg = "❌ Error: " . $e->getMessage();
  }
}

$title="Generar asistencia";
include __DIR__ . '/../../app/views/header.php';
?>

<h1 class="h5 mb-3">Generar asistencia diaria</h1>
<?php if ($msg): ?><div class="alert alert-info"><?= htmlspecialchars($msg) ?></div><?php endif; ?>

<div class="card shadow-sm">
  <div class="card-body">
    <form method="post" class="row g-2">
      <input type="hidden" name="csrf" value="<?= htmlspecialchars(csrf_token()) ?>">

      <div class="col-12 col-md-4">
        <label class="form-label">Año lectivo</label>
        <input class="form-control" name="anio" type="number" value="<?= htmlspecialchars((string)date('Y')) ?>" required>
      </div>

      <div class="col-12 col-md-4">
        <label class="form-label">Fecha</label>
        <input class="form-control" name="fecha" type="date" value="<?= htmlspecialchars(date('Y-m-d')) ?>" required>
      </div>

      <div class="col-12 col-md-4 d-flex align-items-end">
        <button class="btn btn-primary w-100">Generar</button>
      </div>

      <div class="text-muted small">
        Importante: asegurate de tener configurado <b>matriculas.turno</b> y <b>configuracion_asistencia</b>.
      </div>
    </form>
  </div>
</div>

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