<?php
declare(strict_types=1);

/**
 * /admin/reclama/campaign.php
 *
 * Відповідає за:
 * - детальний перегляд однієї рекламної кампанії в адмінці
 * - показ статусів, дат, бюджету і автора кампанії
 * - прев’ю реклами, банерів і цільового посилання
 * - показ джерельного поста для promoted post кампаній
 * - показ таргетингу
 * - дії модерації: approve / reject / pause / resume / finish / cancel
 * - повне видалення рекламної кампанії
 * - журнал модерації з reclama_campaign_moderation
 */

require_once __DIR__ . '/../../includes/start.php';
require_once __DIR__ . '/../_helpers.php';
require_once __DIR__ . '/../_sidebar.php';

$reclamaLib = __DIR__ . '/../../functional/reclama/_lib.php';
if (is_file($reclamaLib)) {
    require_once $reclamaLib;
}
unset($reclamaLib);

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

require_login();

$pdo = (isset($pdo) && $pdo instanceof PDO) ? $pdo : db();
$me  = (isset($me) && is_array($me)) ? $me : current_user();

if (function_exists('require_role')) {
    require_role(['admin']);
} else {
    $role = (string)($me['role'] ?? '');
    if ($role !== 'admin') {
        http_response_code(403);
        exit('Forbidden');
    }
}

if (!function_exists('csrf_token')) {
    function csrf_token(): string
    {
        admin_session_start();
        if (empty($_SESSION['csrf_token'])) {
            $_SESSION['csrf_token'] = bin2hex(random_bytes(16));
        }
        return (string)$_SESSION['csrf_token'];
    }
}

if (!function_exists('csrf_check')) {
    function csrf_check(?string $token): bool
    {
        admin_session_start();
        $sent = (string)($token ?? '');
        $sess = (string)($_SESSION['csrf_token'] ?? '');
        return $sent !== '' && $sess !== '' && hash_equals($sess, $sent);
    }
}

if (!function_exists('is_post')) {
    function is_post(): bool
    {
        return strtoupper((string)($_SERVER['REQUEST_METHOD'] ?? 'GET')) === 'POST';
    }
}

if (!function_exists('admin_reclama_t')) {
    function admin_reclama_t(string $key, string $uk, string $ru, string $en): string
    {
        return admin_tt($key, $uk, $ru, $en);
    }
}

if (!function_exists('admin_reclama_num')) {
    function admin_reclama_num($n): string
    {
        return number_format((float)$n, 0, '.', ' ');
    }
}

if (!function_exists('admin_reclama_money')) {
    function admin_reclama_money($n): string
    {
        return number_format((float)$n, 0, '.', ' ') . ' VM Coins';
    }
}

if (!function_exists('admin_reclama_campaign_url')) {
    function admin_reclama_campaign_url(int $campaignId): string
    {
        return '/admin/reclama/campaign.php?id=' . max(0, $campaignId);
    }
}

if (!function_exists('admin_reclama_campaigns_url')) {
    function admin_reclama_campaigns_url(): string
    {
        return '/admin/reclama/campaigns.php';
    }
}

if (!function_exists('admin_reclama_redirect_campaign')) {
    function admin_reclama_redirect_campaign(int $campaignId): never
    {
        header('Location: ' . admin_reclama_campaign_url($campaignId), true, 303);
        exit;
    }
}

if (!function_exists('admin_reclama_redirect_campaigns')) {
    function admin_reclama_redirect_campaigns(): never
    {
        header('Location: ' . admin_reclama_campaigns_url(), true, 303);
        exit;
    }
}

if (!function_exists('admin_reclama_status_badge')) {
    function admin_reclama_status_badge(string $status): string
    {
        return match ($status) {
            'active'   => 'success',
            'approved' => 'info',
            'pending'  => 'warning',
            'rejected' => 'danger',
            'paused'   => 'secondary',
            'finished' => 'dark',
            'canceled' => 'secondary',
            default    => 'light',
        };
    }
}

if (!function_exists('admin_reclama_payment_badge')) {
    function admin_reclama_payment_badge(string $status): string
    {
        return match ($status) {
            'paid'           => 'success',
            'reserved'       => 'info',
            'unpaid'         => 'warning',
            'refunded'       => 'secondary',
            'partial_refund' => 'secondary',
            default          => 'light',
        };
    }
}

if (!function_exists('admin_reclama_label_status')) {
    function admin_reclama_label_status(string $status): string
    {
        return match ($status) {
            'draft'    => admin_reclama_t('admin_reclama_st_draft', 'Чернетка', 'Черновик', 'Draft'),
            'pending'  => admin_reclama_t('admin_reclama_st_pending', 'На перевірці', 'На проверке', 'Pending'),
            'approved' => admin_reclama_t('admin_reclama_st_approved', 'Схвалено', 'Одобрено', 'Approved'),
            'rejected' => admin_reclama_t('admin_reclama_st_rejected', 'Відхилено', 'Отклонено', 'Rejected'),
            'active'   => admin_reclama_t('admin_reclama_st_active', 'Активна', 'Активна', 'Active'),
            'paused'   => admin_reclama_t('admin_reclama_st_paused', 'На паузі', 'На паузе', 'Paused'),
            'finished' => admin_reclama_t('admin_reclama_st_finished', 'Завершена', 'Завершена', 'Finished'),
            'canceled' => admin_reclama_t('admin_reclama_st_canceled', 'Скасована', 'Отменена', 'Canceled'),
            default    => $status,
        };
    }
}

