<?php
// recover/confirm.php — Validar código y cambiar contraseña
// POST { "rfc": "GOML850101AB1", "codigo": "123456", "nueva_password": "nuevaPass123" }

declare(strict_types=1);
require_once __DIR__ . '/../config.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    jsonErr(405, 'Método no permitido.');
}

$b              = body();
$rfc            = strtoupper(trim($b['rfc'] ?? ''));
$codigo         = trim($b['codigo'] ?? '');
$nuevaPassword  = trim($b['nueva_password'] ?? '');

if (!$rfc || !$codigo || !$nuevaPassword) {
    jsonErr(400, 'RFC, código y nueva contraseña son requeridos.');
}

if (strlen($nuevaPassword) < 6) {
    jsonErr(400, 'La contraseña debe tener al menos 6 caracteres.');
}

$pdo = getDB();

// Buscar el inversionista por RFC
$stmt = $pdo->prepare(
    "SELECT i.id_inver FROM inversionista i WHERE UPPER(i.rfc) = ? LIMIT 1"
);
$stmt->execute([$rfc]);
$row = $stmt->fetch();

if (!$row) {
    jsonErr(404, 'RFC no encontrado.');
}

$idInver = (int)$row['id_inver'];

// Buscar el código válido más reciente
$stmt2 = $pdo->prepare(
    "SELECT id, intentos FROM codigos_verificacion
     WHERE id_inver = ? AND tipo = 'reset_password' AND usado = 0 AND expira_en > NOW()
     ORDER BY creado_en DESC
     LIMIT 1"
);
$stmt2->execute([$idInver]);
$cod = $stmt2->fetch();

if (!$cod) {
    jsonErr(400, 'El código ha expirado o ya fue utilizado. Solicita uno nuevo.');
}

// Verificar intentos (máximo 5)
if ((int)$cod['intentos'] >= 5) {
    // Invalidar el código
    $pdo->prepare("UPDATE codigos_verificacion SET usado = 1 WHERE id = ?")->execute([$cod['id']]);
    jsonErr(429, 'Demasiados intentos fallidos. Solicita un nuevo código.');
}

// Verificar el código
if ($cod['id'] && $codigo !== '') {
    // Obtener el código real de la BD para comparar
    $stmtCod = $pdo->prepare("SELECT codigo FROM codigos_verificacion WHERE id = ?");
    $stmtCod->execute([$cod['id']]);
    $codReal = $stmtCod->fetchColumn();

    if ($codigo !== $codReal) {
        // Incrementar intentos
        $pdo->prepare("UPDATE codigos_verificacion SET intentos = intentos + 1 WHERE id = ?")->execute([$cod['id']]);
        $restantes = 5 - ((int)$cod['intentos'] + 1);
        jsonErr(400, "Código incorrecto. Te quedan {$restantes} intentos.");
    }
}

// Código correcto — actualizar contraseña en tabla usuario
$upd = $pdo->prepare(
    "UPDATE usuario SET passw = ? WHERE inversionista_id_inver = ?"
);
$upd->execute([$nuevaPassword, $idInver]);

if ($upd->rowCount() === 0) {
    jsonErr(500, 'No se pudo actualizar la contraseña. Contacta a soporte.');
}

// Marcar código como usado
$pdo->prepare("UPDATE codigos_verificacion SET usado = 1 WHERE id = ?")->execute([$cod['id']]);

jsonOk(['mensaje' => 'Contraseña actualizada correctamente. Ya puedes iniciar sesión.']);
