<?php
// api_corp/CORP_CURSOS/cursos.php
// CRUD CURSOS (JWT) + CORS + Soft delete (ESTADO_CURSO=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;
}

// ===================== Routes =====================
$method = $_SERVER["REQUEST_METHOD"];

if ($method === "GET") {
  // GET: listar cursos
  // opcional: ?ID_INSTITUCION=#
  $idInst = isset($_GET["ID_INSTITUCION"]) ? (int)$_GET["ID_INSTITUCION"] : 0;

  $sql = "
    SELECT
      C.ID_CURSO,
      C.ID_INSTITUCION,
      I.NOMBRE_INSTITUCION,
      C.NOMBRE_CURSO,
      C.GRADO_CURSO,
      C.JORNADA_CURSO,
      C.ESTADO_CURSO,
      E.NOMBRE_ESTADO,
      C.FECHA_CREACION
    FROM CURSOS C
    INNER JOIN INSTITUCIONES I ON I.ID_INSTITUCION = C.ID_INSTITUCION
    INNER JOIN ESTADO E ON E.ID_ESTADO = C.ESTADO_CURSO
    WHERE 1=1
  ";

  if ($idInst > 0) {
    $sql .= " AND C.ID_INSTITUCION = ? ";
  }

  $sql .= " ORDER BY C.ID_CURSO 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 cursos");
}

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

  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $nombre = clean($b["NOMBRE_CURSO"] ?? "");
  $grado  = clean($b["GRADO_CURSO"] ?? "");
  $jornada = clean($b["JORNADA_CURSO"] ?? "");
  $estado = toInt($b["ESTADO_CURSO"] ?? 1, 1);

  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($nombre === "") fail("NOMBRE_CURSO es requerido.");
  if ($grado === "") fail("GRADO_CURSO es requerido.");
  if ($estado !== 1 && $estado !== 2) $estado = 1;

  // Validar institución existe
  $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 CURSOS (ID_INSTITUCION, NOMBRE_CURSO, GRADO_CURSO, JORNADA_CURSO, ESTADO_CURSO)
    VALUES (?, ?, ?, ?, ?)
  ");
  $stmt->bind_param("isssi", $idInst, $nombre, $grado, $jornada, $estado);

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

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

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

  $idCurso = toInt($b["ID_CURSO"] ?? 0);
  $idInst  = toInt($b["ID_INSTITUCION"] ?? 0);
  $nombre  = clean($b["NOMBRE_CURSO"] ?? "");
  $grado   = clean($b["GRADO_CURSO"] ?? "");
  $jornada = clean($b["JORNADA_CURSO"] ?? "");
  $estado  = toInt($b["ESTADO_CURSO"] ?? 1, 1);

  if ($idCurso <= 0) fail("ID_CURSO es requerido.");
  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($nombre === "") fail("NOMBRE_CURSO es requerido.");
  if ($grado === "") fail("GRADO_CURSO es requerido.");
  if ($estado !== 1 && $estado !== 2) $estado = 1;

  // Validar curso existe
  $st0 = $mysqli->prepare("SELECT ID_CURSO FROM CURSOS WHERE ID_CURSO = ? LIMIT 1");
  $st0->bind_param("i", $idCurso);
  $st0->execute();
  $curso = $st0->get_result()->fetch_assoc();
  if (!$curso) fail("El curso no existe.");

  // Validar institución existe
  $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("
    UPDATE CURSOS
    SET ID_INSTITUCION = ?, NOMBRE_CURSO = ?, GRADO_CURSO = ?, JORNADA_CURSO = ?, ESTADO_CURSO = ?
    WHERE ID_CURSO = ?
    LIMIT 1
  ");
  $stmt->bind_param("isssii", $idInst, $nombre, $grado, $jornada, $estado, $idCurso);

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

  ok([], "Curso actualizado");
}

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

  // Validar existe
  $st0 = $mysqli->prepare("SELECT ID_CURSO FROM CURSOS WHERE ID_CURSO = ? LIMIT 1");
  $st0->bind_param("i", $idCurso);
  $st0->execute();
  $curso = $st0->get_result()->fetch_assoc();
  if (!$curso) fail("El curso no existe.");

  // Inactivar => ESTADO_CURSO = 2
  $stmt = $mysqli->prepare("UPDATE CURSOS SET ESTADO_CURSO = 2 WHERE ID_CURSO = ? LIMIT 1");
  $stmt->bind_param("i", $idCurso);

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

  ok([], "Curso inactivado");
}

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