if (!function_exists('admin_reclama_label_moderation')) {
    function admin_reclama_label_moderation(string $status): string
    {
        return match ($status) {
            'pending'  => admin_reclama_t('admin_reclama_mod_pending', 'На модерації', 'На модерации', 'In moderation'),
            'approved' => admin_reclama_t('admin_reclama_mod_approved', 'Схвалено модератором', 'Одобрено модератором', 'Moderator approved'),
            'rejected' => admin_reclama_t('admin_reclama_mod_rejected', 'Відхилено модератором', 'Отклонено модератором', 'Moderator rejected'),
            default    => $status !== '' ? $status : '—',
        };
    }
}

if (!function_exists('admin_reclama_label_payment')) {
    function admin_reclama_label_payment(string $status): string
    {
        return match ($status) {
            'paid'           => admin_reclama_t('admin_reclama_pay_paid', 'Оплачено', 'Оплачено', 'Paid'),
            'unpaid'         => admin_reclama_t('admin_reclama_pay_unpaid', 'Не оплачено', 'Не оплачено', 'Unpaid'),
            'reserved'       => admin_reclama_t('admin_reclama_pay_reserved', 'Зарезервовано', 'Зарезервировано', 'Reserved'),
            'refunded'       => admin_reclama_t('admin_reclama_pay_refunded', 'Повернено', 'Возвращено', 'Refunded'),
            'partial_refund' => admin_reclama_t('admin_reclama_pay_part_ref', 'Часткове повернення', 'Частичный возврат', 'Partial refund'),
            default          => $status,
        };
    }
}

if (!function_exists('admin_reclama_targeting_human')) {
    function admin_reclama_targeting_human(array $row): string
    {
        $parts = [];

        $country = trim((string)($row['country_code'] ?? ''));
        $city    = trim((string)($row['city'] ?? ''));
        $gender  = trim((string)($row['gender'] ?? 'any'));
        $lang    = trim((string)($row['lang_code'] ?? 'any'));
        $device  = trim((string)($row['device_type'] ?? 'all'));
        $ageFrom = isset($row['age_from']) && $row['age_from'] !== null ? (int)$row['age_from'] : null;
        $ageTo   = isset($row['age_to']) && $row['age_to'] !== null ? (int)$row['age_to'] : null;

        if ($country !== '') $parts[] = $country;
        if ($city !== '') $parts[] = $city;
        if ($gender !== '' && $gender !== 'any') $parts[] = 'gender:' . $gender;
        if ($lang !== '' && $lang !== 'any') $parts[] = 'lang:' . $lang;
        if ($device !== '' && $device !== 'all') $parts[] = 'device:' . $device;

        if ($ageFrom !== null || $ageTo !== null) {
            $parts[] = 'age:' . ($ageFrom !== null ? $ageFrom : '…') . '–' . ($ageTo !== null ? $ageTo : '…');
        }

        return $parts ? implode(', ', $parts) : '—';
    }
}

if (!function_exists('admin_reclama_safe_href')) {
    function admin_reclama_safe_href(?string $url): ?string
    {
        $url = trim((string)$url);
        if ($url === '') return null;

        if (preg_match('~^https?://~i', $url)) {
            return $url;
        }
        if (str_starts_with($url, '/')) {
            return $url;
        }

        return null;
    }
}

if (!function_exists('admin_reclama_label_action')) {
    function admin_reclama_label_action(string $action): string
    {
        return match ($action) {
            'created'   => admin_reclama_t('admin_reclama_log_created', 'Створено', 'Создано', 'Created'),
            'submitted' => admin_reclama_t('admin_reclama_log_submitted', 'Відправлено на модерацію', 'Отправлено на модерацию', 'Submitted for moderation'),
            'approved'  => admin_reclama_t('admin_reclama_log_approved', 'Схвалено', 'Одобрено', 'Approved'),
            'rejected'  => admin_reclama_t('admin_reclama_log_rejected', 'Відхилено', 'Отклонено', 'Rejected'),
            'paused'    => admin_reclama_t('admin_reclama_log_paused', 'Поставлено на паузу', 'Поставлено на паузу', 'Paused'),
            'resumed'   => admin_reclama_t('admin_reclama_log_resumed', 'Відновлено', 'Возобновлено', 'Resumed'),
            'finished'  => admin_reclama_t('admin_reclama_log_finished', 'Завершено', 'Завершено', 'Finished'),
            'canceled'  => admin_reclama_t('admin_reclama_log_canceled', 'Скасовано', 'Отменено', 'Canceled'),
            'edited'    => admin_reclama_t('admin_reclama_log_edited', 'Змінено', 'Изменено', 'Edited'),
            default     => $action,
        };
    }
}

