<?php
// recover/request.php — Solicitar código de verificación para recuperar contraseña
// POST { "rfc": "GOML850101AB1" }  ó  { "referencia": "REF001" }
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'] ?? ''));
$referencia = strtoupper(trim($b['referencia'] ?? ''));

if (!$rfc && !$referencia) {
    jsonErr(400, 'Se requiere el RFC o la referencia del distribuidor.');
}

$pdo = getDB();

// Buscar el inversionista por RFC o por referencia
if ($rfc) {
    $stmt = $pdo->prepare(
        "SELECT i.id_inver, i.email, u.nom_usr
         FROM inversionista i
         JOIN usuario u ON u.inversionista_id_inver = i.id_inver
         WHERE UPPER(i.rfc) = ?
         LIMIT 1"
    );
    $stmt->execute([$rfc]);
} else {
    $stmt = $pdo->prepare(
        "SELECT i.id_inver, i.email, u.nom_usr
         FROM inversionista i
         JOIN usuario u ON u.inversionista_id_inver = i.id_inver
         WHERE UPPER(i.referencia) = ?
         LIMIT 1"
    );
    $stmt->execute([$referencia]);
}

$row = $stmt->fetch();
if (!$row) {
    jsonErr(404, 'No se encontró ninguna cuenta con los datos proporcionados.');
}

$idInver = (int)$row['id_inver'];
$correo  = trim($row['email'] ?? '');

if (!$correo || !filter_var($correo, FILTER_VALIDATE_EMAIL)) {
    jsonErr(422, 'Esta cuenta no tiene un correo electrónico registrado. Contacta a tu centro de distribución.');
}

// Invalidar códigos anteriores del mismo tipo para este usuario
$pdo->prepare(
    "UPDATE codigos_verificacion SET usado = 1 WHERE id_inver = ? AND tipo = 'reset_password' AND usado = 0"
)->execute([$idInver]);

// Generar código de 6 dígitos
$codigo   = str_pad((string)random_int(0, 999999), 6, '0', STR_PAD_LEFT);
$expiraEn = date('Y-m-d H:i:s', time() + 900); // 15 minutos

// Guardar en BD
$ins = $pdo->prepare(
    "INSERT INTO codigos_verificacion (id_inver, tipo, codigo, expira_en) VALUES (?, 'reset_password', ?, ?)"
);
$ins->execute([$idInver, $codigo, $expiraEn]);

// Enviar correo con el código via SMTP SSL
$enviado   = false;
$smtpError = '';

try {
    $errno  = 0;
    $errstr = '';
    $smtp   = @fsockopen('ssl://mail.sistemarrb.com', 465, $errno, $errstr, 15);

    if (!$smtp) {
        $smtpError = "fsockopen failed: {$errno} {$errstr}";
    } else {
        fgets($smtp, 512); // Banner

        $send = function(string $cmd) use ($smtp): string {
            fwrite($smtp, $cmd . "\r\n");
            $resp = '';
            while (true) {
                $line = fgets($smtp, 512);
                if ($line === false) break;
                $resp .= $line;
                if (strlen($line) >= 4 && $line[3] === ' ') break;
            }
            return $resp;
        };

        $send('EHLO sistemarrb.com');
        $send('AUTH LOGIN');
        $send(base64_encode('nocontestar@sistemarrb.com'));
        $r = $send(base64_encode('Mikel123*'));

        if (str_starts_with(trim($r), '235')) {
            $send('MAIL FROM:<nocontestar@sistemarrb.com>');
            $send("RCPT TO:<{$correo}>");
            $send('DATA');

            $asunto = '=?UTF-8?B?' . base64_encode('Código de verificación - Real Rich Business') . '?=';
            $cuerpo  = "Hola,\r\n\r\n";
            $cuerpo .= "Tu código de verificación para restablecer tu contraseña es:\r\n\r\n";
            $cuerpo .= "    {$codigo}\r\n\r\n";
            $cuerpo .= "Este código es válido por 15 minutos.\r\n\r\n";
            $cuerpo .= "Si no solicitaste este código, ignora este mensaje.\r\n\r\n";
            $cuerpo .= "Real Rich Business\r\n";

            $msg  = "From: Real Rich Business <nocontestar@sistemarrb.com>\r\n";
            $msg .= "To: {$correo}\r\n";
            $msg .= "Subject: {$asunto}\r\n";
            $msg .= "MIME-Version: 1.0\r\n";
            $msg .= "Content-Type: text/plain; charset=UTF-8\r\n";
            $msg .= "Content-Transfer-Encoding: base64\r\n";
            $msg .= "\r\n";
            $msg .= chunk_split(base64_encode($cuerpo));
            $msg .= "\r\n.";

            $r2 = $send($msg);
            if (str_starts_with(trim($r2), '250')) {
                $enviado = true;
            } else {
                $smtpError = "DATA response: " . trim($r2);
            }
            $send('QUIT');
        } else {
            $smtpError = "AUTH failed: " . trim($r);
        }
        fclose($smtp);
    }
} catch (\Throwable $e) {
    $smtpError = $e->getMessage();
}

// Fallback a mail() nativo si SMTP falló
if (!$enviado) {
    $asunto2 = 'Código de verificación - Real Rich Business';
    $cuerpo2 = "Tu código de verificación es: {$codigo}\n\nVálido por 15 minutos.\n\nReal Rich Business";
    $hdrs    = "From: nocontestar@sistemarrb.com\r\nContent-Type: text/plain; charset=UTF-8";
    $enviado = @mail($correo, $asunto2, $cuerpo2, $hdrs);
}

if (!$enviado) {
    // Limpiar el código no enviado
    $pdo->prepare(
        "UPDATE codigos_verificacion SET usado = 1 WHERE id_inver = ? AND tipo = 'reset_password' AND codigo = ?"
    )->execute([$idInver, $codigo]);
    jsonErr(500, 'No se pudo enviar el correo de verificación. Verifica que tu correo esté registrado correctamente o contacta a tu centro de distribución.');
}

// Enmascarar correo: jua***@gmail.com
$partes  = explode('@', $correo);
$local   = $partes[0];
$dominio = $partes[1] ?? '';
$visible = substr($local, 0, min(3, strlen($local)));
$mascara = $visible . str_repeat('*', max(3, strlen($local) - 3)) . '@' . $dominio;

jsonOk([
    'correo_enmascarado' => $mascara,
    'mensaje'            => 'Código enviado correctamente.',
]);
