<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
header("Content-Type: application/json; charset=utf-8");

if ($_SERVER["REQUEST_METHOD"] === "OPTIONS") {
  http_response_code(200);
  exit;
}

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

require_once(__DIR__ . "/../config.php");
require_once(__DIR__ . "/../auth_guard.php");

$authUser = requireAuth($JWT_KEY);
$activeUser = requireActiveUser($mysqli, $authUser);

// ================= Helpers =================
function jsonBody(): array {
  $raw = file_get_contents("php://input");
  $data = json_decode($raw, true);
  return is_array($data) ? $data : [];
}
function ok($data = [], string $message = "OK") {
  echo json_encode(["success" => true, "message" => $message] + $data);
  exit;
}
function fail(string $message, int $code = 400) {
  http_response_code($code);
  echo json_encode(["success" => false, "message" => $message]);
  exit;
}
function clean($v): string { return trim((string)$v); }
function toInt($v, int $default = 0): int {
  if ($v === null || $v === "") return $default;
  return (int)$v;
}

$method = $_SERVER["REQUEST_METHOD"];

// ================= GET =================
if ($method === "GET") {
  $idInst = isset($_GET["ID_INSTITUCION"]) ? (int)$_GET["ID_INSTITUCION"] : 0;
  $idCurso = isset($_GET["ID_CURSO"]) ? (int)$_GET["ID_CURSO"] : 0;
  $idAsig = isset($_GET["ID_ASIGNATURA"]) ? (int)$_GET["ID_ASIGNATURA"] : 0;
  $idDoc = isset($_GET["ID_DOCENTE"]) ? (int)$_GET["ID_DOCENTE"] : 0;
  $anio = isset($_GET["ANIO_ACADEMICO"]) ? (int)$_GET["ANIO_ACADEMICO"] : 0;
  $periodo = isset($_GET["PERIODO_ACADEMICO"]) ? clean($_GET["PERIODO_ACADEMICO"]) : "";

  $sql = "
    SELECT
      AA.ID_ASIGNACION,
      AA.ID_INSTITUCION,
      I.NOMBRE_INSTITUCION,

      AA.ID_CURSO,
      C.NOMBRE_CURSO,
      C.GRADO_CURSO,
      C.JORNADA_CURSO,

      AA.ID_ASIGNATURA,
      A.NOMBRE_ASIGNATURA,

      AA.ID_DOCENTE,
      CONCAT(D.NOMBRE_DOCENTE, ' ', D.APELLIDO_DOCENTE) AS NOMBRE_DOCENTE,

      AA.ANIO_ACADEMICO,
      AA.PERIODO_ACADEMICO,

      AA.ESTADO_ASIGNACION,
      E.NOMBRE_ESTADO,
      AA.FECHA_CREACION
    FROM ASIGNACION_ACADEMICA AA
    INNER JOIN INSTITUCIONES I ON I.ID_INSTITUCION = AA.ID_INSTITUCION
    INNER JOIN CURSOS C ON C.ID_CURSO = AA.ID_CURSO
    INNER JOIN ASIGNATURAS A ON A.ID_ASIGNATURA = AA.ID_ASIGNATURA
    INNER JOIN DOCENTES D ON D.ID_DOCENTE = AA.ID_DOCENTE
    INNER JOIN ESTADO E ON E.ID_ESTADO = AA.ESTADO_ASIGNACION
    WHERE 1=1
  ";

  $types = "";
  $params = [];

  if ($idInst > 0) { $sql .= " AND AA.ID_INSTITUCION = ?"; $types .= "i"; $params[] = $idInst; }
  if ($idCurso > 0) { $sql .= " AND AA.ID_CURSO = ?"; $types .= "i"; $params[] = $idCurso; }
  if ($idAsig > 0) { $sql .= " AND AA.ID_ASIGNATURA = ?"; $types .= "i"; $params[] = $idAsig; }
  if ($idDoc > 0) { $sql .= " AND AA.ID_DOCENTE = ?"; $types .= "i"; $params[] = $idDoc; }
  if ($anio > 0) { $sql .= " AND AA.ANIO_ACADEMICO = ?"; $types .= "i"; $params[] = $anio; }
  if ($periodo !== "") { $sql .= " AND AA.PERIODO_ACADEMICO = ?"; $types .= "s"; $params[] = $periodo; }

  $sql .= " ORDER BY AA.ID_ASIGNACION DESC";

  $stmt = $mysqli->prepare($sql);
  if (!$stmt) fail("Error preparando consulta.");

  if ($types !== "") {
    $stmt->bind_param($types, ...$params);
  }
  $stmt->execute();
  $res = $stmt->get_result();

  $rows = [];
  while ($r = $res->fetch_assoc()) $rows[] = $r;

  ok(["data" => $rows], "Listado de asignaciones");
}