if (!function_exists('admin_reclama_banner_block')) {
    function admin_reclama_banner_block(string $title, ?string $path, ?string $originalName = null): void
    {
        $path = trim((string)$path);
        $originalName = trim((string)$originalName);
        ?>
        <div class="border rounded-3 p-3 h-100">
            <div class="fw-semibold mb-2"><?= e($title) ?></div>
            <?php if ($path !== ''): ?>
                <div class="mb-2">
                    <img src="<?= e($path) ?>" alt="<?= e($title) ?>" class="img-fluid rounded border">
                </div>
                <div class="small text-muted text-break"><?= e($path) ?></div>
                <?php if ($originalName !== ''): ?>
                    <div class="small text-muted mt-1"><?= e($originalName) ?></div>
                <?php endif; ?>
            <?php else: ?>
                <div class="text-muted"><?= e(admin_reclama_t('admin_reclama_banner_missing', 'Банер не завантажено.', 'Баннер не загружен.', 'Banner not uploaded.')) ?></div>
            <?php endif; ?>
        </div>
        <?php
    }
}

if (!function_exists('admin_reclama_delete_campaign')) {
    function admin_reclama_delete_campaign(PDO $pdo, int $campaignId): array
    {
        if ($campaignId <= 0) {
            return ['ok' => false, 'reason' => 'bad_id'];
        }

        if (!function_exists('reclama_get_campaign') || !function_exists('reclama_table_exists')) {
            return ['ok' => false, 'reason' => 'missing_helpers'];
        }

        $campaign = reclama_get_campaign($pdo, $campaignId);
        if (!$campaign) {
            return ['ok' => false, 'reason' => 'not_found'];
        }

        $ownTx = !$pdo->inTransaction();
        if ($ownTx) {
            $pdo->beginTransaction();
        }

        try {
            $childTables = [
                'reclama_campaign_clicks',
                'reclama_campaign_impressions',
                'reclama_campaign_daily_stats',
                'reclama_campaign_moderation',
                'reclama_campaign_targeting',
            ];

            foreach ($childTables as $table) {
                if (!reclama_table_exists($pdo, $table)) {
                    continue;
                }

                $st = $pdo->prepare("DELETE FROM `{$table}` WHERE campaign_id = ?");
                $st->execute([$campaignId]);
            }

            if (!reclama_table_exists($pdo, 'reclama_campaigns')) {
                throw new RuntimeException('campaigns_table_missing');
            }

            $st = $pdo->prepare("DELETE FROM `reclama_campaigns` WHERE id = ? LIMIT 1");
            $st->execute([$campaignId]);

            if ($st->rowCount() < 1) {
                throw new RuntimeException('delete_failed');
            }

            if ($ownTx && $pdo->inTransaction()) {
                $pdo->commit();
            }

            return ['ok' => true];
        } catch (Throwable $e) {
            if ($ownTx && $pdo->inTransaction()) {
                $pdo->rollBack();
            }
            error_log('admin/reclama/campaign.php delete campaign error: ' . $e->getMessage());
            return ['ok' => false, 'reason' => 'delete_failed'];
        }
    }
}

$campaignId = max(0, (int)($_GET['id'] ?? $_POST['campaign_id'] ?? 0));
if ($campaignId <= 0) {
    admin_flash_set(
        'danger',
        admin_reclama_t('admin_reclama_campaign_bad_id', 'Не вказано кампанію.', 'Кампания не указана.', 'Campaign is not specified.')
    );
    admin_reclama_redirect_campaigns();
}

if (is_post()) {
    if (!csrf_check((string)($_POST['csrf'] ?? ''))) {
        admin_flash_set(
            'danger',
            admin_reclama_t('admin_reclama_bad_csrf', 'Невірний CSRF токен.', 'Неверный CSRF токен.', 'Invalid CSRF token.')
        );
        admin_reclama_redirect_campaign($campaignId);
    }

    $action = trim((string)($_POST['action'] ?? ''));

    if ($action === 'moderate_campaign') {
        $modAction = trim((string)($_POST['mod_action'] ?? ''));
        $note      = trim((string)($_POST['note'] ?? ''));
        $adminId   = (int)($me['id'] ?? 0);

        if ($modAction === 'rejected' && $note === '') {
            admin_flash_set(
                'danger',
                admin_reclama_t(
                    'admin_reclama_reject_reason_required',
                    'Для відхилення потрібно вказати причину.',
                    'Для отклонения нужно указать причину.',
                    'A rejection reason is required.'
                )
            );
            admin_reclama_redirect_campaign($campaignId);
        }

        $res = reclama_admin_change_status($pdo, $campaignId, $modAction, $adminId, $note);

        if (!($res['ok'] ?? false)) {
            admin_flash_set(
                'danger',
                admin_reclama_t(
                    'admin_reclama_mod_fail',
                    'Не вдалося змінити статус кампанії.',
                    'Не удалось изменить статус кампании.',
                    'Failed to change campaign status.'
                )
            );
        } else {
            admin_flash_set(
                'success',
                admin_reclama_t(
                    'admin_reclama_mod_ok',
                    'Статус кампанії оновлено.',
                    'Статус кампании обновлён.',
                    'Campaign status has been updated.'
                )
            );
        }

        admin_reclama_redirect_campaign($campaignId);
    }

    if ($action === 'delete_campaign') {
        $res = admin_reclama_delete_campaign($pdo, $campaignId);

        if (!($res['ok'] ?? false)) {
            admin_flash_set(
                'danger',
                admin_reclama_t(
                    'admin_reclama_delete_fail',
                    'Не вдалося видалити кампанію.',
                    'Не удалось удалить кампанию.',
                    'Failed to delete campaign.'
                )
            );
            admin_reclama_redirect_campaign($campaignId);
        }

        admin_flash_set(
            'success',
            admin_reclama_t(
                'admin_reclama_delete_ok',
                'Рекламну кампанію видалено.',
                'Рекламная кампания удалена.',
                'Advertising campaign has been deleted.'
            )
        );
        admin_reclama_redirect_campaigns();
    }
}

