<?php
// api_corp/CORP_EVALUACIONES/cambiar_password.php
// POST { nueva_password, confirmar_password }
// Requiere JWT de estudiante en header Authorization: Bearer {token}

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Content-Type: application/json; charset=utf-8");

if ($_SERVER["REQUEST_METHOD"] === "OPTIONS") { http_response_code(200); exit; }

ini_set('display_errors', 0);
error_reporting(E_ALL);

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

function ok($data = [], $message = "OK") {
    echo json_encode(array_merge(["success" => true, "message" => $message], $data)); exit;
}
function fail($message, $code = 400) {
    http_response_code($code);
    echo json_encode(["success" => false, "message" => $message]); exit;
}
function decodeJWT($token, $key) {
    $parts = explode(".", $token);
    if (count($parts) !== 3) return null;
    $payload = json_decode(base64_decode($parts[1]), true);
    $sig = base64_encode(hash_hmac("sha256", "$parts[0].$parts[1]", $key, true));
    if ($sig !== $parts[2]) return null;
    if (isset($payload["exp"]) && $payload["exp"] < time()) return null;
    return $payload;
}

if ($_SERVER["REQUEST_METHOD"] !== "POST") fail("Método no permitido.", 405);

// -- Validar JWT --
$authHeader = $_SERVER["HTTP_AUTHORIZATION"] ?? "";
if (!preg_match('/Bearer\s+(.+)/i', $authHeader, $m)) fail("Token requerido.", 401);
$payload = decodeJWT($m[1], $JWT_KEY);
if (!$payload || ($payload["userRole"] ?? "") !== "ESTUDIANTE") fail("Acceso no autorizado.", 403);

$idEstudiante = (int)($payload["userId"] ?? 0);
if (!$idEstudiante) fail("Token inválido.", 401);

// -- Body --
$body            = json_decode(file_get_contents("php://input"), true) ?: [];
$nuevaPassword   = trim($body["nueva_password"]    ?? "");
$confirmarPassword = trim($body["confirmar_password"] ?? "");

if ($nuevaPassword === "")        fail("La nueva contraseña es requerida.");
if (strlen($nuevaPassword) < 6)   fail("La contraseña debe tener al menos 6 caracteres.");
if ($nuevaPassword !== $confirmarPassword) fail("Las contraseñas no coinciden.");

// -- Verificar que el estudiante existe en ESTUDIANTES_AUTH --
$st = $mysqli->prepare("SELECT ID_AUTH FROM ESTUDIANTES_AUTH WHERE ID_ESTUDIANTE = ?");
if (!$st) fail("Error interno.");
$st->bind_param("i", $idEstudiante);
$st->execute();
$auth = $st->get_result()->fetch_assoc();
if (!$auth) fail("Registro de autenticación no encontrado.", 404);

// -- Actualizar contraseña --
$hash = password_hash($nuevaPassword, PASSWORD_BCRYPT);
$upd  = $mysqli->prepare("
    UPDATE ESTUDIANTES_AUTH
    SET PASSWORD_HASH = ?, DEBE_CAMBIAR_PASS = 0, ULTIMO_ACCESO = NOW()
    WHERE ID_ESTUDIANTE = ?
");
if (!$upd) fail("Error interno al actualizar.");
$upd->bind_param("si", $hash, $idEstudiante);
$upd->execute();

if ($upd->affected_rows === 0) fail("No se pudo actualizar la contraseña.");

ok([], "Contraseña actualizada correctamente.");