// ================= POST =================
if ($method === "POST") {
  $b = jsonBody();

  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $idCurso = toInt($b["ID_CURSO"] ?? 0);
  $idAsig = toInt($b["ID_ASIGNATURA"] ?? 0);
  $idDoc = toInt($b["ID_DOCENTE"] ?? 0);

  $anio = toInt($b["ANIO_ACADEMICO"] ?? 0);
  $periodo = clean($b["PERIODO_ACADEMICO"] ?? "1");

  $estado = toInt($b["ESTADO_ASIGNACION"] ?? 1, 1);
  if ($estado !== 1 && $estado !== 2) $estado = 1;

  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($idCurso <= 0) fail("ID_CURSO es requerido.");
  if ($idAsig <= 0) fail("ID_ASIGNATURA es requerido.");
  if ($idDoc <= 0) fail("ID_DOCENTE es requerido.");
  if ($anio <= 0) fail("ANIO_ACADEMICO es requerido.");

  // validar duplicado (misma combinación)
  $stDup = $mysqli->prepare("
    SELECT ID_ASIGNACION
    FROM ASIGNACION_ACADEMICA
    WHERE ID_CURSO=? AND ID_ASIGNATURA=? AND ID_DOCENTE=? AND ANIO_ACADEMICO=? AND PERIODO_ACADEMICO=?
    LIMIT 1
  ");
  $stDup->bind_param("iiiis", $idCurso, $idAsig, $idDoc, $anio, $periodo);
  $stDup->execute();
  if ($stDup->get_result()->fetch_assoc()) {
    fail("Ya existe esa asignación para ese curso/asignatura/docente en ese año/periodo.");
  }

  $stmt = $mysqli->prepare("
    INSERT INTO ASIGNACION_ACADEMICA
      (ID_INSTITUCION, ID_CURSO, ID_ASIGNATURA, ID_DOCENTE, ANIO_ACADEMICO, PERIODO_ACADEMICO, ESTADO_ASIGNACION)
    VALUES (?, ?, ?, ?, ?, ?, ?)
  ");
  $stmt->bind_param("iiiiisi", $idInst, $idCurso, $idAsig, $idDoc, $anio, $periodo, $estado);

  if (!$stmt->execute()) fail("Error al crear asignación.");

  ok(["id" => $mysqli->insert_id], "Asignación creada");
}

// ================= PUT =================
if ($method === "PUT") {
  $b = jsonBody();

  $id = toInt($b["ID_ASIGNACION"] ?? 0);
  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $idCurso = toInt($b["ID_CURSO"] ?? 0);
  $idAsig = toInt($b["ID_ASIGNATURA"] ?? 0);
  $idDoc = toInt($b["ID_DOCENTE"] ?? 0);
  $anio = toInt($b["ANIO_ACADEMICO"] ?? 0);
  $periodo = clean($b["PERIODO_ACADEMICO"] ?? "1");
  $estado = toInt($b["ESTADO_ASIGNACION"] ?? 1, 1);
  if ($estado !== 1 && $estado !== 2) $estado = 1;

  if ($id <= 0) fail("ID_ASIGNACION es requerido.");
  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($idCurso <= 0) fail("ID_CURSO es requerido.");
  if ($idAsig <= 0) fail("ID_ASIGNATURA es requerido.");
  if ($idDoc <= 0) fail("ID_DOCENTE es requerido.");
  if ($anio <= 0) fail("ANIO_ACADEMICO es requerido.");

  // existe?
  $st0 = $mysqli->prepare("SELECT ID_ASIGNACION FROM ASIGNACION_ACADEMICA WHERE ID_ASIGNACION=? LIMIT 1");
  $st0->bind_param("i", $id);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("La asignación no existe.");

  // duplicado en update (excepto el mismo)
  $stDup = $mysqli->prepare("
    SELECT ID_ASIGNACION
    FROM ASIGNACION_ACADEMICA
    WHERE ID_CURSO=? AND ID_ASIGNATURA=? AND ID_DOCENTE=? AND ANIO_ACADEMICO=? AND PERIODO_ACADEMICO=? AND ID_ASIGNACION<>?
    LIMIT 1
  ");
  $stDup->bind_param("iiiisi", $idCurso, $idAsig, $idDoc, $anio, $periodo, $id);
  $stDup->execute();
  if ($stDup->get_result()->fetch_assoc()) {
    fail("Ya existe otra asignación igual para ese año/periodo.");
  }

  $stmt = $mysqli->prepare("
    UPDATE ASIGNACION_ACADEMICA
    SET
      ID_INSTITUCION=?,
      ID_CURSO=?,
      ID_ASIGNATURA=?,
      ID_DOCENTE=?,
      ANIO_ACADEMICO=?,
      PERIODO_ACADEMICO=?,
      ESTADO_ASIGNACION=?
    WHERE ID_ASIGNACION=?
    LIMIT 1
  ");
  $stmt->bind_param("iiiiisii", $idInst, $idCurso, $idAsig, $idDoc, $anio, $periodo, $estado, $id);

  if (!$stmt->execute()) fail("Error al actualizar asignación.");

  ok([], "Asignación actualizada");
}

// ================= DELETE (soft) =================
if ($method === "DELETE") {
  $id = isset($_GET["id"]) ? (int)$_GET["id"] : 0;
  if ($id <= 0) fail("Parámetro id es requerido.");

  $st0 = $mysqli->prepare("SELECT ID_ASIGNACION FROM ASIGNACION_ACADEMICA WHERE ID_ASIGNACION=? LIMIT 1");
  $st0->bind_param("i", $id);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("La asignación no existe.");

  $stmt = $mysqli->prepare("UPDATE ASIGNACION_ACADEMICA SET ESTADO_ASIGNACION=2 WHERE ID_ASIGNACION=? LIMIT 1");
  $stmt->bind_param("i", $id);

  if (!$stmt->execute()) fail("Error al inactivar asignación.");

  ok([], "Asignación inactivada");
}

fail("Método no permitido.", 405);