$flash    = admin_flash_take();
$campaign = reclama_get_campaign_admin_view($pdo, $campaignId);

if (!$campaign) {
    admin_flash_set(
        'danger',
        admin_reclama_t('admin_reclama_not_found', 'Кампанію не знайдено.', 'Кампания не найдена.', 'Campaign not found.')
    );
    admin_reclama_redirect_campaigns();
}

$campaign = array_merge($campaign, reclama_get_campaign_targeting($pdo, $campaignId));
$log = reclama_get_campaign_moderation_log($pdo, $campaignId, 100);

$status        = trim((string)($campaign['status'] ?? ''));
$moderation    = trim((string)($campaign['moderation_status'] ?? ''));
$paymentStatus = trim((string)($campaign['payment_status'] ?? ''));
$targetUrl     = trim((string)($campaign['target_url'] ?? ''));
$targetHref    = admin_reclama_safe_href($targetUrl);
$ownerUsername = trim((string)($campaign['owner_username'] ?? ''));
$ownerName     = trim((string)($campaign['owner_name'] ?? ''));
$approvedBy    = trim((string)($campaign['approved_by_username'] ?? ''));
$rejectedBy    = trim((string)($campaign['rejected_by_username'] ?? ''));
$sourceBody    = trim((string)($campaign['source_post_body'] ?? ''));
$title = admin_reclama_t('admin_reclama_campaign_title', 'Кампанія реклами', 'Рекламная кампания', 'Advertising campaign') . ' #' . $campaignId;

$seo_noindex  = true;
$meta_robots  = 'noindex, nofollow, noarchive, nosnippet';
$meta_desc    = '';
$canonical    = function_exists('abs_url') ? abs_url(admin_reclama_campaign_url($campaignId)) : admin_reclama_campaign_url($campaignId);

require_once __DIR__ . '/../../includes/header.php';
?>

