<?php
declare(strict_types=1);

/**
 * /out/wa.php — punto unico di uscita verso WhatsApp (MASTER §2, §9).
 * Verifica il token HMAC con TTL, logga in wa_clicks (UA, IP, ctx, verified),
 * scarta bot noti senza contarli, poi 302 verso wa.me con testo prefill.
 * Nessuna cache: risposta sempre dinamica (regola Cloudflare su /out/*).
 */

require_once dirname(__DIR__, 2) . '/app/lib/db.php';
require_once dirname(__DIR__, 2) . '/app/lib/wa_token.php';
require_once dirname(__DIR__, 2) . '/app/lib/bot_filter.php';
require_once dirname(__DIR__, 2) . '/app/lib/env.php';

header('Cache-Control: no-store, no-cache, must-revalidate');
header('X-Robots-Tag: noindex');

$token = $_GET['t'] ?? '';
$payload = is_string($token) ? WaToken::verifica($token) : null;

if ($payload === null) {
    http_response_code(400);
    header('Content-Type: text/plain; charset=utf-8');
    echo "Link non valido o scaduto. Torna alla pagina e riprova.";
    exit;
}

$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
$referer = $_SERVER['HTTP_REFERER'] ?? null;
$motivoScarto = BotFilter::motivoScarto($ua);
$verified = $motivoScarto === null ? 1 : 0;

try {
    Db::esegui(
        'INSERT INTO wa_clicks (token, ctx_pagina, ctx_tipo, intervento_id, provincia_id, ua, ip, referer, verified, motivo_scarto, ts)
         VALUES (?, ?, ?, ?, ?, ?, INET6_ATON(?), ?, ?, ?, NOW())',
        [
            substr($token, 0, 40),
            $payload['ctx'] ?? null,
            $payload['ctx_tipo'] ?? null,
            $payload['intervento_id'] ?? null,
            $payload['provincia_id'] ?? null,
            mb_substr($ua, 0, 500),
            $ip,
            $referer !== null ? mb_substr($referer, 0, 500) : null,
            $verified,
            $motivoScarto,
        ]
    );
} catch (Throwable $e) {
    error_log('wa_clicks insert fallito: ' . $e->getMessage());
}

if ($motivoScarto !== null) {
    http_response_code(403);
    header('Content-Type: text/plain; charset=utf-8');
    echo 'Accesso negato.';
    exit;
}

$numeroDedicati = Env::bool('WA_NUMERI_DEDICATI', false);
$numero = $payload['canale'] ?? 'clienti';
$destinatario = $numero === 'officine'
    ? Env::obbligatorio('WA_NUMERO_OFFICINE')
    : Env::obbligatorio('WA_NUMERO_CLIENTI');

$testo = (string) ($payload['testo'] ?? 'Ciao, vorrei un preventivo su Riparo.');
$url = 'https://wa.me/' . preg_replace('/\D/', '', $destinatario) . '?text=' . rawurlencode($testo);

http_response_code(302);
header('Location: ' . $url);
