<?php
declare(strict_types=1);

/**
 * Recebe o formulário da landing e repassa o lead para o CRM parceiro
 * (POST {PARTNER_API_BASE}/lead/register), gravando o resultado localmente
 * para o painel /admin.
 */

require __DIR__ . '/config.php';
require __DIR__ . '/i18n.php';
require __DIR__ . '/partner_api.php';
require __DIR__ . '/lead_store.php';

session_start();
$locale = current_locale();

// A landing envia via fetch() com este header; nesse caso respondemos JSON e o
// JS só dispara a conversão da Meta quando o retorno for {status:'ok'}. Sem o
// header (JS desligado / submit normal) mantemos o redirect com flash de antes.
$isAjax = (($_SERVER['HTTP_X_REQUESTED_WITH'] ?? '') === 'XMLHttpRequest')
    || (($_POST['ajax'] ?? '') === '1');

function back(string $locale, string $status, string $msg = '', array $old = []): never
{
    global $isAjax;
    if ($isAjax) {
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode(['status' => $status, 'message' => $msg], JSON_UNESCAPED_UNICODE);
        exit;
    }
    $_SESSION['lead_flash'] = ['status' => $status, 'msg' => $msg, 'old' => $old];
    header('Location: /index.php?lang=' . $locale . '#form', true, 303);
    exit;
}

/** IP real do visitante, respeitando proxy/CDN à frente do PHP. */
function visitor_ip(): string
{
    foreach (['HTTP_CF_CONNECTING_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP'] as $header) {
        $raw = $_SERVER[$header] ?? '';
        if (!is_string($raw) || $raw === '') {
            continue;
        }
        // X-Forwarded-For pode vir como "cliente, proxy1, proxy2".
        foreach (explode(',', $raw) as $candidate) {
            $candidate = trim($candidate);
            if (filter_var($candidate, FILTER_VALIDATE_IP) !== false) {
                return $candidate;
            }
        }
    }
    $remote = (string) ($_SERVER['REMOTE_ADDR'] ?? '');
    return filter_var($remote, FILTER_VALIDATE_IP) !== false ? $remote : '0.0.0.0';
}

if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') {
    header('Location: /index.php?lang=' . $locale, true, 303);
    exit;
}

$name = trim((string) ($_POST['name'] ?? ''));
$email = trim((string) ($_POST['email'] ?? ''));
$phone = trim((string) ($_POST['phone'] ?? ''));
$interest = trim((string) ($_POST['interest'] ?? ''));
$pais = trim((string) ($_POST['pais'] ?? ''));
$paisIso = trim((string) ($_POST['pais_iso'] ?? ''));
$message = trim((string) ($_POST['message'] ?? ''));

// O formulário do CR7 Token coleta "País" em vez de uma mensagem livre; guardamos
// essa info (e o produto) em `message`, que fica no registro local — a API do CRM
// não tem campo de observação.
$contextParts = [];
if ($pais !== '') {
    $contextParts[] = 'País: ' . $pais;
}
$contextParts[] = 'Interesse: CR7 Token (pré-venda €0,07)';
$context = implode(' · ', $contextParts);
$message = $message !== '' ? ($message . ' — ' . $context) : $context;

$old = ['name' => $name, 'email' => $email, 'phone' => $phone, 'message' => $message];

// Honeypot: hidden from real visitors via CSS; bots that fill every field trip it.
// Pretend success instead of erroring, so scrapers don't learn the field name is a trap.
if (trim((string) ($_POST['website'] ?? '')) !== '') {
    back($locale, 'ok', t('lead_ok'));
}

if ($name === '' || $email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL) || $phone === '') {
    back($locale, 'error', t('lead_error_validation'), $old);
}

[$firstName, $lastName] = split_full_name($name);
$phoneE164 = normalize_phone($phone);
if ($firstName === '' || $phoneE164 === '') {
    back($locale, 'error', t('lead_error_validation'), $old);
}

// A API rejeita country vazio ("Bad country"), então nunca mandamos string vazia.
$country = resolve_country_iso($paisIso, $pais, $phone) ?: PARTNER_DEFAULT_COUNTRY;
$visitorIp = visitor_ip();

// Payload exatamente como o endpoint /lead/register espera.
$payload = [
    'first_name' => $firstName,
    'last_name' => $lastName,
    'phone' => $phoneE164,
    'email' => $email,
    'source' => PARTNER_SOURCE,
    'ip' => $visitorIp,
    'country' => $country,
    'funnel_name' => PARTNER_FUNNEL_NAME,
];

$result = partner_register_lead($payload);

// O registro local acontece com sucesso OU falha: é dele que o painel tira os
// leads que precisam ser reenviados manualmente.
store_record_lead($payload + [
    'name' => $name,
    'lang' => $locale,
    'interest' => $interest,
    'message' => $message,
    'user_agent' => mb_substr((string) ($_SERVER['HTTP_USER_AGENT'] ?? ''), 0, 400),
    'referer' => mb_substr((string) ($_SERVER['HTTP_REFERER'] ?? ''), 0, 400),
], $result);

if ($result['ok']) {
    back($locale, 'ok', t('lead_ok'));
}

// Duplicidade não é erro para o visitante: ele já está na base, então mostrar
// "falhou" só o faria reenviar em loop.
if (partner_is_duplicate($result)) {
    back($locale, 'ok', t('lead_ok'));
}

back($locale, 'error', t('lead_error_generic'), $old);
