<?php
// api_corp/CORP_ESTUDIANTES/estudiantes.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);

// RUTAS — igual que en login_and_send_code.php pero un nivel arriba (/api_corp/)
$base_path      = __DIR__ . '/..';
$mailConfigPath = $base_path . '/mail_config.php';
$autoloaderPath = $base_path . '/vendor/autoload.php';

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

if (file_exists($mailConfigPath)) require_once($mailConfigPath);
if (file_exists($autoloaderPath)) require_once($autoloaderPath);

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

$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; }

// ============ Genera contraseña aleatoria Questia_XXXXXXXXXX ============
function generarPassword(): string {
  $chars = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789!@#$%';
  $rand  = '';
  for ($i = 0; $i < 10; $i++) {
    $rand .= $chars[random_int(0, strlen($chars) - 1)];
  }
  return 'Questia_' . $rand;
}

// ============ Envío de correo de bienvenida con PHPMailer ============
function enviarCorreoBienvenida(
  string $correo,
  string $nombreCompleto,
  string $usuario,
  string $password
): void {
  if (empty($correo)) return;

  try {
    $mail = new PHPMailer(true);

    // SMTP — misma config que login_and_send_code.php
    $mail->isSMTP();
    $mail->Host       = defined('MAIL_HOST')       ? MAIL_HOST       : 'mail.spacemail.com';
    $mail->SMTPAuth   = true;
    $mail->Username   = defined('MAIL_USERNAME')   ? MAIL_USERNAME   : '';
    $mail->Password   = defined('MAIL_PASSWORD')   ? MAIL_PASSWORD   : '';
    $mail->SMTPSecure = defined('MAIL_ENCRYPTION') ? MAIL_ENCRYPTION : 'ssl';
    $mail->Port       = defined('MAIL_PORT')       ? MAIL_PORT       : 465;

    $mail->SMTPOptions = [
      'ssl' => [
        'verify_peer'       => false,
        'verify_peer_name'  => false,
        'allow_self_signed' => true,
      ]
    ];

    $mail->CharSet = 'UTF-8';
    $mail->setFrom(
      defined('MAIL_FROM_EMAIL') ? MAIL_FROM_EMAIL : '',
      defined('MAIL_FROM_NAME')  ? MAIL_FROM_NAME  : 'Questia Online'
    );

    $mail->addAddress($correo, $nombreCompleto);
    $mail->isHTML(true);
    $mail->Subject = '=?UTF-8?B?' . base64_encode('Bienvenido a Questia Online — Tus credenciales de acceso') . '?=';
    $mail->Body    = crearTemplateCorreoBienvenida($nombreCompleto, $usuario, $password);
    $mail->AltBody = "Hola {$nombreCompleto}, bienvenido a Questia Online (Lions Quest).\n\nUsuario: {$usuario}\nContraseña: {$password}\n\nIngresa en: https://demoquilla.jhonathan.cloud/estudiante/login\n\nDebes cambiar tu contraseña en el primer inicio de sesión.";

    $mail->send();
  } catch (Exception $e) {
    error_log("Error enviando correo bienvenida estudiante: " . $e->getMessage());
  }
}