<div class="container py-3 py-lg-4">
    <div class="row g-4">
        <div class="col-lg-8">
            <div class="d-flex flex-wrap align-items-start justify-content-between gap-3 mb-3">
                <div>
                    <div class="mb-2">
                        <a href="<?= e(admin_reclama_campaigns_url()) ?>" class="text-decoration-none small text-muted">← <?= e(admin_reclama_t('admin_reclama_back', 'Назад до кампаній реклами', 'Назад к кампаниям рекламы', 'Back to ad campaigns')) ?></a>
                    </div>
                    <h1 class="h3 mb-1">#<?= e((string)$campaignId) ?> — <?= e((string)($campaign['title'] ?? '')) ?></h1>
                    <div class="text-muted">
                        <?= e((string)($campaign['campaign_type'] ?? '')) ?>
                        <?php if ((int)($campaign['source_post_id'] ?? 0) > 0): ?>
                            · post #<?= e((string)($campaign['source_post_id'] ?? 0)) ?>
                        <?php endif; ?>
                    </div>
                </div>

                <div class="d-flex flex-wrap gap-2">
                    <span class="badge text-bg-<?= e(admin_reclama_status_badge($status)) ?>">
                        <?= e(admin_reclama_label_status($status)) ?>
                    </span>
                    <span class="badge text-bg-<?= e(admin_reclama_status_badge($moderation)) ?>">
                        <?= e(admin_reclama_label_moderation($moderation)) ?>
                    </span>
                    <span class="badge text-bg-<?= e(admin_reclama_payment_badge($paymentStatus)) ?>">
                        <?= e(admin_reclama_label_payment($paymentStatus)) ?>
                    </span>
                </div>
            </div>

            <?php if ($flash): ?>
                <div class="alert alert-<?= e((string)$flash['type']) ?> mb-3">
                    <?= e((string)$flash['msg']) ?>
                </div>
            <?php endif; ?>

            <div class="card card-app mb-4">
                <div class="card-body">
                    <h2 class="h5 mb-3"><?= e(admin_reclama_t('admin_reclama_campaign_main', 'Основні дані', 'Основные данные', 'Main details')) ?></h2>

                    <div class="row g-3">
                        <div class="col-md-6">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_owner', 'Власник', 'Владелец', 'Owner')) ?></div>
                            <div>
                                <?php if ($ownerUsername !== ''): ?>
                                    <?= e('@' . $ownerUsername) ?>
                                <?php else: ?>
                                    #<?= e((string)($campaign['user_id'] ?? 0)) ?>
                                <?php endif; ?>
                                <?php if ($ownerName !== ''): ?>
                                    <span class="text-muted">· <?= e($ownerName) ?></span>
                                <?php endif; ?>
                            </div>
                        </div>

                        <div class="col-md-3">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_budget', 'Бюджет', 'Бюджет', 'Budget')) ?></div>
                            <div class="fw-semibold"><?= e(admin_reclama_money((int)($campaign['total_price'] ?? 0))) ?></div>
                            <div class="small text-muted mt-1">
                                <?= e(admin_reclama_num((int)($campaign['price_per_day'] ?? 0))) ?>/<?= e(admin_reclama_t('admin_reclama_day_1', 'день', 'день', 'day')) ?>
                            </div>
                        </div>

                        <div class="col-md-3">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_period_days', 'Кількість днів', 'Количество дней', 'Days count')) ?></div>
                            <div class="fw-semibold"><?= e(admin_reclama_num((int)($campaign['days_count'] ?? 0))) ?></div>
                        </div>

                        <div class="col-md-6">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_period', 'Період показу', 'Период показа', 'Delivery window')) ?></div>
                            <div><?= e((string)($campaign['start_date'] ?? '')) ?> → <?= e((string)($campaign['end_date'] ?? '')) ?></div>
                        </div>

                        <div class="col-md-6">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_target_url', 'Цільове посилання', 'Целевая ссылка', 'Target URL')) ?></div>
                            <?php if ($targetUrl !== ''): ?>
                                <div class="text-break">
                                    <?php if ($targetHref !== null): ?>
                                        <a href="<?= e($targetHref) ?>" target="_blank" rel="noopener noreferrer nofollow"><?= e($targetUrl) ?></a>
                                    <?php else: ?>
                                        <?= e($targetUrl) ?>
                                    <?php endif; ?>
                                </div>
                            <?php else: ?>
                                <div class="text-muted">—</div>
                            <?php endif; ?>
                        </div>
                    </div>
                </div>
            </div>

            <div class="card card-app mb-4">
                <div class="card-body">
                    <h2 class="h5 mb-3"><?= e(admin_reclama_t('admin_reclama_preview', 'Прев’ю і банери', 'Превью и баннеры', 'Preview and banners')) ?></h2>

                    <div class="row g-3 mb-3">
                        <div class="col-md-6">
                            <?php admin_reclama_banner_block(
                                admin_reclama_t('admin_reclama_desktop_banner', 'Desktop банер', 'Desktop баннер', 'Desktop banner'),
                                (string)($campaign['desktop_banner_path'] ?? ''),
                                (string)($campaign['desktop_banner_original_name'] ?? '')
                            ); ?>
                        </div>
                        <div class="col-md-6">
                            <?php admin_reclama_banner_block(
                                admin_reclama_t('admin_reclama_mobile_banner', 'Mobile банер', 'Mobile баннер', 'Mobile banner'),
                                (string)($campaign['mobile_banner_path'] ?? ''),
                                (string)($campaign['mobile_banner_original_name'] ?? '')
                            ); ?>
                        </div>
                    </div>

                    <?php if ($sourceBody !== ''): ?>
                        <div class="border rounded-3 p-3">
                            <div class="fw-semibold mb-2"><?= e(admin_reclama_t('admin_reclama_source_post', 'Текст джерельного поста', 'Текст исходного поста', 'Source post body')) ?></div>
                            <div style="white-space:pre-wrap; word-break:break-word;"><?= e($sourceBody) ?></div>
                        </div>
                    <?php elseif ($targetHref !== null && trim((string)($campaign['desktop_banner_path'] ?? '')) !== ''): ?>
                        <div class="border rounded-3 p-3">
                            <div class="fw-semibold mb-2"><?= e(admin_reclama_t('admin_reclama_banner_preview_block', 'Швидке прев’ю переходу', 'Быстрое превью перехода', 'Quick click-through preview')) ?></div>
                            <a href="<?= e($targetHref) ?>" target="_blank" rel="noopener noreferrer nofollow" class="text-decoration-none">
                                <div class="border rounded-3 p-3 bg-light-subtle text-center">
                                    <div class="mb-2 text-muted small"><?= e(admin_reclama_t('admin_reclama_click_preview', 'Клік відкриє цільове посилання', 'Клик откроет целевую ссылку', 'Click opens target URL')) ?></div>
                                    <img src="<?= e((string)($campaign['desktop_banner_path'] ?? '')) ?>" alt="preview" class="img-fluid rounded border">
                                </div>
                            </a>
                        </div>
                    <?php endif; ?>
                </div>
            </div>

            <div class="card card-app">
                <div class="card-body">
                    <h2 class="h5 mb-3"><?= e(admin_reclama_t('admin_reclama_actions', 'Дії модерації', 'Действия модерации', 'Moderation actions')) ?></h2>

                    <div class="row g-3 mb-3">
                        <?php if (!in_array($moderation, ['approved'], true)): ?>
                            <div class="col-md-6">
                                <div class="border rounded-3 p-3 h-100">
                                    <form method="post" action="<?= e(admin_reclama_campaign_url($campaignId)) ?>">
                                        <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                                        <input type="hidden" name="action" value="moderate_campaign">
                                        <input type="hidden" name="campaign_id" value="<?= e((string)$campaignId) ?>">
                                        <input type="hidden" name="mod_action" value="approved">
                                        <button type="submit" class="btn btn-success w-100">
                                            <?= e(admin_reclama_t('admin_reclama_approve', 'Схвалити', 'Одобрить', 'Approve')) ?>
                                        </button>
                                    </form>
                                    <div class="small text-muted mt-2">
                                        <?= e(admin_reclama_t(
                                            'admin_reclama_help_approve',
                                            'Підтверджує кампанію після перевірки. Якщо все вже оплачено і дозволено — вона зможе перейти в активний стан.',
                                            'Подтверждает кампанию после проверки. Если всё уже оплачено и разрешено — она сможет перейти в активный статус.',
                                            'Approves the campaign after review. If payment and settings allow it, the campaign may become active.'
                                        )) ?>
                                    </div>
                                </div>
                            </div>
                        <?php endif; ?>

                        <?php if (in_array($status, ['active', 'approved'], true)): ?>
                            <div class="col-md-6">
                                <div class="border rounded-3 p-3 h-100">
                                    <form method="post" action="<?= e(admin_reclama_campaign_url($campaignId)) ?>">
                                        <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                                        <input type="hidden" name="action" value="moderate_campaign">
                                        <input type="hidden" name="campaign_id" value="<?= e((string)$campaignId) ?>">
                                        <input type="hidden" name="mod_action" value="paused">
                                        <button type="submit" class="btn btn-outline-secondary w-100">
                                            <?= e(admin_reclama_t('admin_reclama_pause', 'Пауза', 'Пауза', 'Pause')) ?>
                                        </button>
                                    </form>
                                    <div class="small text-muted mt-2">
                                        <?= e(admin_reclama_t(
                                            'admin_reclama_help_pause',
                                            'Тимчасово зупиняє покази без видалення кампанії. Дані та налаштування залишаються.',
                                            'Временно останавливает показы без удаления кампании. Данные и настройки сохраняются.',
                                            'Temporarily stops delivery without deleting the campaign. All data and settings stay intact.'
                                        )) ?>
                                    </div>
                                </div>
                            </div>
                        <?php endif; ?>

                        <?php if ($status === 'paused'): ?>
                            <div class="col-md-6">
                                <div class="border rounded-3 p-3 h-100">
                                    <form method="post" action="<?= e(admin_reclama_campaign_url($campaignId)) ?>">
                                        <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                                        <input type="hidden" name="action" value="moderate_campaign">
                                        <input type="hidden" name="campaign_id" value="<?= e((string)$campaignId) ?>">
                                        <input type="hidden" name="mod_action" value="resumed">
                                        <button type="submit" class="btn btn-outline-success w-100">
                                            <?= e(admin_reclama_t('admin_reclama_resume', 'Відновити', 'Возобновить', 'Resume')) ?>
                                        </button>
                                    </form>
                                    <div class="small text-muted mt-2">
                                        <?= e(admin_reclama_t(
                                            'admin_reclama_help_resume',
                                            'Повертає кампанію до роботи після паузи. Якщо вікно показу і оплата валідні — вона знову буде активною.',
                                            'Возвращает кампанию к работе после паузы. Если окно показа и оплата валидны — она снова станет активной.',
                                            'Restarts the campaign after pause. If dates and payment are still valid, it becomes active again.'
                                        )) ?>
                                    </div>
                                </div>
                            </div>
                        <?php endif; ?>

                        <?php if (!in_array($status, ['finished', 'canceled'], true)): ?>
                            <div class="col-md-6">
                                <div class="border rounded-3 p-3 h-100">
                                    <form method="post" action="<?= e(admin_reclama_campaign_url($campaignId)) ?>" onsubmit="return confirm('<?= e(admin_reclama_t('admin_reclama_finish_q', 'Завершити кампанію?', 'Завершить кампанию?', 'Finish campaign?')) ?>');">
                                        <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                                        <input type="hidden" name="action" value="moderate_campaign">
                                        <input type="hidden" name="campaign_id" value="<?= e((string)$campaignId) ?>">
                                        <input type="hidden" name="mod_action" value="finished">
                                        <button type="submit" class="btn btn-outline-dark w-100">
                                            <?= e(admin_reclama_t('admin_reclama_finish', 'Завершити', 'Завершить', 'Finish')) ?>
                                        </button>
                                    </form>
                                    <div class="small text-muted mt-2">
                                        <?= e(admin_reclama_t(
                                            'admin_reclama_help_finish',
                                            'Остаточно завершує кампанію. Вона більше не буде запускатися автоматично.',
                                            'Окончательно завершает кампанию. Она больше не будет запускаться автоматически.',
                                            'Permanently ends the campaign. It will not resume automatically anymore.'
                                        )) ?>
                                    </div>
                                </div>
                            </div>

                            <div class="col-md-6">
                                <div class="border rounded-3 p-3 h-100">
                                    <form method="post" action="<?= e(admin_reclama_campaign_url($campaignId)) ?>" onsubmit="return confirm('<?= e(admin_reclama_t('admin_reclama_cancel_q', 'Скасувати кампанію?', 'Отменить кампанию?', 'Cancel campaign?')) ?>');">
                                        <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                                        <input type="hidden" name="action" value="moderate_campaign">
                                        <input type="hidden" name="campaign_id" value="<?= e((string)$campaignId) ?>">
                                        <input type="hidden" name="mod_action" value="canceled">
                                        <button type="submit" class="btn btn-outline-danger w-100">
                                            <?= e(admin_reclama_t('admin_reclama_cancel', 'Скасувати', 'Отменить', 'Cancel')) ?>
                                        </button>
                                    </form>
                                    <div class="small text-muted mt-2">
                                        <?= e(admin_reclama_t(
                                            'admin_reclama_help_cancel',
                                            'Скасовує кампанію як неактуальну. Залишає запис у системі, але зупиняє подальше використання.',
                                            'Отменяет кампанию как неактуальную. Запись останется в системе, но дальнейшее использование прекратится.',
                                            'Cancels the campaign as no longer relevant. The record stays in the system, but usage stops.'
                                        )) ?>
                                    </div>
                                </div>
                            </div>
                        <?php endif; ?>

                        <div class="col-md-6">
                            <div class="border border-danger rounded-3 p-3 h-100">
                                <form method="post" action="<?= e(admin_reclama_campaign_url($campaignId)) ?>" onsubmit="return confirm('<?= e(admin_reclama_t('admin_reclama_delete_q', 'Повністю видалити цю кампанію?', 'Полностью удалить эту кампанию?', 'Permanently delete this campaign?')) ?>');">
                                    <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                                    <input type="hidden" name="action" value="delete_campaign">
                                    <input type="hidden" name="campaign_id" value="<?= e((string)$campaignId) ?>">
                                    <button type="submit" class="btn btn-danger w-100">
                                        <?= e(admin_reclama_t('admin_reclama_delete', 'Видалити кампанію', 'Удалить кампанию', 'Delete campaign')) ?>
                                    </button>
                                </form>
                                <div class="small text-muted mt-2">
                                    <?= e(admin_reclama_t(
                                        'admin_reclama_help_delete',
                                        'Повністю видаляє кампанію разом із її таргетингом, статистикою кліків/показів і журналом модерації. Дію не можна скасувати.',
                                        'Полностью удаляет кампанию вместе с её таргетингом, статистикой кликов/показов и журналом модерации. Действие нельзя отменить.',
                                        'Permanently deletes the campaign together with targeting, click/impression stats, and moderation log. This action cannot be undone.'
                                    )) ?>
                                </div>
                            </div>
                        </div>
                    </div>

                    <div class="border rounded-3 p-3">
                        <form method="post" action="<?= e(admin_reclama_campaign_url($campaignId)) ?>">
                            <input type="hidden" name="csrf" value="<?= e(csrf_token()) ?>">
                            <input type="hidden" name="action" value="moderate_campaign">
                            <input type="hidden" name="campaign_id" value="<?= e((string)$campaignId) ?>">
                            <input type="hidden" name="mod_action" value="rejected">

                            <label class="form-label fw-semibold" for="reject_note"><?= e(admin_reclama_t('admin_reclama_reject_reason', 'Причина відхилення', 'Причина отклонения', 'Reject reason')) ?></label>
                            <textarea id="reject_note" name="note" class="form-control mb-3" rows="3" maxlength="500" required><?= e((string)($campaign['reject_reason'] ?? '')) ?></textarea>

                            <button type="submit" class="btn btn-outline-danger">
                                <?= e(admin_reclama_t('admin_reclama_reject', 'Відхилити кампанію', 'Отклонить кампанию', 'Reject campaign')) ?>
                            </button>
                        </form>

                        <div class="small text-muted mt-2">
                            <?= e(admin_reclama_t(
                                'admin_reclama_help_reject',
                                'Відхиляє кампанію і зберігає причину для автора. Користувач побачить, що саме треба виправити.',
                                'Отклоняет кампанию и сохраняет причину для автора. Пользователь увидит, что именно нужно исправить.',
                                'Rejects the campaign and saves the reason for the author. The user will see what exactly must be fixed.'
                            )) ?>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="col-lg-4">
            <div class="card card-app mb-4">
                <div class="card-body">
                    <h2 class="h5 mb-3"><?= e(admin_reclama_t('admin_reclama_meta', 'Службова інформація', 'Служебная информация', 'System information')) ?></h2>

                    <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_created_at', 'Створено', 'Создано', 'Created')) ?></div>
                    <div class="mb-3"><?= e((string)($campaign['created_at'] ?? '')) ?></div>

                    <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_updated_at', 'Оновлено', 'Обновлено', 'Updated')) ?></div>
                    <div class="mb-3"><?= e((string)($campaign['updated_at'] ?? '')) ?></div>

                    <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_paid_at', 'Оплачено / резерв', 'Оплачено / резерв', 'Paid / reserved')) ?></div>
                    <div class="mb-3"><?= trim((string)($campaign['paid_at'] ?? '')) !== '' ? e((string)$campaign['paid_at']) : '—' ?></div>

                    <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_moderated_at', 'Дата модерації', 'Дата модерации', 'Moderated at')) ?></div>
                    <div class="mb-3"><?= trim((string)($campaign['moderated_at'] ?? '')) !== '' ? e((string)$campaign['moderated_at']) : '—' ?></div>

                    <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_approved_by', 'Схвалив', 'Одобрил', 'Approved by')) ?></div>
                    <div class="mb-3"><?= $approvedBy !== '' ? e('@' . $approvedBy) : '—' ?></div>

                    <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_rejected_by', 'Відхилив', 'Отклонил', 'Rejected by')) ?></div>
                    <div class="mb-3"><?= $rejectedBy !== '' ? e('@' . $rejectedBy) : '—' ?></div>

                    <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_reject_reason_lbl', 'Остання причина відхилення', 'Последняя причина отклонения', 'Last reject reason')) ?></div>
                    <div><?= trim((string)($campaign['reject_reason'] ?? '')) !== '' ? e((string)$campaign['reject_reason']) : '—' ?></div>
                </div>
            </div>

            <div class="card card-app mb-4">
                <div class="card-body">
                    <h2 class="h5 mb-3"><?= e(admin_reclama_t('admin_reclama_targeting_title', 'Таргетинг', 'Таргетинг', 'Targeting')) ?></h2>

                    <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_targeting_summary', 'Підсумок', 'Сводка', 'Summary')) ?></div>
                    <div class="mb-3"><?= e(admin_reclama_targeting_human($campaign)) ?></div>

                    <div class="row g-3">
                        <div class="col-6">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_country', 'Країна', 'Страна', 'Country')) ?></div>
                            <div><?= trim((string)($campaign['country_code'] ?? '')) !== '' ? e((string)$campaign['country_code']) : '—' ?></div>
                        </div>
                        <div class="col-6">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_city', 'Місто', 'Город', 'City')) ?></div>
                            <div><?= trim((string)($campaign['city'] ?? '')) !== '' ? e((string)$campaign['city']) : '—' ?></div>
                        </div>
                        <div class="col-6">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_gender', 'Стать', 'Пол', 'Gender')) ?></div>
                            <div><?= e((string)($campaign['gender'] ?? 'any')) ?></div>
                        </div>
                        <div class="col-6">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_language', 'Мова', 'Язык', 'Language')) ?></div>
                            <div><?= e((string)($campaign['lang_code'] ?? 'any')) ?></div>
                        </div>
                        <div class="col-6">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_age', 'Вік', 'Возраст', 'Age')) ?></div>
                            <div>
                                <?= ((string)($campaign['age_from'] ?? '') !== '') ? e((string)$campaign['age_from']) : '…' ?>
                                –
                                <?= ((string)($campaign['age_to'] ?? '') !== '') ? e((string)$campaign['age_to']) : '…' ?>
                            </div>
                        </div>
                        <div class="col-6">
                            <div class="small text-muted mb-1"><?= e(admin_reclama_t('admin_reclama_device', 'Пристрій', 'Устройство', 'Device')) ?></div>
                            <div><?= e((string)($campaign['device_type'] ?? 'all')) ?></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="card card-app mb-4">
                <div class="card-body">
                    <h2 class="h5 mb-3"><?= e(admin_reclama_t('admin_reclama_moderation_log', 'Журнал модерації', 'Журнал модерации', 'Moderation log')) ?></h2>

                    <?php if (!$log): ?>
                        <div class="text-muted"><?= e(admin_reclama_t('admin_reclama_log_empty', 'Журнал поки порожній.', 'Журнал пока пуст.', 'The moderation log is empty.')) ?></div>
                    <?php else: ?>
                        <div class="d-grid gap-3">
                            <?php foreach ($log as $item): ?>
                                <?php
                                $adminUsername = trim((string)($item['admin_username'] ?? ''));
                                $adminName     = trim((string)($item['admin_name'] ?? ''));
                                $note          = trim((string)($item['note'] ?? ''));
                                ?>
                                <div class="border rounded-3 p-3">
                                    <div class="d-flex flex-wrap justify-content-between gap-2 mb-1">
                                        <div class="fw-semibold"><?= e(admin_reclama_label_action((string)($item['action'] ?? ''))) ?></div>
                                        <div class="small text-muted"><?= e((string)($item['created_at'] ?? '')) ?></div>
                                    </div>
                                    <div class="small text-muted mb-2">
                                        <?php if ($adminUsername !== ''): ?>
                                            <?= e('@' . $adminUsername) ?>
                                            <?php if ($adminName !== ''): ?>
                                                · <?= e($adminName) ?>
                                            <?php endif; ?>
                                        <?php else: ?>
                                            <?= e(admin_reclama_t('admin_reclama_system', 'Система', 'Система', 'System')) ?>
                                        <?php endif; ?>
                                    </div>
                                    <?php if ($note !== ''): ?>
                                        <div style="white-space:pre-wrap; word-break:break-word;"><?= e($note) ?></div>
                                    <?php endif; ?>
                                </div>
                            <?php endforeach; ?>
                        </div>
                    <?php endif; ?>
                </div>
            </div>

            <?php if (function_exists('admin_sidebar')) admin_sidebar('reclama_campaigns'); ?>
        </div>
    </div>
</div>

<?php require_once __DIR__ . '/../../includes/footer.php'; ?>