<?php
declare(strict_types=1);

/**
 * /functional/reclama/click.php
 *
 * Відповідає за:
 * - редірект по рекламному кліку
 * - логування кліку в reclama_campaign_clicks
 * - оновлення денних stats реклами
 * - безпечну валідацію цільового URL
 *
 * ВАЖЛИВО:
 * - для банерів і promoted-post підтримує:
 *   ?to=...
 *   ?url=...
 * - якщо явний URL переданий у query, він має пріоритет над target_url кампанії
 *   щоб банер завжди відкривав саме сайт рекламодавця
 */

require_once __DIR__ . '/../../includes/start.php';
require_once __DIR__ . '/_lib.php';

/** @var PDO|null $pdo */
/** @var array|null $me */
$pdo = (isset($pdo) && $pdo instanceof PDO) ? $pdo : db();
$me  = $me ?? current_user();

if (!headers_sent()) {
    header('X-Robots-Tag: noindex, nofollow, noarchive, nosnippet', true);
    header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0', true);
    header('Pragma: no-cache', true);
}

if (!function_exists('reclama_click_safe_target')) {
    function reclama_click_safe_target(string $raw, string $fallback = '/'): string
    {
        $raw = trim($raw);
        if ($raw === '') return $fallback;

        if (preg_match('~^https?://~i', $raw)) {
            return filter_var($raw, FILTER_VALIDATE_URL) ? $raw : $fallback;
        }

        if (str_starts_with($raw, '/')) {
            if (function_exists('safe_local_path')) {
                return safe_local_path($raw, $fallback);
            }
            return $raw;
        }

        return $fallback;
    }
}

$campaignId = max(0, (int)($_GET['c'] ?? 0));
$placement  = reclama_normalize_placement((string)($_GET['p'] ?? 'other'));

/**
 * Підтримуємо обидва варіанти параметра, щоб не ламати старі/нові посилання:
 * - to
 * - url
 */
$rawExplicitTarget = trim((string)($_GET['to'] ?? ''));
if ($rawExplicitTarget === '') {
    $rawExplicitTarget = trim((string)($_GET['url'] ?? ''));
}

$target = '/';
$campaign = null;

if ($campaignId > 0) {
    $campaign = reclama_get_campaign($pdo, $campaignId);
}

/**
 * ПРІОРИТЕТ:
 * 1) явний target з query (?to=... / ?url=...)
 * 2) target_url з кампанії
 *
 * Це потрібно, щоб банер завжди вів на сайт рекламодавця,
 * навіть якщо в самій кампанії target_url порожній або застарілий.
 */
if ($rawExplicitTarget !== '') {
    $target = reclama_click_safe_target($rawExplicitTarget, '/');
} elseif (is_array($campaign)) {
    $campaignTarget = trim((string)($campaign['target_url'] ?? ''));
    if ($campaignTarget !== '') {
        $target = reclama_click_safe_target($campaignTarget, '/');
    }
}

if (is_array($campaign) && reclama_is_active_now($campaign)) {
    try {
        $viewer = reclama_viewer_context($pdo, $me, (string)($_SERVER['HTTP_USER_AGENT'] ?? ''));

        /**
         * Логуємо саме реальний URL, по якому йде редірект
         */
        reclama_log_click($pdo, $campaignId, $viewer, $placement, $target);
    } catch (Throwable $e) {
        // не ламаємо редірект
    }
}

if (!headers_sent()) {
    header('Location: ' . $target, true, 302);
    exit;
}

echo '<meta http-equiv="refresh" content="0;url=' . h($target) . '">';
echo '<script>location.href=' . json_encode($target, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . ';</script>';
exit;