// ============ Template HTML correo de bienvenida ============
function crearTemplateCorreoBienvenida(string $nombreCompleto, string $usuario, string $password): string {
  $firstName    = htmlspecialchars(explode(' ', trim($nombreCompleto))[0] ?? 'Estudiante');
  $fullName     = htmlspecialchars($nombreCompleto);
  $usuarioSafe  = htmlspecialchars($usuario);
  $passwordSafe = htmlspecialchars($password);
  $loginUrl     = 'https://demoquilla.jhonathan.cloud/estudiante/login';

  $navy   = '#0B2E6B';
  $royal  = '#0F4AA5';
  $gold   = '#FFC400';
  $bg     = '#F5F7FB';
  $card   = '#FFFFFF';
  $muted  = '#64748B';
  $text   = '#0B1B3A';
  $border = 'rgba(11,46,107,0.14)';
  $logo   = 'https://devsoul.co/api_corp/logo.png';

  return '
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8"/>
  <meta name="viewport" content="width=device-width,initial-scale=1.0"/>
  <title>Bienvenido a Questia Online</title>
</head>
<body style="margin:0;padding:0;background:'.$bg.';font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:'.$text.';line-height:1.5;">

  <div style="display:none;max-height:0;overflow:hidden;opacity:0;color:transparent;">
    Bienvenido a Questia Online (Lions Quest). Tu usuario es '.$usuarioSafe.' y tu contraseña temporal es '.$passwordSafe.'.
  </div>

  <table role="presentation" cellpadding="0" cellspacing="0" width="100%" style="background:'.$bg.';padding:28px 12px;">
    <tr>
      <td align="center">
        <table role="presentation" cellpadding="0" cellspacing="0" width="680"
               style="max-width:680px;width:100%;background:'.$card.';border:1px solid '.$border.';border-radius:18px;overflow:hidden;box-shadow:0 18px 60px rgba(2,6,23,0.10);">

          <!-- Barra superior degradado -->
          <tr>
            <td style="height:8px;background:linear-gradient(90deg,'.$navy.' 0%,'.$royal.' 45%,'.$gold.' 100%);"></td>
          </tr>

          <!-- Header -->
          <tr>
            <td style="padding:26px 28px 18px;background:linear-gradient(180deg,#ffffff 0%,rgba(15,74,165,0.04) 100%);border-bottom:1px solid '.$border.';">
              <table role="presentation" cellpadding="0" cellspacing="0" width="100%">
                <tr>
                  <td valign="middle">
                    <div style="font-size:11px;letter-spacing:0.18em;text-transform:uppercase;color:'.$muted.';font-weight:700;">
                      Questia Online · Lions Quest
                    </div>
                    <div style="font-size:16px;color:'.$text.';font-weight:900;margin-top:3px;">
                      ¡Bienvenido/a a la plataforma educativa!
                    </div>
                  </td>
                  <td align="right" valign="middle">
                    <img src="'.$logo.'" alt="Questia" height="38"
                         style="display:block;height:38px;max-width:150px;object-fit:contain;opacity:0.95;"/>
                  </td>
                </tr>
              </table>
            </td>
          </tr>

          <!-- Body -->
          <tr>
            <td style="padding:28px 28px;">

              <h1 style="margin:0 0 10px;font-size:22px;line-height:1.25;color:'.$text.';font-weight:900;">
                Tu cuenta está lista, '.$firstName.'
              </h1>

              <p style="margin:0 0 16px;font-size:15px;color:'.$muted.';">
                Has sido registrado/a en <strong>Questia Online</strong> (Lions Quest).
                A continuación encontrarás tus credenciales de acceso:
              </p>

              <!-- Credenciales -->
              <div style="border:1px solid '.$border.';border-radius:14px;background:rgba(15,74,165,0.05);padding:22px 20px;">
                <table role="presentation" cellpadding="0" cellspacing="0" width="100%">

                  <!-- Usuario -->
                  <tr>
                    <td style="padding-bottom:14px;">
                      <div style="font-size:11px;color:'.$muted.';font-weight:700;letter-spacing:0.08em;text-transform:uppercase;margin-bottom:4px;">
                        Usuario (cédula)
                      </div>
                      <div style="font-size:26px;font-weight:900;color:'.$navy.';letter-spacing:3px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;">
                        '.$usuarioSafe.'
                      </div>
                    </td>
                  </tr>

                  <!-- Contraseña -->
                  <tr>
                    <td style="border-top:1px solid '.$border.';padding-top:14px;padding-bottom:18px;">
                      <div style="font-size:11px;color:'.$muted.';font-weight:700;letter-spacing:0.08em;text-transform:uppercase;margin-bottom:4px;">
                        Contraseña temporal
                      </div>
                      <div style="font-size:26px;font-weight:900;color:'.$navy.';letter-spacing:3px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;">
                        '.$passwordSafe.'
                      </div>
                    </td>
                  </tr>


                


                  <!-- Botón login -->
                  <tr>
                    <td style="border-top:1px solid '.$border.';padding-top:18px;text-align:center;">
                      <a href="'.$loginUrl.'"
                         style="display:inline-block;padding:13px 32px;background:linear-gradient(90deg,'.$navy.' 0%,'.$royal.' 100%);color:#ffffff;font-size:15px;font-weight:900;border-radius:10px;text-decoration:none;letter-spacing:0.03em;">
                        Ingresar a Questia Online →
                      </a>
                    </td>
                  </tr>

                </table>
              </div>

              <!-- Aviso cambio de contraseña -->
              <div style="margin:18px 0 0;border:1px solid rgba(255,196,0,0.55);background:rgba(255,196,0,0.14);border-radius:14px;padding:14px;">
                <div style="font-size:14px;font-weight:900;color:'.$text.';margin-bottom:5px;">
                  ⚠️ Cambia tu contraseña al ingresar por primera vez
                </div>
                <div style="font-size:13px;color:'.$muted.';">
                  Por seguridad, el sistema te pedirá establecer una contraseña personalizada en tu primer inicio de sesión.
                </div>
              </div>

              <!-- Info plataforma -->
              <div style="margin:18px 0 0;border-left:4px solid '.$royal.';background:rgba(30,102,208,0.06);border-radius:12px;padding:14px;">
                <div style="font-size:14px;font-weight:900;color:'.$text.';margin-bottom:5px;">Sobre la plataforma</div>
                <div style="font-size:13px;color:'.$muted.';">
                  Questia Online apoya la implementación del programa <strong>Lions Quest</strong> con recursos y
                  seguimiento del proyecto educativo (cátedra emocional), desde un aplicativo web responsive.
                </div>
              </div>

              <!-- Seguridad -->
              <div style="margin:18px 0 0;border:1px solid rgba(239,68,68,0.20);background:rgba(239,68,68,0.06);border-radius:14px;padding:14px;">
                <div style="font-size:14px;font-weight:900;color:#991b1b;margin-bottom:5px;">No compartas tus credenciales</div>
                <div style="font-size:13px;color:'.$muted.';">
                  El equipo de Questia Online / Lions Quest <strong>nunca</strong> te pedirá tu contraseña por chat, llamada o correo.
                </div>
              </div>

              <p style="margin:18px 0 0;font-size:13px;color:'.$muted.';">
                Si no esperabas este mensaje, comunícate con el administrador de tu institución.
              </p>
            </td>
          </tr>

          <!-- Footer -->
          <tr>
            <td style="padding:18px 28px;background:rgba(11,46,107,0.04);border-top:1px solid '.$border.';">
              <table role="presentation" cellpadding="0" cellspacing="0" width="100%">
                <tr>
                  <td valign="middle">
                    <div style="font-size:13px;color:'.$text.';">
                      Saludos,<br/>
                      <strong>Equipo Questia Online — Lions Quest</strong>
                    </div>
                    <div style="margin-top:8px;font-size:12px;color:'.$muted.';">
                      Este mensaje fue enviado a <strong>'.$fullName.'</strong>.
                      Por seguridad, no reenvíes este correo.
                    </div>
                  </td>
                  <td align="right" valign="middle">
                    <img src="'.$logo.'" alt="Questia" height="30"
                         style="display:block;height:30px;max-width:140px;object-fit:contain;opacity:0.90;"/>
                  </td>
                </tr>
              </table>
              <div style="margin-top:14px;padding-top:12px;border-top:1px solid '.$border.';font-size:11px;color:#94A3B8;">
                Lions — Questia · Bogotá, Colombia
              </div>
            </td>
          </tr>

        </table>

        <div style="max-width:680px;width:100%;margin-top:10px;font-size:11px;color:#94A3B8;text-align:center;">
          Si tienes dudas sobre este correo, comunícate con el administrador de tu institución.
        </div>
      </td>
    </tr>
  </table>
</body>
</html>';
}

