<?php
// api_corp/CORP_DOCENTES/docentes.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");

// ? Auth
$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;

  $sql = "
    SELECT
      D.ID_DOCENTE,
      D.ID_INSTITUCION,
      I.NOMBRE_INSTITUCION,
      D.NOMBRE_DOCENTE,
      D.APELLIDO_DOCENTE,
      D.TIPO_DOCUMENTO_DOCENTE,
      D.DOCUMENTO_DOCENTE,
      D.CORREO_DOCENTE,
      D.TELEFONO_DOCENTE,
      D.DIRECCION_DOCENTE,
      D.ESPECIALIDAD_DOCENTE,
      D.ESTADO_DOCENTE,
      E.NOMBRE_ESTADO,
      D.FECHA_CREACION
    FROM DOCENTES D
    INNER JOIN INSTITUCIONES I ON I.ID_INSTITUCION = D.ID_INSTITUCION
    INNER JOIN ESTADO E ON E.ID_ESTADO = D.ESTADO_DOCENTE
    WHERE 1=1
  ";

  if ($idInst > 0) $sql .= " AND D.ID_INSTITUCION = ? ";
  $sql .= " ORDER BY D.ID_DOCENTE 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 docentes");
}

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

  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $nombre = clean($b["NOMBRE_DOCENTE"] ?? "");
  $apellido = clean($b["APELLIDO_DOCENTE"] ?? "");
  $tipoDoc = toInt($b["TIPO_DOCUMENTO_DOCENTE"] ?? 1, 1);
  $doc = clean($b["DOCUMENTO_DOCENTE"] ?? "");
  $correo = clean($b["CORREO_DOCENTE"] ?? "");
  $tel = clean($b["TELEFONO_DOCENTE"] ?? "");
  $dir = clean($b["DIRECCION_DOCENTE"] ?? "");
  $esp = clean($b["ESPECIALIDAD_DOCENTE"] ?? "");
  $estado = toInt($b["ESTADO_DOCENTE"] ?? 1, 1);
  if ($estado !== 1 && $estado !== 2) $estado = 1;

  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($nombre === "") fail("NOMBRE_DOCENTE es requerido.");
  if ($apellido === "") fail("APELLIDO_DOCENTE es requerido.");
  if ($doc === "") fail("DOCUMENTO_DOCENTE 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();
  if (!$st2->get_result()->fetch_assoc()) fail("La institución no existe.");

  // validar duplicado documento
  $st3 = $mysqli->prepare("SELECT ID_DOCENTE FROM DOCENTES WHERE TIPO_DOCUMENTO_DOCENTE=? AND DOCUMENTO_DOCENTE=? LIMIT 1");
  $st3->bind_param("is", $tipoDoc, $doc);
  $st3->execute();
  if ($st3->get_result()->fetch_assoc()) fail("Ya existe un docente con ese documento.");

  $stmt = $mysqli->prepare("
    INSERT INTO DOCENTES
      (ID_INSTITUCION, NOMBRE_DOCENTE, APELLIDO_DOCENTE, TIPO_DOCUMENTO_DOCENTE, DOCUMENTO_DOCENTE,
       CORREO_DOCENTE, TELEFONO_DOCENTE, DIRECCION_DOCENTE, ESPECIALIDAD_DOCENTE, ESTADO_DOCENTE)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  ");
  $stmt->bind_param(
    "ississsssi",
    $idInst, $nombre, $apellido, $tipoDoc, $doc,
    $correo, $tel, $dir, $esp, $estado
  );

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

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

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

  $id = toInt($b["ID_DOCENTE"] ?? 0);
  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $nombre = clean($b["NOMBRE_DOCENTE"] ?? "");
  $apellido = clean($b["APELLIDO_DOCENTE"] ?? "");
  $tipoDoc = toInt($b["TIPO_DOCUMENTO_DOCENTE"] ?? 1, 1);
  $doc = clean($b["DOCUMENTO_DOCENTE"] ?? "");
  $correo = clean($b["CORREO_DOCENTE"] ?? "");
  $tel = clean($b["TELEFONO_DOCENTE"] ?? "");
  $dir = clean($b["DIRECCION_DOCENTE"] ?? "");
  $esp = clean($b["ESPECIALIDAD_DOCENTE"] ?? "");
  $estado = toInt($b["ESTADO_DOCENTE"] ?? 1, 1);
  if ($estado !== 1 && $estado !== 2) $estado = 1;

  if ($id <= 0) fail("ID_DOCENTE es requerido.");
  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($nombre === "") fail("NOMBRE_DOCENTE es requerido.");
  if ($apellido === "") fail("APELLIDO_DOCENTE es requerido.");
  if ($doc === "") fail("DOCUMENTO_DOCENTE es requerido.");

  $st0 = $mysqli->prepare("SELECT ID_DOCENTE FROM DOCENTES WHERE ID_DOCENTE=? LIMIT 1");
  $st0->bind_param("i", $id);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("El docente 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.");

  // validar duplicado documento (excepto el mismo)
  $st3 = $mysqli->prepare("
    SELECT ID_DOCENTE FROM DOCENTES
    WHERE TIPO_DOCUMENTO_DOCENTE=? AND DOCUMENTO_DOCENTE=? AND ID_DOCENTE<>?
    LIMIT 1
  ");
  $st3->bind_param("isi", $tipoDoc, $doc, $id);
  $st3->execute();
  if ($st3->get_result()->fetch_assoc()) fail("Ya existe otro docente con ese documento.");

  $stmt = $mysqli->prepare("
    UPDATE DOCENTES
    SET
      ID_INSTITUCION=?,
      NOMBRE_DOCENTE=?,
      APELLIDO_DOCENTE=?,
      TIPO_DOCUMENTO_DOCENTE=?,
      DOCUMENTO_DOCENTE=?,
      CORREO_DOCENTE=?,
      TELEFONO_DOCENTE=?,
      DIRECCION_DOCENTE=?,
      ESPECIALIDAD_DOCENTE=?,
      ESTADO_DOCENTE=?
    WHERE ID_DOCENTE=?
    LIMIT 1
  ");
  $stmt->bind_param(
    "ississsssii",
    $idInst, $nombre, $apellido, $tipoDoc, $doc,
    $correo, $tel, $dir, $esp, $estado,
    $id
  );

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

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

// ===================== 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_DOCENTE FROM DOCENTES WHERE ID_DOCENTE=? LIMIT 1");
  $st0->bind_param("i", $id);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("El docente no existe.");

  $stmt = $mysqli->prepare("UPDATE DOCENTES SET ESTADO_DOCENTE=2 WHERE ID_DOCENTE=? LIMIT 1");
  $stmt->bind_param("i", $id);

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

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

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