<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

require_once __DIR__ . '/../config.php';

// Autenticación via función auth() del config.php
$jwt   = auth();
$idinv = (int)$jwt['idinv'];
$db    = getDB();
$b     = body();

// Parámetros: canal = 'email' | 'sms', destino = teléfono (solo para sms)
$canal   = trim($b['canal']   ?? 'email'); // 'email' o 'sms'
$destino = trim($b['destino'] ?? '');      // número de teléfono para SMS

// Obtener datos del distribuidor
$stmt = $db->prepare("SELECT id_inver, nombre, appat, apmat, email, tel1, tel2, wa FROM inversionista WHERE id_inver = ? LIMIT 1");
$stmt->execute([$idinv]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$user) { jsonErr(404, 'Distribuidor no encontrado.'); }

$nombre = trim(($user['nombre'] ?? '') . ' ' . ($user['appat'] ?? '') . ' ' . ($user['apmat'] ?? ''));

// Crear tabla verify_codes si no existe
$db->exec("CREATE TABLE IF NOT EXISTS verify_codes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    id_inver INT NOT NULL,
    tipo VARCHAR(20) NOT NULL DEFAULT 'banco',
    codigo VARCHAR(10) NOT NULL,
    expira DATETIME NOT NULL,
    usado TINYINT(1) NOT NULL DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_inver_tipo (id_inver, tipo)
)");

// Eliminar códigos anteriores del mismo tipo
$db->prepare("DELETE FROM verify_codes WHERE id_inver = ? AND tipo = 'banco'")->execute([$idinv]);

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

$ins = $db->prepare("INSERT INTO verify_codes (id_inver, tipo, codigo, expira) VALUES (?, 'banco', ?, ?)");
$ins->execute([$idinv, $codigo, $expira]);

$apiKey = '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';

// ─── ENVÍO POR CORREO ─────────────────────────────────────────────────────────
if ($canal === 'email') {
    $email = $user['email'] ?? '';
    if (!$email) { jsonErr(400, 'El distribuidor no tiene correo registrado.'); }

    $html = '
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"></head>
<body style="font-family:Arial,sans-serif;background:#f5f5f5;margin:0;padding:20px;">
  <div style="max-width:500px;margin:0 auto;background:#fff;border-radius:12px;padding:32px;box-shadow:0 2px 8px rgba(0,0,0,0.1);">
    <h2 style="color:#1a1a2e;margin-bottom:8px;">Verificación de cambio bancario</h2>
    <p style="color:#555;">Hola <strong>' . htmlspecialchars($nombre) . '</strong>,</p>
    <p style="color:#555;">Tu código de verificación para cambiar tus datos bancarios es:</p>
    <div style="background:#f0f4ff;border-radius:8px;padding:16px;text-align:center;margin:20px 0;">
      <span style="font-size:36px;font-weight:bold;letter-spacing:8px;color:#1a1a2e;">' . $codigo . '</span>
    </div>
    <p style="color:#888;font-size:13px;">Este código expira en <strong>15 minutos</strong>.</p>
    <p style="color:#888;font-size:13px;">Si no solicitaste este cambio, ignora este correo.</p>
    <hr style="border:none;border-top:1px solid #eee;margin:24px 0;">
    <p style="color:#999;font-size:12px;">Real Rich Business &bull; Este correo fue generado automáticamente.</p>
  </div>
</body>
</html>';

    $payload = json_encode([
        'sender'      => ['name' => 'Real Rich Business', 'email' => 'noreply@productosrrb.com'],
        'to'          => [['email' => $email, 'name' => $nombre]],
        'subject'     => 'Código de verificación bancaria - Real Rich Business',
        'htmlContent' => $html,
    ]);

    $ch = curl_init('https://api.brevo.com/v3/smtp/email');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $payload,
        CURLOPT_HTTPHEADER     => [
            'accept: application/json',
            'api-key: ' . $apiKey,
            'content-type: application/json',
        ],
        CURLOPT_TIMEOUT        => 15,
        CURLOPT_SSL_VERIFYPEER => false,
    ]);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    // Enmascarar correo
    $parts = explode('@', $email);
    $mask  = substr($parts[0], 0, 3) . '***@' . ($parts[1] ?? '');

    if ($httpCode >= 200 && $httpCode < 300) {
        jsonOk(['message' => 'Código enviado a ' . $mask, 'destino_mask' => $mask, 'canal' => 'email']);
    } else {
        jsonErr(500, 'Error al enviar el correo. Intenta de nuevo.');
    }
}

// ─── ENVÍO POR SMS ────────────────────────────────────────────────────────────
elseif ($canal === 'sms') {
    // Validar que el teléfono destino sea uno de los registrados
    $telefonosPermitidos = array_filter([
        $user['tel1'] ?? '',
        $user['tel2'] ?? '',
        $user['wa']   ?? '',
    ]);

    if (!$destino) { jsonErr(400, 'Selecciona un número de teléfono para recibir el SMS.'); }

    // Normalizar: quitar espacios y guiones para comparar
    $destinoNorm = preg_replace('/[\s\-\(\)]/', '', $destino);
    $permitido   = false;
    foreach ($telefonosPermitidos as $tel) {
        $telNorm = preg_replace('/[\s\-\(\)]/', '', $tel);
        if ($telNorm === $destinoNorm || $telNorm === ltrim($destinoNorm, '+52') || ltrim($telNorm, '+52') === ltrim($destinoNorm, '+52')) {
            $permitido = true;
            break;
        }
    }
    if (!$permitido) { jsonErr(400, 'El número seleccionado no está registrado en tu perfil.'); }

    // Formatear número para México: agregar +52 si no tiene código de país
    $telefono = $destinoNorm;
    if (!str_starts_with($telefono, '+')) {
        // Si tiene 10 dígitos, asumir México
        if (strlen($telefono) === 10) {
            $telefono = '+52' . $telefono;
        } elseif (strlen($telefono) === 12 && str_starts_with($telefono, '52')) {
            $telefono = '+' . $telefono;
        }
    }

    $mensajeSms = "RRBMexico: Tu codigo de verificacion es: {$codigo}. Expira en 15 minutos. No compartas este codigo.";

    $payload = json_encode([
        'sender'    => 'RRBMexico',
        'recipient' => $telefono,
        'content'   => $mensajeSms,
        'type'      => 'transactional',
    ]);

    $ch = curl_init('https://api.brevo.com/v3/transactionalSMS/sms');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $payload,
        CURLOPT_HTTPHEADER     => [
            'accept: application/json',
            'api-key: ' . $apiKey,
            'content-type: application/json',
        ],
        CURLOPT_TIMEOUT        => 15,
        CURLOPT_SSL_VERIFYPEER => false,
    ]);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    // Enmascarar teléfono: mostrar solo últimos 4 dígitos
    $mask = '***' . substr($destinoNorm, -4);

    if ($httpCode >= 200 && $httpCode < 300) {
        jsonOk(['message' => 'Código enviado al número ' . $mask, 'destino_mask' => $mask, 'canal' => 'sms']);
    } else {
        $errData = json_decode($response, true);
        $errMsg  = $errData['message'] ?? 'Error al enviar el SMS.';
        jsonErr(500, $errMsg);
    }
}

else {
    jsonErr(400, 'Canal no válido. Usa "email" o "sms".');
}