$method = $_SERVER["REQUEST_METHOD"];

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

  $sql = "
    SELECT
      E.ID_ESTUDIANTE,
      E.ID_INSTITUCION,
      I.NOMBRE_INSTITUCION,
      E.NOMBRE_ESTUDIANTE,
      E.APELLIDO_ESTUDIANTE,
      E.TIPO_DOCUMENTO_ESTUDIANTE,
      E.DOCUMENTO_ESTUDIANTE,
      E.FECHA_NACIMIENTO,
      E.GENERO_ESTUDIANTE,
      E.TELEFONO_ESTUDIANTE,
      E.CORREO_ESTUDIANTE,
      E.DIRECCION_ESTUDIANTE,
      E.FOTO_ESTUDIANTE,
      E.ESTADO_ESTUDIANTE,
      ES.NOMBRE_ESTADO,
      E.FECHA_CREACION
    FROM ESTUDIANTES E
    INNER JOIN INSTITUCIONES I ON I.ID_INSTITUCION = E.ID_INSTITUCION
    INNER JOIN ESTADO ES ON ES.ID_ESTADO = E.ESTADO_ESTUDIANTE
    WHERE 1=1
  ";

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

  if ($idInst > 0) {
    $sql .= " AND E.ID_INSTITUCION = ?";
    $types .= "i";
    $params[] = $idInst;
  }

  $sql .= " ORDER BY E.ID_ESTUDIANTE 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 estudiantes");
}

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

  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $nom    = clean($b["NOMBRE_ESTUDIANTE"] ?? "");
  $ape    = clean($b["APELLIDO_ESTUDIANTE"] ?? "");
  $td     = clean($b["TIPO_DOCUMENTO_ESTUDIANTE"] ?? "CC");
  $doc    = clean($b["DOCUMENTO_ESTUDIANTE"] ?? "");
  $fn     = clean($b["FECHA_NACIMIENTO"] ?? "");
  $gen    = clean($b["GENERO_ESTUDIANTE"] ?? "");
  $tel    = clean($b["TELEFONO_ESTUDIANTE"] ?? "");
  $cor    = clean($b["CORREO_ESTUDIANTE"] ?? "");
  $dir    = clean($b["DIRECCION_ESTUDIANTE"] ?? "");
  $foto   = $b["FOTO_ESTUDIANTE"] ?? null;

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

  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($nom === "")  fail("NOMBRE_ESTUDIANTE es requerido.");
  if ($ape === "")  fail("APELLIDO_ESTUDIANTE es requerido.");
  if ($doc === "")  fail("DOCUMENTO_ESTUDIANTE es requerido.");

  // Duplicado por institución + documento
  $stDup = $mysqli->prepare("SELECT ID_ESTUDIANTE FROM ESTUDIANTES WHERE ID_INSTITUCION=? AND DOCUMENTO_ESTUDIANTE=? LIMIT 1");
  $stDup->bind_param("is", $idInst, $doc);
  $stDup->execute();
  if ($stDup->get_result()->fetch_assoc()) fail("Ya existe un estudiante con ese documento en esa institución.");

  // Insertar estudiante
  $fn_db = ($fn === "") ? null : $fn;

  $stmt = $mysqli->prepare("
    INSERT INTO ESTUDIANTES
      (ID_INSTITUCION, NOMBRE_ESTUDIANTE, APELLIDO_ESTUDIANTE, TIPO_DOCUMENTO_ESTUDIANTE, DOCUMENTO_ESTUDIANTE,
       FECHA_NACIMIENTO, GENERO_ESTUDIANTE, TELEFONO_ESTUDIANTE, CORREO_ESTUDIANTE, DIRECCION_ESTUDIANTE,
       FOTO_ESTUDIANTE, ESTADO_ESTUDIANTE)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  ");
  $stmt->bind_param(
    "issssssssssi",
    $idInst, $nom, $ape, $td, $doc,
    $fn_db, $gen, $tel, $cor, $dir,
    $foto, $estado
  );

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

  $newId = $mysqli->insert_id;

  // Crear credenciales en ESTUDIANTES_AUTH
  $plainPass = generarPassword();
  $passHash  = password_hash($plainPass, PASSWORD_BCRYPT);

  $stAuth = $mysqli->prepare("
    INSERT INTO ESTUDIANTES_AUTH (ID_ESTUDIANTE, PASSWORD_HASH, DEBE_CAMBIAR_PASS)
    VALUES (?, ?, 1)
  ");
  $stAuth->bind_param("is", $newId, $passHash);

  if (!$stAuth->execute()) {
    $mysqli->query("DELETE FROM ESTUDIANTES WHERE ID_ESTUDIANTE = $newId");
    fail("Error al crear credenciales del estudiante.");
  }

  // Enviar correo de bienvenida
  enviarCorreoBienvenida($cor, "$nom $ape", $doc, $plainPass);

  ok(["id" => $newId], "Estudiante creado y credenciales enviadas por correo");
}

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

  $id = toInt($b["ID_ESTUDIANTE"] ?? 0);
  if ($id <= 0) fail("ID_ESTUDIANTE es requerido.");

  $idInst = toInt($b["ID_INSTITUCION"] ?? 0);
  $nom    = clean($b["NOMBRE_ESTUDIANTE"] ?? "");
  $ape    = clean($b["APELLIDO_ESTUDIANTE"] ?? "");
  $td     = clean($b["TIPO_DOCUMENTO_ESTUDIANTE"] ?? "CC");
  $doc    = clean($b["DOCUMENTO_ESTUDIANTE"] ?? "");
  $fn     = clean($b["FECHA_NACIMIENTO"] ?? "");
  $gen    = clean($b["GENERO_ESTUDIANTE"] ?? "");
  $tel    = clean($b["TELEFONO_ESTUDIANTE"] ?? "");
  $cor    = clean($b["CORREO_ESTUDIANTE"] ?? "");
  $dir    = clean($b["DIRECCION_ESTUDIANTE"] ?? "");
  $foto   = $b["FOTO_ESTUDIANTE"] ?? null;

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

  if ($idInst <= 0) fail("ID_INSTITUCION es requerido.");
  if ($nom === "")  fail("NOMBRE_ESTUDIANTE es requerido.");
  if ($ape === "")  fail("APELLIDO_ESTUDIANTE es requerido.");
  if ($doc === "")  fail("DOCUMENTO_ESTUDIANTE es requerido.");

  $st0 = $mysqli->prepare("SELECT ID_ESTUDIANTE FROM ESTUDIANTES WHERE ID_ESTUDIANTE=? LIMIT 1");
  $st0->bind_param("i", $id);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("El estudiante no existe.");

  $stDup = $mysqli->prepare("
    SELECT ID_ESTUDIANTE FROM ESTUDIANTES
    WHERE ID_INSTITUCION=? AND DOCUMENTO_ESTUDIANTE=? AND ID_ESTUDIANTE<>? LIMIT 1
  ");
  $stDup->bind_param("isi", $idInst, $doc, $id);
  $stDup->execute();
  if ($stDup->get_result()->fetch_assoc()) fail("Ya existe otro estudiante con ese documento en esa institución.");

  $fn_db = ($fn === "") ? null : $fn;

  $stmt = $mysqli->prepare("
    UPDATE ESTUDIANTES SET
      ID_INSTITUCION=?, NOMBRE_ESTUDIANTE=?, APELLIDO_ESTUDIANTE=?,
      TIPO_DOCUMENTO_ESTUDIANTE=?, DOCUMENTO_ESTUDIANTE=?, FECHA_NACIMIENTO=?,
      GENERO_ESTUDIANTE=?, TELEFONO_ESTUDIANTE=?, CORREO_ESTUDIANTE=?,
      DIRECCION_ESTUDIANTE=?, FOTO_ESTUDIANTE=?, ESTADO_ESTUDIANTE=?
    WHERE ID_ESTUDIANTE=? LIMIT 1
  ");
  $stmt->bind_param(
    "issssssssssii",
    $idInst, $nom, $ape, $td, $doc,
    $fn_db, $gen, $tel, $cor, $dir,
    $foto, $estado, $id
  );

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

  ok([], "Estudiante 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_ESTUDIANTE FROM ESTUDIANTES WHERE ID_ESTUDIANTE=? LIMIT 1");
  $st0->bind_param("i", $id);
  $st0->execute();
  if (!$st0->get_result()->fetch_assoc()) fail("El estudiante no existe.");

  $stmt = $mysqli->prepare("UPDATE ESTUDIANTES SET ESTADO_ESTUDIANTE=2 WHERE ID_ESTUDIANTE=? LIMIT 1");
  $stmt->bind_param("i", $id);
  if (!$stmt->execute()) fail("Error al inactivar estudiante.");

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

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