<?php
// api_corp/CORP_ASIGNATURAS/asignaturas.php
// CRUD ASIGNATURAS (JWT) + CORS + Soft delete (ESTADO_ASIGNATURA=2)

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

// ✅ JWT + usuario activo
$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") {
  // opcional: ?ID_INSTITUCION=#
  $idInst = isset($_GET["ID_INSTITUCION"]) ? (int)$_GET["ID_INSTITUCION"] : 0;

  $sql = "
    SELECT
      A.ID_ASIGNATURA,
      A.ID_INSTITUCION,
      I.NOMBRE_INSTITUCION,
      A.NOMBRE_ASIGNATURA,
      A.CODIGO_ASIGNATURA,
      A.GRADO_ASIGNATURA,
      A.INTENSIDAD_HORARIA,
      A.ESTADO_ASIGNATURA,
      E.NOMBRE_ESTADO,
      A.FECHA_CREACION
    FROM ASIGNATURAS A
    INNER JOIN INSTITUCIONES I ON I.ID_INSTITUCION = A.ID_INSTITUCION
    INNER JOIN ESTADO E ON E.ID_ESTADO = A.ESTADO_ASIGNATURA
    WHERE 1=1
  ";

  if ($idInst > 0) $sql .= " AND A.ID_INSTITUCION = ? ";
  $sql .= " ORDER BY A.ID_ASIGNATURA DESC ";

  $stmt = $mysqli->prepare($sql);
  if ($idInst > 0) $stmt->bind_param("i", $idInst);
  $stmt->execute();
  $res = $stmt->get_result();

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

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

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

  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $nombre = clean($b["NOMBRE_ASIGNATURA"] ?? "");
  $codigo = clean($b["CODIGO_ASIGNATURA"] ?? "");
  $grado  = clean($b["GRADO_ASIGNATURA"] ?? "");
  $ih     = ($b["INTENSIDAD_HORARIA"] ?? null);
  $ih     = ($ih === null || $ih === "") ? null : (int)$ih;
  $estado = toInt($b["ESTADO_ASIGNATURA"] ?? 1, 1);
  if ($estado !== 1 && $estado !== 2) $estado = 1;

  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($nombre === "") fail("NOMBRE_ASIGNATURA es requerido.");

  // validar institución
  $st2 = $mysqli->prepare("SELECT ID_INSTITUCION FROM INSTITUCIONES WHERE ID_INSTITUCION = ? LIMIT 1");
  $st2->bind_param("i", $idInst);
  $st2->execute();
  $inst = $st2->get_result()->fetch_assoc();
  if (!$inst) fail("La institución no existe.");

  $stmt = $mysqli->prepare("
    INSERT INTO ASIGNATURAS
      (ID_INSTITUCION, NOMBRE_ASIGNATURA, CODIGO_ASIGNATURA, GRADO_ASIGNATURA, INTENSIDAD_HORARIA, ESTADO_ASIGNATURA)
    VALUES (?, ?, ?, ?, ?, ?)
  ");

  // bind_param no acepta null en i sin cuidado: lo pasamos como variable y dejamos que MySQL lo reciba (si es null, set a NULL vía set_null)
  // Solución simple: si $ih es null, insertamos NULL usando set_null con "i"? -> mejor: convertir a string y usar CAST no.
  // Alternativa segura: 2 queries. Aquí lo hacemos simple: si es null, usamos 0 y luego NULLIF(?,0) no aplica.
  // Mejor: usar "i" y set a NULL con $stmt->bind_param y mysqli_stmt::send_long_data no.
  // ✅ Lo resolvemos con SQL que use ? y si viene null, usamos NULL directamente mediante "s" + null? tampoco.
  // ✅ Solución práctica: si $ih es null, hacemos bind como NULL con "i" usando $stmt->bind_param y $stmt->bind_param soporta null.
  $stmt->bind_param("isssii", $idInst, $nombre, $codigo, $grado, $ih, $estado);

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

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

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

  $idAsig = toInt($b["ID_ASIGNATURA"] ?? 0);
  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $nombre = clean($b["NOMBRE_ASIGNATURA"] ?? "");
  $codigo = clean($b["CODIGO_ASIGNATURA"] ?? "");
  $grado  = clean($b["GRADO_ASIGNATURA"] ?? "");
  $ih     = ($b["INTENSIDAD_HORARIA"] ?? null);
  $ih     = ($ih === null || $ih === "") ? null : (int)$ih;
  $estado = toInt($b["ESTADO_ASIGNATURA"] ?? 1, 1);
  if ($estado !== 1 && $estado !== 2) $estado = 1;

  if ($idAsig <= 0) fail("ID_ASIGNATURA es requerido.");
  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($nombre === "") fail("NOMBRE_ASIGNATURA es requerido.");

  // validar asignatura
  $st0 = $mysqli->prepare("SELECT ID_ASIGNATURA FROM ASIGNATURAS WHERE ID_ASIGNATURA = ? LIMIT 1");
  $st0->bind_param("i", $idAsig);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("La asignatura no existe.");

  // validar institución
  $st2 = $mysqli->prepare("SELECT ID_INSTITUCION FROM INSTITUCIONES WHERE ID_INSTITUCION = ? LIMIT 1");
  $st2->bind_param("i", $idInst);
  $st2->execute();
  if (!$st2->get_result()->fetch_assoc()) fail("La institución no existe.");

  $stmt = $mysqli->prepare("
    UPDATE ASIGNATURAS
    SET
      ID_INSTITUCION = ?,
      NOMBRE_ASIGNATURA = ?,
      CODIGO_ASIGNATURA = ?,
      GRADO_ASIGNATURA = ?,
      INTENSIDAD_HORARIA = ?,
      ESTADO_ASIGNATURA = ?
    WHERE ID_ASIGNATURA = ?
    LIMIT 1
  ");
  $stmt->bind_param("isssiii", $idInst, $nombre, $codigo, $grado, $ih, $estado, $idAsig);

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

  ok([], "Asignatura actualizada");
}

// ===================== DELETE =====================
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_ASIGNATURA FROM ASIGNATURAS WHERE ID_ASIGNATURA = ? LIMIT 1");
  $st0->bind_param("i", $id);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("La asignatura no existe.");

  $stmt = $mysqli->prepare("UPDATE ASIGNATURAS SET ESTADO_ASIGNATURA = 2 WHERE ID_ASIGNATURA = ? LIMIT 1");
  $stmt->bind_param("i", $id);

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

  ok([], "Asignatura inactivada");
}

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