<?php
// api_corp/CORP_MATRICULAS/matriculas.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 $d = 0): int { return ($v === null || $v === "") ? $d : (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;
  $idEst = isset($_GET["ID_ESTUDIANTE"]) ? (int)$_GET["ID_ESTUDIANTE"] : 0;
  $ano = isset($_GET["ANO_LECTIVO"]) ? (int)$_GET["ANO_LECTIVO"] : 0;
  $periodo = isset($_GET["PERIODO_LECTIVO"]) ? clean($_GET["PERIODO_LECTIVO"]) : "";

  $sql = "
    SELECT
      M.ID_MATRICULA,
      M.ID_INSTITUCION,
      I.NOMBRE_INSTITUCION,
      M.ID_CURSO,
      C.NOMBRE_CURSO,
      C.GRADO_CURSO,
      C.JORNADA_CURSO,
      M.ID_ESTUDIANTE,
      E.NOMBRE_ESTUDIANTE,
      E.APELLIDO_ESTUDIANTE,
      E.DOCUMENTO_ESTUDIANTE,
      M.ANO_LECTIVO,
      M.PERIODO_LECTIVO,
      M.FECHA_MATRICULA,
      M.ESTADO_MATRICULA,
      ES.NOMBRE_ESTADO
    FROM MATRICULAS M
    INNER JOIN INSTITUCIONES I ON I.ID_INSTITUCION = M.ID_INSTITUCION
    INNER JOIN CURSOS C ON C.ID_CURSO = M.ID_CURSO
    INNER JOIN ESTUDIANTES E ON E.ID_ESTUDIANTE = M.ID_ESTUDIANTE
    INNER JOIN ESTADO ES ON ES.ID_ESTADO = M.ESTADO_MATRICULA
    WHERE 1=1
  ";

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

  if ($idInst > 0) { $sql .= " AND M.ID_INSTITUCION=?"; $types .= "i"; $params[] = $idInst; }
  if ($idCurso > 0) { $sql .= " AND M.ID_CURSO=?"; $types .= "i"; $params[] = $idCurso; }
  if ($idEst > 0) { $sql .= " AND M.ID_ESTUDIANTE=?"; $types .= "i"; $params[] = $idEst; }
  if ($ano > 0) { $sql .= " AND M.ANO_LECTIVO=?"; $types .= "i"; $params[] = $ano; }
  if ($periodo !== "") { $sql .= " AND M.PERIODO_LECTIVO=?"; $types .= "s"; $params[] = $periodo; }

  $sql .= " ORDER BY M.ID_MATRICULA 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 matrículas");
}

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

  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $idCurso = toInt($b["ID_CURSO"] ?? 0);
  $idEst = toInt($b["ID_ESTUDIANTE"] ?? 0);

  $ano = toInt($b["ANO_LECTIVO"] ?? 0);
  $periodo = clean($b["PERIODO_LECTIVO"] ?? "1");

  $estado = toInt($b["ESTADO_MATRICULA"] ?? 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 ($idEst <= 0) fail("ID_ESTUDIANTE es requerido.");
  if ($ano <= 0) fail("ANO_LECTIVO es requerido.");
  if ($periodo === "") $periodo = "1";

  // Validar relación: curso pertenece a institución
  $stC = $mysqli->prepare("SELECT ID_CURSO FROM CURSOS WHERE ID_CURSO=? AND ID_INSTITUCION=? LIMIT 1");
  $stC->bind_param("ii", $idCurso, $idInst);
  $stC->execute();
  if (!$stC->get_result()->fetch_assoc()) fail("El curso no pertenece a esa institución.");

  // Validar: estudiante pertenece a institución
  $stE = $mysqli->prepare("SELECT ID_ESTUDIANTE FROM ESTUDIANTES WHERE ID_ESTUDIANTE=? AND ID_INSTITUCION=? LIMIT 1");
  $stE->bind_param("ii", $idEst, $idInst);
  $stE->execute();
  if (!$stE->get_result()->fetch_assoc()) fail("El estudiante no pertenece a esa institución.");

  // Duplicado
  $stD = $mysqli->prepare("
    SELECT ID_MATRICULA
    FROM MATRICULAS
    WHERE ID_ESTUDIANTE=? AND ID_CURSO=? AND ANO_LECTIVO=? AND PERIODO_LECTIVO=?
    LIMIT 1
  ");
  $stD->bind_param("iiis", $idEst, $idCurso, $ano, $periodo);
  $stD->execute();
  if ($stD->get_result()->fetch_assoc()) fail("Ya existe matrícula para ese estudiante, curso, año y periodo.");

  $stmt = $mysqli->prepare("
    INSERT INTO MATRICULAS
      (ID_INSTITUCION, ID_CURSO, ID_ESTUDIANTE, ANO_LECTIVO, PERIODO_LECTIVO, ESTADO_MATRICULA)
    VALUES (?, ?, ?, ?, ?, ?)
  ");
  $stmt->bind_param("iiiisi", $idInst, $idCurso, $idEst, $ano, $periodo, $estado);

  if (!$stmt->execute()) fail("Error al crear matrícula.");

  ok(["id" => $mysqli->insert_id], "Matrícula creada");
}

// ============ PUT ============
if ($method === "PUT") {
  $b = jsonBody();
  $id = toInt($b["ID_MATRICULA"] ?? 0);
  if ($id <= 0) fail("ID_MATRICULA es requerido.");

  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $idCurso = toInt($b["ID_CURSO"] ?? 0);
  $idEst = toInt($b["ID_ESTUDIANTE"] ?? 0);
  $ano = toInt($b["ANO_LECTIVO"] ?? 0);
  $periodo = clean($b["PERIODO_LECTIVO"] ?? "1");

  $estado = toInt($b["ESTADO_MATRICULA"] ?? 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 ($idEst <= 0) fail("ID_ESTUDIANTE es requerido.");
  if ($ano <= 0) fail("ANO_LECTIVO es requerido.");
  if ($periodo === "") $periodo = "1";

  $st0 = $mysqli->prepare("SELECT ID_MATRICULA FROM MATRICULAS WHERE ID_MATRICULA=? LIMIT 1");
  $st0->bind_param("i", $id);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("La matrícula no existe.");

  // curso pertenece a institución
  $stC = $mysqli->prepare("SELECT ID_CURSO FROM CURSOS WHERE ID_CURSO=? AND ID_INSTITUCION=? LIMIT 1");
  $stC->bind_param("ii", $idCurso, $idInst);
  $stC->execute();
  if (!$stC->get_result()->fetch_assoc()) fail("El curso no pertenece a esa institución.");

  // estudiante pertenece a institución
  $stE = $mysqli->prepare("SELECT ID_ESTUDIANTE FROM ESTUDIANTES WHERE ID_ESTUDIANTE=? AND ID_INSTITUCION=? LIMIT 1");
  $stE->bind_param("ii", $idEst, $idInst);
  $stE->execute();
  if (!$stE->get_result()->fetch_assoc()) fail("El estudiante no pertenece a esa institución.");

  // duplicado excepto él mismo
  $stD = $mysqli->prepare("
    SELECT ID_MATRICULA
    FROM MATRICULAS
    WHERE ID_ESTUDIANTE=? AND ID_CURSO=? AND ANO_LECTIVO=? AND PERIODO_LECTIVO=? AND ID_MATRICULA<>?
    LIMIT 1
  ");
  $stD->bind_param("iiisi", $idEst, $idCurso, $ano, $periodo, $id);
  $stD->execute();
  if ($stD->get_result()->fetch_assoc()) fail("Ya existe otra matrícula con ese estudiante/curso/año/periodo.");

  $stmt = $mysqli->prepare("
    UPDATE MATRICULAS
    SET
      ID_INSTITUCION=?,
      ID_CURSO=?,
      ID_ESTUDIANTE=?,
      ANO_LECTIVO=?,
      PERIODO_LECTIVO=?,
      ESTADO_MATRICULA=?
    WHERE ID_MATRICULA=?
    LIMIT 1
  ");
  $stmt->bind_param("iiiisii", $idInst, $idCurso, $idEst, $ano, $periodo, $estado, $id);

  if (!$stmt->execute()) fail("Error al actualizar matrícula.");

  ok([], "Matrícula 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_MATRICULA FROM MATRICULAS WHERE ID_MATRICULA=? LIMIT 1");
  $st0->bind_param("i", $id);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("La matrícula no existe.");

  $stmt = $mysqli->prepare("UPDATE MATRICULAS SET ESTADO_MATRICULA=2 WHERE ID_MATRICULA=? LIMIT 1");
  $stmt->bind_param("i", $id);
  if (!$stmt->execute()) fail("Error al inactivar matrícula.");

  ok([], "Matrícula inactivada");
}

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