<?php
declare(strict_types=1);

require_once __DIR__ . '/_bootstrap.php';

$pageTitle = rc_t('Створення кампанії', 'Создание кампании', 'Create campaign');
if (function_exists('seo_set')) {
    seo_set([
        'title'     => $pageTitle,
        'robots'    => 'noindex,follow',
        'canonical' => '/functional/reclama/create.php',
    ]);
}

if (!function_exists('rc_find_promotable_post_for_user')) {
    function rc_find_promotable_post_for_user(PDO $pdo, int $userId, int $postId): ?array
    {
        if ($userId <= 0 || $postId <= 0) {
            return null;
        }

        if (!function_exists('reclama_table_exists') || !reclama_table_exists($pdo, 'posts')) {
            return null;
        }

        $hasGroupId = function_exists('reclama_column_exists')
            ? reclama_column_exists($pdo, 'posts', 'group_id')
            : false;

        $hasGroupsTable = function_exists('reclama_table_exists')
            ? reclama_table_exists($pdo, 'groups')
            : false;

        $hasGroupName = $hasGroupsTable && function_exists('reclama_column_exists')
            ? reclama_column_exists($pdo, 'groups', 'name')
            : false;

        $hasGroupSlug = $hasGroupsTable && function_exists('reclama_column_exists')
            ? reclama_column_exists($pdo, 'groups', 'slug')
            : false;

        $groupJoin = ($hasGroupId && $hasGroupsTable)
            ? ' LEFT JOIN `groups` g ON g.id = p.group_id '
            : '';

        $sql = '
            SELECT
                p.id,
                p.user_id,
                p.body,
                p.created_at'
                . ($hasGroupId ? ', p.group_id' : ', NULL AS group_id')
                . ($hasGroupName ? ', g.name AS group_name' : ', NULL AS group_name')
                . ($hasGroupSlug ? ', g.slug AS group_slug' : ', NULL AS group_slug') . '
            FROM posts p
            ' . $groupJoin . '
            WHERE p.id = ?
              AND p.user_id = ?
            LIMIT 1
        ';

        try {
            $st = $pdo->prepare($sql);
            $st->execute([$postId, $userId]);
            $row = $st->fetch(PDO::FETCH_ASSOC) ?: null;

            if (!$row) {
                return null;
            }

            return $row;
        } catch (Throwable $e) {
            return null;
        }
    }
}

if (!function_exists('rc_promotable_post_option_label')) {
    function rc_promotable_post_option_label(array $post, int $excerptLen = 120): string
    {
        $id        = (int)($post['id'] ?? 0);
        $body      = trim((string)($post['body'] ?? ''));
        $groupId   = (int)($post['group_id'] ?? 0);
        $groupName = trim((string)($post['group_name'] ?? ''));

        $prefix = '#' . $id . ' — ';

        if ($groupId > 0) {
            $groupLabel = $groupName !== ''
                ? rc_t('Пост групи', 'Пост группы', 'Group post') . ': ' . $groupName
                : rc_t('Пост групи', 'Пост группы', 'Group post');

            if ($body !== '') {
                return $prefix . '[' . $groupLabel . '] ' . rc_excerpt($body, $excerptLen);
            }

            return $prefix . '[' . $groupLabel . ']';
        }

        if ($body !== '') {
            return $prefix . rc_excerpt($body, $excerptLen);
        }

        return $prefix . rc_t('Без тексту', 'Без текста', 'No text');
    }
}

if (!function_exists('rc_mb_sub')) {
    function rc_mb_sub(string $value, int $start, int $length): string
    {
        if (function_exists('mb_substr')) {
            return (string)mb_substr($value, $start, $length, 'UTF-8');
        }

        return (string)substr($value, $start, $length);
    }
}

if (!function_exists('rc_country_code_norm')) {
    function rc_country_code_norm(?string $code): string
    {
        $code = strtoupper(trim((string)$code));

        if (function_exists('reclama_normalize_country_code')) {
            return (string)(reclama_normalize_country_code($code) ?? '');
        }

        return preg_match('/^[A-Z]{2}$/', $code) ? $code : '';
    }
}

if (!function_exists('rc_country_csv_parse')) {
    function rc_country_csv_parse(?string $value): array
    {
        $value = trim((string)$value);
        if ($value === '') {
            return [];
        }

        $parts = preg_split('/[\s,;]+/u', $value) ?: [];
        $out = [];

        foreach ($parts as $part) {
            $code = rc_country_code_norm($part);
            if ($code !== '') {
                $out[$code] = $code;
            }
        }

        return array_values($out);
    }
}

if (!function_exists('rc_country_option_add')) {
    function rc_country_option_add(array &$map, string $code, string $name = ''): void
    {
        $code = rc_country_code_norm($code);
        $name = trim($name);

        if ($code === '') {
            return;
        }

        if (!isset($map[$code])) {
            $map[$code] = [
                'code' => $code,
                'name' => $name,
            ];
            return;
        }

        if ($map[$code]['name'] === '' && $name !== '') {
            $map[$code]['name'] = $name;
        }
    }
}

if (!function_exists('rc_city_option_add')) {
    function rc_city_option_add(array &$citiesByCountry, string $countryCode, string $city): void
    {
        $countryCode = rc_country_code_norm($countryCode);
        $city = trim(preg_replace('/\s+/u', ' ', trim($city)) ?? trim($city));

        if ($countryCode === '' || $city === '') {
            return;
        }

        $city = rc_mb_sub($city, 0, 120);

        if (!isset($citiesByCountry[$countryCode])) {
            $citiesByCountry[$countryCode] = [];
        }

        $key = function_exists('mb_strtolower')
            ? (string)mb_strtolower($city, 'UTF-8')
            : strtolower($city);

        if (!isset($citiesByCountry[$countryCode][$key])) {
            $citiesByCountry[$countryCode][$key] = $city;
        }
    }
}

if (!function_exists('rc_prepare_audience_options')) {
    function rc_prepare_audience_options(PDO $pdo, array $selectedCountryCodes = [], array $selectedExcludeCodes = [], string $selectedCity = ''): array
    {
        $countriesByCode = [];
        $citiesByCountry = [];

        $usersTable = function_exists('reclama_table_exists') && reclama_table_exists($pdo, 'users');
        $trafficHitsTable = function_exists('reclama_table_exists') && reclama_table_exists($pdo, 'traffic_hits');
        $trafficGeoTable = function_exists('reclama_table_exists') && reclama_table_exists($pdo, 'traffic_ip_geo');

        if ($usersTable) {
            $hasUsersCountryCode = function_exists('reclama_column_exists') && reclama_column_exists($pdo, 'users', 'country_code');
            $hasUsersCountryName = function_exists('reclama_column_exists') && reclama_column_exists($pdo, 'users', 'country');
            $hasUsersCity = function_exists('reclama_column_exists') && reclama_column_exists($pdo, 'users', 'city');

            if ($hasUsersCountryCode) {
                $sql = '
                    SELECT DISTINCT
                        UPPER(TRIM(country_code)) AS country_code'
                        . ($hasUsersCountryName ? ', NULLIF(TRIM(country), "") AS country_name' : ', NULL AS country_name')
                        . ($hasUsersCity ? ', NULLIF(TRIM(city), "") AS city' : ', NULL AS city') . '
                    FROM users
                    WHERE country_code IS NOT NULL
                      AND TRIM(country_code) <> ""
                ';

                try {
                    $st = $pdo->query($sql);
                    foreach (($st ? $st->fetchAll(PDO::FETCH_ASSOC) : []) as $row) {
                        $code = rc_country_code_norm((string)($row['country_code'] ?? ''));
                        $name = trim((string)($row['country_name'] ?? ''));
                        $city = trim((string)($row['city'] ?? ''));

                        if ($code === '') {
                            continue;
                        }

                        rc_country_option_add($countriesByCode, $code, $name);
                        rc_city_option_add($citiesByCountry, $code, $city);
                    }
                } catch (Throwable $e) {
                }
            }
        }

        if ($trafficHitsTable) {
            $hasHitsCountryCode = function_exists('reclama_column_exists') && reclama_column_exists($pdo, 'traffic_hits', 'country_code');
            $hasHitsCity = function_exists('reclama_column_exists') && reclama_column_exists($pdo, 'traffic_hits', 'city');
            $hasHitsBot = function_exists('reclama_column_exists') && reclama_column_exists($pdo, 'traffic_hits', 'is_bot');

            if ($hasHitsCountryCode) {
                $sql = '
                    SELECT DISTINCT
                        UPPER(TRIM(country_code)) AS country_code'
                        . ($hasHitsCity ? ', NULLIF(TRIM(city), "") AS city' : ', NULL AS city') . '
                    FROM traffic_hits
                    WHERE country_code IS NOT NULL
                      AND TRIM(country_code) <> ""'
                    . ($hasHitsBot ? ' AND (is_bot = 0 OR is_bot IS NULL)' : '');

                try {
                    $st = $pdo->query($sql);
                    foreach (($st ? $st->fetchAll(PDO::FETCH_ASSOC) : []) as $row) {
                        $code = rc_country_code_norm((string)($row['country_code'] ?? ''));
                        $city = trim((string)($row['city'] ?? ''));

                        if ($code === '') {
                            continue;
                        }

                        rc_country_option_add($countriesByCode, $code, '');
                        rc_city_option_add($citiesByCountry, $code, $city);
                    }
                } catch (Throwable $e) {
                }
            }
        }

        $missingNameCodes = [];
        foreach ($countriesByCode as $code => $row) {
            if (trim((string)($row['name'] ?? '')) === '') {
                $missingNameCodes[] = $code;
            }
        }

        if ($trafficGeoTable && $missingNameCodes) {
            $placeholders = implode(',', array_fill(0, count($missingNameCodes), '?'));

            try {
                $st = $pdo->prepare('
                    SELECT
                        UPPER(TRIM(country_code)) AS country_code,
                        MAX(NULLIF(TRIM(country_name), "")) AS country_name
                    FROM traffic_ip_geo
                    WHERE country_code IN (' . $placeholders . ')
                    GROUP BY UPPER(TRIM(country_code))
                ');
                $st->execute($missingNameCodes);

                foreach (($st->fetchAll(PDO::FETCH_ASSOC) ?: []) as $row) {
                    $code = rc_country_code_norm((string)($row['country_code'] ?? ''));
                    $name = trim((string)($row['country_name'] ?? ''));

                    if ($code !== '' && isset($countriesByCode[$code]) && $countriesByCode[$code]['name'] === '' && $name !== '') {
                        $countriesByCode[$code]['name'] = $name;
                    }
                }
            } catch (Throwable $e) {
            }
        }

        foreach ($selectedCountryCodes as $code) {
            rc_country_option_add($countriesByCode, $code, '');
        }

        foreach ($selectedExcludeCodes as $code) {
            rc_country_option_add($countriesByCode, $code, '');
        }

        if (count($selectedCountryCodes) === 1 && $selectedCity !== '') {
            rc_city_option_add($citiesByCountry, $selectedCountryCodes[0], $selectedCity);
        }

        uasort($countriesByCode, static function (array $a, array $b): int {
            $la = trim((string)($a['name'] ?? '')) !== '' ? trim((string)$a['name']) : (string)$a['code'];
            $lb = trim((string)($b['name'] ?? '')) !== '' ? trim((string)$b['name']) : (string)$b['code'];

            return strcasecmp($la, $lb);
        });

        $countries = [];
        foreach ($countriesByCode as $row) {
            $code = (string)$row['code'];
            $name = trim((string)($row['name'] ?? ''));
            $label = $name !== '' ? ($name . ' (' . $code . ')') : $code;

            $countries[] = [
                'code'  => $code,
                'name'  => $name,
                'label' => $label,
            ];
        }

        $citiesOutput = [];
        foreach ($citiesByCountry as $countryCode => $cityMap) {
            $cityList = array_values($cityMap);
            natcasesort($cityList);
            $citiesOutput[$countryCode] = array_values($cityList);
        }

        return [
            'countries'         => $countries,
            'cities_by_country' => $citiesOutput,
        ];
    }
}

$form = rc_campaign_form_defaults($pdo);
$errors = [];

$requestedPostId = max(0, (int)($_GET['post_id'] ?? $_POST['post_id'] ?? 0));
$selectedPromotePost = null;

$posts = rc_user_posts($pdo, $meId, 50);

if ($requestedPostId > 0) {
    if (!reclama_allow_post_campaigns($pdo)) {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            $errors[] = rc_t(
                'Просування постів зараз вимкнене.',
                'Продвижение постов сейчас отключено.',
                'Post promotion is currently disabled.'
            );
        }
    } else {
        $selectedPromotePost = rc_find_promotable_post_for_user($pdo, $meId, $requestedPostId);

        if (!$selectedPromotePost) {
            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                $errors[] = rc_t(
                    'Обраний пост не знайдено або його не можна рекламувати.',
                    'Выбранный пост не найден или его нельзя рекламировать.',
                    'The selected post was not found or cannot be promoted.'
                );
            }
        } else {
            $selectedId = (int)$selectedPromotePost['id'];
            $existsInList = false;

            foreach ($posts as $postRow) {
                if ((int)($postRow['id'] ?? 0) === $selectedId) {
                    $existsInList = true;
                    break;
                }
            }

            if (!$existsInList) {
                array_unshift($posts, $selectedPromotePost);
            }

            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                $form['campaign_type'] = 'post';
                $form['source_post_id'] = (string)$selectedId;
                $form['target_url'] = '';

                if (trim((string)($form['title'] ?? '')) === '') {
                    $prefillTitle = trim(rc_excerpt((string)($selectedPromotePost['body'] ?? ''), 120));
                    if ($prefillTitle !== '') {
                        $form['title'] = $prefillTitle;
                    }
                }
            }
        }
    }
}

$typeLockedToPost = ($selectedPromotePost !== null);
$desktopOnlyMode = reclama_allow_desktop_only($pdo);

if ($desktopOnlyMode && (string)($form['campaign_type'] ?? '') === 'banner') {
    $form['device_type'] = 'desktop';
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!rc_csrf_ok((string)($_POST['csrf'] ?? ''))) {
        $errors[] = rc_t('Недійсний CSRF-токен.', 'Недействительный CSRF-токен.', 'Invalid CSRF token.');
    } else {
        $form = rc_collect_campaign_input($_POST, $form);

        if ($typeLockedToPost && $selectedPromotePost) {
            $form['campaign_type'] = 'post';
            $form['source_post_id'] = (string)((int)$selectedPromotePost['id']);
        }

        if ($desktopOnlyMode && (string)($form['campaign_type'] ?? '') === 'banner') {
            $form['device_type'] = 'desktop';
        }

        if ((string)($form['campaign_type'] ?? '') === 'post') {
            $form['target_url'] = '';

            if (!reclama_allow_post_campaigns($pdo)) {
                $errors[] = rc_t(
                    'Просування постів зараз вимкнене.',
                    'Продвижение постов сейчас отключено.',
                    'Post promotion is currently disabled.'
                );
            } else {
                $postIdToValidate = max(0, (int)($form['source_post_id'] ?? 0));
                $validatedPost = rc_find_promotable_post_for_user($pdo, $meId, $postIdToValidate);

                if (!$validatedPost) {
                    $errors[] = rc_t(
                        'Можна рекламувати тільки власний пост.',
                        'Можно рекламировать только свой пост.',
                        'You can only promote your own post.'
                    );
                } else {
                    $selectedPromotePost = $validatedPost;
                    $form['source_post_id'] = (string)((int)$validatedPost['id']);

                    if (trim((string)($form['title'] ?? '')) === '') {
                        $prefillTitle = trim(rc_excerpt((string)($validatedPost['body'] ?? ''), 120));
                        if ($prefillTitle !== '') {
                            $form['title'] = $prefillTitle;
                        }
                    }
                }
            }
        }

        if (!$errors) {
            $submit = isset($_POST['submit_for_moderation']);

            $save = rc_save_campaign($pdo, $me, $form, [
                'desktop_banner' => $_FILES['desktop_banner'] ?? null,
                'mobile_banner'  => $_FILES['mobile_banner'] ?? null,
            ], $submit, null);

            if (!($save['ok'] ?? false)) {
                $errors = array_merge($errors, (array)($save['errors'] ?? [rc_t('Не вдалося створити кампанію.', 'Не удалось создать кампанию.', 'Failed to create campaign.')]));
            } else {
                rc_flash_set(
                    'success',
                    $submit
                        ? rc_t(
                            'Кампанію збережено і відправлено на модерацію. На сторінці кампанії її можна буде оплатити через VM Coins.',
                            'Кампания сохранена и отправлена на модерацию. На странице кампании её можно будет оплатить через VM Coins.',
                            'The campaign was saved and submitted for moderation. You can pay for it with VM Coins on the campaign page.'
                        )
                        : rc_t('Кампанію збережено як чернетку.', 'Кампания сохранена как черновик.', 'The campaign was saved as a draft.')
                );
                rc_redirect('/functional/reclama/view.php?id=' . (int)$save['campaign_id']);
            }
        }
    }
}

$pricePerDay   = reclama_price_per_day($pdo);
$minDays       = reclama_min_days($pdo);
$maxDays       = reclama_max_days($pdo);
$userBalance   = reclama_get_user_balance($pdo, $meId);
$previewDays   = reclama_calc_days((string)($form['start_date'] ?? ''), (string)($form['end_date'] ?? ''));
$previewTotal  = reclama_calc_total($previewDays, $pricePerDay);
$previewShort  = max(0, $previewTotal - $userBalance);

$selectedCountryCodes  = rc_country_csv_parse((string)($form['country_code'] ?? ''));
$selectedCity          = trim((string)($form['city'] ?? ''));
$selectedExcludeCodes  = rc_country_csv_parse((string)($form['exclude_countries'] ?? ''));

$audienceOptions       = rc_prepare_audience_options($pdo, $selectedCountryCodes, $selectedExcludeCodes, $selectedCity);
$countryOptions        = (array)($audienceOptions['countries'] ?? []);
$citiesByCountry       = (array)($audienceOptions['cities_by_country'] ?? []);

$countryCitiesJson     = json_encode($citiesByCountry, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$countryCitiesJson     = is_string($countryCitiesJson) ? $countryCitiesJson : '{}';

$selectedCountriesStr  = implode(', ', $selectedCountryCodes);
$selectedExcludesStr   = implode(', ', $selectedExcludeCodes);

require_once __DIR__ . '/../../includes/header.php';
?>
<style>
  .rc-box{border:1px solid rgba(0,0,0,.08);border-radius:18px;background:#fff;box-shadow:0 6px 18px rgba(0,0,0,.04)}
  .rc-help{font-size:13px;color:#6c757d}
  .rc-preview-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .rc-preview-stat{padding:14px;border:1px solid rgba(0,0,0,.08);border-radius:14px;background:#fff}
  .rc-balance-chip{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;border-radius:999px;background:#f8f9fa;border:1px solid rgba(0,0,0,.08);font-weight:600}
  .rc-subbox{padding:14px;border:1px solid rgba(0,0,0,.08);border-radius:14px;background:#fcfcfd}
  .rc-section-title{font-size:14px;font-weight:700;color:#495057;margin-bottom:8px}
  .rc-multiselect{min-height:180px}
  .rc-guide-step{display:flex;gap:12px;padding:12px 0;border-top:1px solid rgba(0,0,0,.06)}
  .rc-guide-step:first-child{border-top:0;padding-top:0}
  .rc-guide-num{flex:0 0 32px;height:32px;border-radius:999px;display:flex;align-items:center;justify-content:center;background:#f1f3f5;font-weight:700;color:#495057}
  .rc-guide-text strong{display:block;margin-bottom:4px}
  .rc-note{padding:12px 14px;border:1px dashed rgba(0,0,0,.12);border-radius:14px;background:#fff}
  @media (max-width: 575.98px){
    .rc-preview-grid{grid-template-columns:1fr}
    .rc-multiselect{min-height:140px}
  }
</style>

<div class="container py-4">
  <div class="d-flex flex-wrap align-items-center justify-content-between gap-3 mb-4">
    <div>
      <h1 class="h3 mb-1"><?= h($pageTitle) ?></h1>
      <div class="text-muted"><?= h(rc_t('Підготуй кампанію, задай період і збережи її як чернетку або відправ на перевірку.', 'Подготовь кампанию, задай период и сохрани её как черновик или отправь на проверку.', 'Prepare your campaign, set the period, then save it as a draft or submit it for review.')) ?></div>
    </div>
    <div class="d-flex flex-wrap gap-2 align-items-center">
      <span class="rc-balance-chip"><?= h(rc_t('Баланс', 'Баланс', 'Balance')) ?>: <?= h(rc_num($userBalance)) ?> VM Coins</span>
      <a class="btn btn-outline-secondary" href="/functional/reclama/">← <?= h(rc_t('Центр реклами', 'Центр рекламы', 'Ad center')) ?></a>
      <a class="btn btn-outline-secondary" href="/functional/reclama/my.php"><?= h(rc_t('Мої кампанії', 'Мои кампании', 'My campaigns')) ?></a>
    </div>
  </div>

  <?php if ($errors): ?>
    <div class="alert alert-danger">
      <ul class="mb-0 ps-3">
        <?php foreach ($errors as $e): ?>
          <li><?= h((string)$e) ?></li>
        <?php endforeach; ?>
      </ul>
    </div>
  <?php endif; ?>

  <form method="post" enctype="multipart/form-data" class="row g-4">
    <input type="hidden" name="csrf" value="<?= h(rc_csrf_token()) ?>">

    <div class="col-lg-8">
      <div class="rc-box p-4 mb-4">
        <h2 class="h5 mb-3"><?= h(rc_t('Основне', 'Основное', 'Basics')) ?></h2>
        <div class="row g-3">
          <div class="col-md-6">
            <label class="form-label"><?= h(rc_t('Тип кампанії', 'Тип кампании', 'Campaign type')) ?></label>

            <?php if ($typeLockedToPost): ?>
              <input type="hidden" name="campaign_type" value="post">
              <select class="form-select" disabled>
                <option value="post" selected><?= h(rc_t('Просування поста', 'Продвижение поста', 'Post promotion')) ?></option>
              </select>
            <?php else: ?>
              <select class="form-select" name="campaign_type" id="campaignType">
                <?php if (reclama_allow_post_campaigns($pdo)): ?>
                  <option value="post" <?= $form['campaign_type'] === 'post' ? 'selected' : '' ?>><?= h(rc_t('Просування поста', 'Продвижение поста', 'Post promotion')) ?></option>
                <?php endif; ?>
                <?php if (reclama_allow_banner_campaigns($pdo)): ?>
                  <option value="banner" <?= $form['campaign_type'] === 'banner' ? 'selected' : '' ?>><?= h(rc_t('Банерна кампанія', 'Баннерная кампания', 'Banner campaign')) ?></option>
                <?php endif; ?>
              </select>
            <?php endif; ?>
          </div>

          <div class="col-md-6">
            <label class="form-label"><?= h(rc_t('Назва кампанії', 'Название кампании', 'Campaign title')) ?></label>
            <input class="form-control" type="text" name="title" maxlength="190" value="<?= h((string)$form['title']) ?>" placeholder="<?= h(rc_t('Наприклад: Весняна акція', 'Например: Весенняя акция', 'Example: Spring sale')) ?>">
          </div>
        </div>
      </div>

      <div class="rc-box p-4 mb-4" id="postBlock">
        <h2 class="h5 mb-3"><?= h(rc_t('Пост для просування', 'Пост для продвижения', 'Post to promote')) ?></h2>

        <?php if ($typeLockedToPost && $selectedPromotePost): ?>
          <input type="hidden" name="source_post_id" value="<?= (int)$selectedPromotePost['id'] ?>">
          <label class="form-label"><?= h(rc_t('Обраний пост', 'Выбранный пост', 'Selected post')) ?></label>
          <select class="form-select" disabled>
            <option selected><?= h(rc_promotable_post_option_label($selectedPromotePost, 120)) ?></option>
          </select>

          <div class="alert alert-light border mt-3 mb-0">
            <div class="fw-semibold mb-1"><?= h(rc_t('Рекламуватиметься саме цей пост', 'Будет рекламироваться именно этот пост', 'This exact post will be promoted')) ?></div>
            <div class="text-muted small"><?= h(rc_promotable_post_option_label($selectedPromotePost, 220)) ?></div>
          </div>
        <?php else: ?>
          <label class="form-label"><?= h(rc_t('Оберіть свій пост', 'Выберите свой пост', 'Choose your post')) ?></label>
          <select class="form-select" name="source_post_id">
            <option value=""><?= h(rc_t('— оберіть пост —', '— выбери пост —', '— choose a post —')) ?></option>
            <?php foreach ($posts as $post): ?>
              <option value="<?= (int)$post['id'] ?>" <?= (string)$form['source_post_id'] === (string)$post['id'] ? 'selected' : '' ?>>
                <?= h(rc_promotable_post_option_label((array)$post, 120)) ?>
              </option>
            <?php endforeach; ?>
          </select>
        <?php endif; ?>

        <div class="rc-help mt-2"><?= h(rc_t('Для просування поста назва може підтягнутися автоматично з тексту поста.', 'Для продвижения поста название может подтянуться автоматически из текста поста.', 'For post promotion the title can be generated automatically from the post text.')) ?></div>
      </div>

      <div class="rc-box p-4 mb-4" id="bannerBlock">
        <h2 class="h5 mb-3"><?= h(rc_t('Банери', 'Баннеры', 'Banners')) ?></h2>
        <div class="row g-3">
          <div class="<?= $desktopOnlyMode ? 'col-12' : 'col-md-6' ?>">
            <label class="form-label"><?= h(rc_t('Desktop-банер', 'Desktop-баннер', 'Desktop banner')) ?></label>
            <input class="form-control" type="file" name="desktop_banner" accept="image/jpeg,image/png,image/webp,image/gif">
            <div class="rc-help mt-2">
              <?= h($desktopOnlyMode
                ? rc_t(
                    'Рекомендовано 300×600 px або 240×400 px. JPG/PNG/WEBP/GIF, max 8 MB. Зараз банерні кампанії налаштовані тільки для комп’ютерної версії, тому desktop-банер є єдиним потрібним форматом.',
                    'Рекомендуется 300×600 px или 240×400 px. JPG/PNG/WEBP/GIF, max 8 MB. Сейчас баннерные кампании настроены только для компьютерной версии, поэтому desktop-баннер является единственным нужным форматом.',
                    'Recommended size is 300×600 px or 240×400 px. JPG/PNG/WEBP/GIF, max 8 MB. Banner campaigns are currently set for desktop only, so the desktop banner is the only required format.'
                )
                : 'Recommended size is 300×600 px or 240×400 px. JPG/PNG/WEBP/GIF, max 8 MB.') ?>
            </div>
          </div>

          <?php if (!$desktopOnlyMode): ?>
            <div class="col-md-6">
              <label class="form-label"><?= h(rc_t('Mobile-банер', 'Mobile-баннер', 'Mobile banner')) ?></label>
              <input class="form-control" type="file" name="mobile_banner" accept="image/jpeg,image/png,image/webp,image/gif">
              <div class="rc-help mt-2"><?= h(rc_t('Рекомендовано 320×480 px або 300×250 px. Якщо не завантажити, на телефоні можна буде використати desktop-версію.', 'Рекомендуется 320×480 px или 300×250 px. Если не загрузить, на телефоне можно будет использовать desktop-версию.', 'Recommended size is 320×480 px or 300×250 px. If omitted, the desktop version can be used on mobile.')) ?></div>
            </div>
          <?php else: ?>
            <div class="col-12">
              <div class="alert alert-light border mb-0">
                <?= h(rc_t(
                  'Mobile-банер приховано, бо в адмінці увімкнено режим показу банерів тільки на комп’ютерах.',
                  'Mobile-баннер скрыт, потому что в админке включён режим показа баннеров только на компьютерах.',
                  'The mobile banner field is hidden because desktop-only banner delivery is enabled in the admin settings.'
                )) ?>
              </div>
            </div>
          <?php endif; ?>
        </div>
      </div>

      <div class="rc-box p-4 mb-4">
        <h2 class="h5 mb-3"><?= h(rc_t('Період і бюджет', 'Период и бюджет', 'Period and budget')) ?></h2>
        <div class="row g-3">
          <div class="col-md-4">
            <label class="form-label"><?= h(rc_t('Дата старту', 'Дата старта', 'Start date')) ?></label>
            <input class="form-control" type="date" name="start_date" id="startDate" value="<?= h((string)$form['start_date']) ?>">
          </div>
          <div class="col-md-4">
            <label class="form-label"><?= h(rc_t('Дата завершення', 'Дата завершения', 'End date')) ?></label>
            <input class="form-control" type="date" name="end_date" id="endDate" value="<?= h((string)$form['end_date']) ?>">
          </div>
          <div class="col-md-4" id="targetUrlWrap">
            <label class="form-label"><?= h(rc_t('Посилання переходу', 'Ссылка перехода', 'Destination URL')) ?></label>
            <input class="form-control" type="text" name="target_url" maxlength="255" value="<?= h((string)$form['target_url']) ?>" placeholder="https://example.com <?= h(rc_t('або', 'или', 'or')) ?> /profile/...">
            <div class="rc-help mt-2">
              <?= h(rc_t(
                'Це адреса, куди людина перейде після кліку по банеру. Тут можна вказати профіль, групу, сторінку товару, лендінг або зовнішній сайт.',
                'Это адрес, куда человек перейдёт после клика по баннеру. Здесь можно указать профиль, группу, страницу товара, лендинг или внешний сайт.',
                'This is the page a person opens after clicking the banner. You can point it to a profile, group, product page, landing page, or external website.'
              )) ?>
            </div>
          </div>
        </div>

        <div class="row g-3 mt-1">
          <div class="col-md-4"><div class="rc-help"><?= h(rc_t('Мінімум днів', 'Минимум дней', 'Minimum days')) ?>: <?= h((string)$minDays) ?></div></div>
          <div class="col-md-4"><div class="rc-help"><?= h(rc_t('Максимум днів', 'Максимум дней', 'Maximum days')) ?>: <?= h((string)$maxDays) ?></div></div>
          <div class="col-md-4"><div class="rc-help"><?= h(rc_t('Ціна за день', 'Цена за день', 'Price per day')) ?>: <?= h(rc_num($pricePerDay)) ?> VM Coins</div></div>
        </div>

        <div class="rc-preview-grid mt-3">
          <div class="rc-preview-stat">
            <div class="text-muted small"><?= h(rc_t('Попередньо днів', 'Предварительно дней', 'Estimated days')) ?></div>
            <div class="fw-semibold fs-5" id="previewDays"><?= h((string)$previewDays) ?></div>
          </div>
          <div class="rc-preview-stat">
            <div class="text-muted small"><?= h(rc_t('Попередній бюджет', 'Предварительный бюджет', 'Estimated budget')) ?></div>
            <div class="fw-semibold fs-5"><span id="previewTotal"><?= h(rc_num($previewTotal)) ?></span> VM Coins</div>
          </div>
          <div class="rc-preview-stat">
            <div class="text-muted small"><?= h(rc_t('На балансі', 'На балансе', 'Your balance')) ?></div>
            <div class="fw-semibold fs-5"><?= h(rc_num($userBalance)) ?> VM Coins</div>
          </div>
          <div class="rc-preview-stat">
            <div class="text-muted small"><?= h(rc_t('Не вистачає', 'Не хватает', 'Missing')) ?></div>
            <div class="fw-semibold fs-5" id="previewShort"><?= h(rc_num($previewShort)) ?></div>
          </div>
        </div>
      </div>

      <div class="rc-box p-4">
        <h2 class="h5 mb-3"><?= h(rc_t('Аудиторія і таргетинг', 'Аудитория и таргетинг', 'Audience and targeting')) ?></h2>

        <div class="rc-subbox mb-3">
          <div class="rc-section-title"><?= h(rc_t('Базові фільтри', 'Базовые фильтры', 'Basic filters')) ?></div>
          <div class="row g-3">
            <div class="col-md-4">
              <label class="form-label"><?= h(rc_t('Країни показу', 'Страны показа', 'Target countries')) ?></label>
              <input type="hidden" name="country_code" id="countryCodesInput" value="<?= h($selectedCountriesStr) ?>">
              <select class="form-select rc-multiselect" id="countryCodesSelect" multiple>
                <?php foreach ($countryOptions as $countryRow): ?>
                  <option value="<?= h((string)$countryRow['code']) ?>" <?= in_array((string)$countryRow['code'], $selectedCountryCodes, true) ? 'selected' : '' ?>>
                    <?= h((string)$countryRow['label']) ?>
                  </option>
                <?php endforeach; ?>
              </select>
              <div class="rc-help mt-2">
                <?= h(rc_t(
                  'Можна вибрати одну або кілька країн. Якщо вибрано кілька країн, місто стає недоступним. Для вибору кількох пунктів утримуй Ctrl або Cmd.',
                  'Можно выбрать одну или несколько стран. Если выбрано несколько стран, город становится недоступным. Для выбора нескольких пунктов удерживай Ctrl или Cmd.',
                  'You can select one or several countries. If several countries are selected, city targeting becomes unavailable. Hold Ctrl or Cmd to select multiple items.'
                )) ?>
              </div>
            </div>

            <div class="col-md-4">
              <label class="form-label"><?= h(rc_t('Місто', 'Город', 'City')) ?></label>
              <select class="form-select" name="city" id="citySelect" data-selected="<?= h($selectedCity) ?>">
                <option value=""><?= h(rc_t('Оберіть одну країну', 'Выберите одну страну', 'Choose one country')) ?></option>
              </select>
              <div class="rc-help mt-2">
                <?= h(rc_t(
                  'Місто можна вибрати тільки тоді, коли для показу обрана рівно одна країна.',
                  'Город можно выбрать только тогда, когда для показа выбрана ровно одна страна.',
                  'A city can only be selected when exactly one target country is chosen.'
                )) ?>
              </div>
            </div>

            <div class="col-md-2">
              <label class="form-label"><?= h(rc_t('Стать', 'Пол', 'Gender')) ?></label>
              <select class="form-select" name="gender">
                <option value="any" <?= $form['gender'] === 'any' ? 'selected' : '' ?>><?= h(rc_t('Будь-яка', 'Любой', 'Any')) ?></option>
                <option value="m" <?= $form['gender'] === 'm' ? 'selected' : '' ?>><?= h(rc_t('Чоловіча', 'Мужской', 'Male')) ?></option>
                <option value="f" <?= $form['gender'] === 'f' ? 'selected' : '' ?>><?= h(rc_t('Жіноча', 'Женский', 'Female')) ?></option>
              </select>
            </div>

            <div class="col-md-2">
              <label class="form-label"><?= h(rc_t('Вік від', 'Возраст от', 'Age from')) ?></label>
              <input class="form-control" type="number" min="13" max="100" name="age_from" value="<?= h((string)$form['age_from']) ?>">
            </div>

            <div class="col-md-2">
              <label class="form-label"><?= h(rc_t('Вік до', 'Возраст до', 'Age to')) ?></label>
              <input class="form-control" type="number" min="13" max="100" name="age_to" value="<?= h((string)$form['age_to']) ?>">
            </div>

            <div class="col-md-3">
              <label class="form-label"><?= h(rc_t('Мова інтерфейсу', 'Язык интерфейса', 'Interface language')) ?></label>
              <select class="form-select" name="lang_code">
                <option value="any" <?= $form['lang_code'] === 'any' ? 'selected' : '' ?>><?= h(rc_t('Будь-яка', 'Любой', 'Any')) ?></option>
                <option value="uk" <?= $form['lang_code'] === 'uk' ? 'selected' : '' ?>>Українська</option>
                <option value="ru" <?= $form['lang_code'] === 'ru' ? 'selected' : '' ?>>Русский</option>
                <option value="en" <?= $form['lang_code'] === 'en' ? 'selected' : '' ?>>English</option>
              </select>
            </div>

            <div class="col-md-3">
              <label class="form-label"><?= h(rc_t('Пристрій', 'Устройство', 'Device')) ?></label>
              <select class="form-select" name="device_type" id="deviceTypeSelect">
                <option value="all" <?= $form['device_type'] === 'all' ? 'selected' : '' ?>><?= h(rc_t('Усі', 'Все', 'All')) ?></option>
                <option value="desktop" <?= $form['device_type'] === 'desktop' ? 'selected' : '' ?>>Desktop</option>
                <option value="mobile" <?= $form['device_type'] === 'mobile' ? 'selected' : '' ?>>Mobile</option>
              </select>
              <div class="rc-help mt-2" id="deviceTypeHelp"></div>
            </div>
          </div>
        </div>

        <div class="rc-subbox">
          <div class="rc-section-title"><?= h(rc_t('Розширені умови показу', 'Расширенные условия показа', 'Advanced delivery rules')) ?></div>
          <div class="row g-3">
            <div class="col-md-6">
              <label class="form-label"><?= h(rc_t('Виключити країни', 'Исключить страны', 'Exclude countries')) ?></label>
              <input type="hidden" name="exclude_countries" id="excludeCountriesInput" value="<?= h($selectedExcludesStr) ?>">
              <select class="form-select rc-multiselect" id="excludeCountriesSelect" multiple>
                <?php foreach ($countryOptions as $countryRow): ?>
                  <option value="<?= h((string)$countryRow['code']) ?>" <?= in_array((string)$countryRow['code'], $selectedExcludeCodes, true) ? 'selected' : '' ?>>
                    <?= h((string)$countryRow['label']) ?>
                  </option>
                <?php endforeach; ?>
              </select>
              <div class="rc-help mt-2">
                <?= h(rc_t(
                  'Тут можна вибрати кілька країн, яким рекламу показувати не треба. Для вибору кількох пунктів утримуй Ctrl або Cmd.',
                  'Здесь можно выбрать несколько стран, которым рекламу показывать не нужно. Для выбора нескольких пунктов удерживай Ctrl или Cmd.',
                  'Here you can choose several countries that should be excluded from delivery. Hold Ctrl or Cmd to select multiple items.'
                )) ?>
              </div>
            </div>

            <div class="col-md-6">
              <label class="form-label"><?= h(rc_t('Кому показувати', 'Кому показывать', 'Show to')) ?></label>
              <select class="form-select" name="auth_scope">
                <option value="all" <?= (string)$form['auth_scope'] === 'all' ? 'selected' : '' ?>><?= h(rc_t('Усім', 'Всем', 'Everyone')) ?></option>
                <option value="guests" <?= (string)$form['auth_scope'] === 'guests' ? 'selected' : '' ?>><?= h(rc_t('Тільки гостям', 'Только гостям', 'Guests only')) ?></option>
                <option value="users" <?= (string)$form['auth_scope'] === 'users' ? 'selected' : '' ?>><?= h(rc_t('Тільки авторизованим', 'Только авторизованным', 'Logged-in users only')) ?></option>
              </select>

              <div class="rc-note mt-3">
                <div class="fw-semibold mb-1"><?= h(rc_t('Що таке сегменти?', 'Что такое сегменты?', 'What are segments?')) ?></div>
                <div class="rc-help">
                  <?= h(rc_t(
                    'Сегменти — це окремі готові аудиторії, наприклад “нові користувачі”, “активні покупці” або “постійні відвідувачі”. Зараз у сайту ще немає нормальної системи таких рекламних сегментів, тому це поле тільки плутає. Я прибрав його з форми, але технічне поле залишив приховано, щоб нічого не зламати в логіці збереження.',
                    'Сегменты — это отдельные готовые аудитории, например “новые пользователи”, “активные покупатели” или “постоянные посетители”. Сейчас у сайта ещё нет нормальной системы таких рекламных сегментов, поэтому это поле только путает. Я убрал его из формы, но техническое поле оставил скрытым, чтобы ничего не сломать в логике сохранения.',
                    'Segments are predefined audiences such as “new users”, “active buyers”, or “returning visitors”. The site does not yet have a proper advertising segment system, so this field only causes confusion. I removed it from the visible form, but kept the technical field hidden so the save logic stays intact.'
                  )) ?>
                </div>
              </div>
              <input type="hidden" name="segment_codes" value="<?= h((string)($form['segment_codes'] ?? '')) ?>">
            </div>
          </div>

          <div class="rc-help mt-3">
            <?= h(rc_t(
              'Якщо поле не заповнене — воно не обмежує показ. Країни показу не можна одночасно залишати у списку виключень.',
              'Если поле не заполнено — оно не ограничивает показ. Страны показа нельзя одновременно оставлять в списке исключений.',
              'If a field is empty, it does not restrict delivery. Target countries cannot stay in the exclusion list at the same time.'
            )) ?>
          </div>
        </div>
      </div>
    </div>

    <div class="col-lg-4">
      <div class="rc-box p-4 mb-4 sticky-top" style="top:16px;">
        <h2 class="h5 mb-3"><?= h(rc_t('Підказка', 'Подсказка', 'Guide')) ?></h2>

        <div class="rc-guide-step">
          <div class="rc-guide-num">1</div>
          <div class="rc-guide-text">
            <strong><?= h(rc_t('Оберіть формат реклами', 'Выберите формат рекламы', 'Choose the ad format')) ?></strong>
            <div class="text-muted small"><?= h(
              $desktopOnlyMode
                ? rc_t(
                    'Для просування поста достатньо вибрати свій пост. Для банерної кампанії в поточному режимі потрібен тільки desktop-банер, бо показ іде лише на комп’ютерах.',
                    'Для продвижения поста достаточно выбрать свой пост. Для баннерной кампании в текущем режиме нужен только desktop-баннер, потому что показ идёт только на компьютерах.',
                    'For post promotion, simply choose your post. In the current banner mode, only a desktop banner is needed because delivery runs on desktop only.'
                  )
                : rc_t(
                    'Для просування поста достатньо вибрати свій пост. Для банерної кампанії потрібно завантажити банер. Desktop-банер для банерного формату є основним.',
                    'Для продвижения поста достаточно выбрать свой пост. Для баннерной кампании нужно загрузить баннер. Desktop-баннер для баннерного формата является основным.',
                    'For post promotion, simply choose your post. For a banner campaign, upload a banner. The desktop banner is the primary asset for banner campaigns.'
                  )
            ) ?></div>
          </div>
        </div>

        <div class="rc-guide-step">
          <div class="rc-guide-num">2</div>
          <div class="rc-guide-text">
            <strong><?= h(rc_t('Задайте період і одразу дивіться бюджет', 'Задайте период и сразу смотрите бюджет', 'Set the period and watch the budget')) ?></strong>
            <div class="text-muted small"><?= h(rc_t(
              'Бюджет рахується автоматично: кількість днів × ціна за день. Тут же видно, скільки монет уже є на балансі і чи вистачає їх на кампанію.',
              'Бюджет считается автоматически: количество дней × цена за день. Здесь же видно, сколько монет уже есть на балансе и хватает ли их на кампанию.',
              'The budget is calculated automatically: number of days × price per day. You can also see your current balance and whether it covers the campaign.'
            )) ?></div>
          </div>
        </div>

        <div class="rc-guide-step">
          <div class="rc-guide-num">3</div>
          <div class="rc-guide-text">
            <strong><?= h(rc_t('Не звужуйте аудиторію занадто сильно', 'Не сужайте аудиторию слишком сильно', 'Do not narrow the audience too much')) ?></strong>
            <div class="text-muted small"><?= h(rc_t(
              'Якщо одночасно вказати багато фільтрів, охоплення може стати дуже маленьким. Почни з ширшої аудиторії, а потім звужуй її.',
              'Если одновременно указать много фильтров, охват может стать очень маленьким. Начни с более широкой аудитории, а затем сужай её.',
              'If you set many filters at once, your reach may become too small. Start broader and narrow it later.'
            )) ?></div>
          </div>
        </div>

        <div class="rc-guide-step">
          <div class="rc-guide-num">4</div>
          <div class="rc-guide-text">
            <strong><?= h(rc_t('Чернетка ще не показується', 'Черновик ещё не показывается', 'A draft is not shown yet')) ?></strong>
            <div class="text-muted small"><?= h(rc_t(
              'Після збереження чернетки кампанія не потрапляє в показ. Далі її треба відправити на модерацію, а після схвалення — оплатити через VM Coins.',
              'После сохранения черновика кампания не попадает в показ. Далее её нужно отправить на модерацию, а после одобрения — оплатить через VM Coins.',
              'After saving a draft, the campaign is not delivered yet. Then it must be submitted for moderation and, once approved, paid with VM Coins.'
            )) ?></div>
          </div>
        </div>

        <div class="rc-guide-step">
          <div class="rc-guide-num">5</div>
          <div class="rc-guide-text">
            <strong><?= h(rc_t('Для поста окреме посилання не потрібне', 'Для поста отдельная ссылка не нужна', 'A separate link is not needed for post promotion')) ?></strong>
            <div class="text-muted small"><?= h(rc_t(
              'Коли рекламується пост, користувач взаємодіє саме з ним. Поле посилання використовується тільки для банерної реклами.',
              'Когда рекламируется пост, пользователь взаимодействует именно с ним. Поле ссылки используется только для баннерной рекламы.',
              'When a post is promoted, the user interacts with that post itself. The destination link field is used only for banner ads.'
            )) ?></div>
          </div>
        </div>

        <div class="alert alert-light border mb-3 mt-3">
          <div class="small text-muted mb-1"><?= h(rc_t('Поточний попередній бюджет', 'Текущий предварительный бюджет', 'Current estimated budget')) ?></div>
          <div class="fw-semibold fs-5"><span id="sidePreviewTotal"><?= h(rc_num($previewTotal)) ?></span> VM Coins</div>
        </div>

        <div class="d-grid gap-2">
          <button class="btn btn-outline-secondary" type="submit" name="save_draft" value="1"><?= h(rc_t('Зберегти чернетку', 'Сохранить черновик', 'Save draft')) ?></button>
          <button class="btn btn-primary" type="submit" name="submit_for_moderation" value="1"><?= h(rc_t('Відправити на модерацію', 'Отправить на модерацию', 'Submit for moderation')) ?></button>
        </div>
      </div>
    </div>
  </form>
</div>

<script>
(function(){
  const typeEl = document.getElementById('campaignType');
  const postBlock = document.getElementById('postBlock');
  const bannerBlock = document.getElementById('bannerBlock');
  const targetUrlWrapEl = document.getElementById('targetUrlWrap');
  const startDateEl = document.getElementById('startDate');
  const endDateEl = document.getElementById('endDate');
  const previewDaysEl = document.getElementById('previewDays');
  const previewTotalEl = document.getElementById('previewTotal');
  const sidePreviewTotalEl = document.getElementById('sidePreviewTotal');
  const previewShortEl = document.getElementById('previewShort');

  const includeCountriesEl = document.getElementById('countryCodesSelect');
  const includeCountriesInputEl = document.getElementById('countryCodesInput');
  const cityEl = document.getElementById('citySelect');

  const excludeCountriesEl = document.getElementById('excludeCountriesSelect');
  const excludeCountriesInputEl = document.getElementById('excludeCountriesInput');

  const deviceTypeEl = document.getElementById('deviceTypeSelect');
  const deviceTypeHelpEl = document.getElementById('deviceTypeHelp');

  const countryCities = <?= $countryCitiesJson ?>;
  const pricePerDay = <?= json_encode((int)$pricePerDay, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
  const balance = <?= json_encode((int)$userBalance, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
  const desktopOnlyMode = <?= json_encode($desktopOnlyMode, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;

  const cityChooseOneLabel = <?= json_encode(rc_t('Оберіть одну країну', 'Выберите одну страну', 'Choose one country'), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
  const cityAllLabel = <?= json_encode(rc_t('Усі міста', 'Все города', 'All cities'), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
  const deviceHelpDefault = <?= json_encode('', JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
  const deviceHelpDesktopOnly = <?= json_encode(
    rc_t(
      'Для банерної кампанії зараз доступний тільки Desktop, бо в адмінці увімкнено режим показу банерів лише на комп’ютерах.',
      'Для баннерной кампании сейчас доступен только Desktop, потому что в админке включён режим показа баннеров только на компьютерах.',
      'For banner campaigns, only Desktop is available right now because desktop-only banner delivery is enabled in the admin settings.'
    ),
    JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
  ) ?>;

  function formatNum(value){
    try {
      return new Intl.NumberFormat().format(Number(value || 0));
    } catch (e) {
      return String(value || 0);
    }
  }

  function calcDays(startStr, endStr){
    if (!startStr || !endStr) return 0;

    const start = new Date(startStr + 'T00:00:00');
    const end = new Date(endStr + 'T00:00:00');

    if (isNaN(start.getTime()) || isNaN(end.getTime())) return 0;
    if (end < start) return 0;

    const diffMs = end.getTime() - start.getTime();
    return Math.floor(diffMs / 86400000) + 1;
  }

  function getSelectedValues(selectEl){
    if (!selectEl) return [];
    return Array.from(selectEl.options)
      .filter(opt => opt.selected && opt.value)
      .map(opt => String(opt.value || '').trim())
      .filter(Boolean);
  }

  function syncDeviceTypeConstraints(){
    if (!deviceTypeEl) return;

    const type = typeEl ? typeEl.value : 'post';
    const isBanner = (type === 'banner');
    const forceDesktop = desktopOnlyMode && isBanner;

    Array.from(deviceTypeEl.options).forEach(function(opt){
      if (opt.value === 'all' || opt.value === 'mobile') {
        opt.disabled = forceDesktop;
      } else {
        opt.disabled = false;
      }
    });

    if (forceDesktop) {
      deviceTypeEl.value = 'desktop';
    }

    if (deviceTypeHelpEl) {
      deviceTypeHelpEl.textContent = forceDesktop ? deviceHelpDesktopOnly : deviceHelpDefault;
    }
  }

  function syncType(){
    const type = typeEl ? typeEl.value : 'post';
    const isPost = (type === 'post');

    if (postBlock) postBlock.style.display = isPost ? '' : 'none';
    if (bannerBlock) bannerBlock.style.display = isPost ? 'none' : '';
    if (targetUrlWrapEl) targetUrlWrapEl.style.display = isPost ? 'none' : '';
    syncDeviceTypeConstraints();
  }

  function syncBudget(){
    const days = calcDays(startDateEl ? startDateEl.value : '', endDateEl ? endDateEl.value : '');
    const total = days * pricePerDay;
    const short = Math.max(0, total - balance);

    if (previewDaysEl) previewDaysEl.textContent = String(days);
    if (previewTotalEl) previewTotalEl.textContent = formatNum(total);
    if (sidePreviewTotalEl) sidePreviewTotalEl.textContent = formatNum(total);
    if (previewShortEl) previewShortEl.textContent = formatNum(short);
  }

  function fillCityOptions(selectedCountries, selectedCity){
    if (!cityEl) return;

    const countries = Array.isArray(selectedCountries) ? selectedCountries : [];
    const selected = String(selectedCity || '');

    cityEl.innerHTML = '';

    if (countries.length !== 1) {
      const option = document.createElement('option');
      option.value = '';
      option.textContent = cityChooseOneLabel;
      option.selected = true;
      cityEl.appendChild(option);
      cityEl.value = '';
      cityEl.disabled = true;
      return;
    }

    const countryCode = countries[0];
    const cities = Array.isArray(countryCities[countryCode]) ? countryCities[countryCode] : [];

    const emptyOption = document.createElement('option');
    emptyOption.value = '';
    emptyOption.textContent = cityAllLabel;
    cityEl.appendChild(emptyOption);

    cities.forEach(function(cityName){
      const option = document.createElement('option');
      option.value = cityName;
      option.textContent = cityName;
      if (selected !== '' && cityName === selected) {
        option.selected = true;
      }
      cityEl.appendChild(option);
    });

    if (selected !== '' && !cities.includes(selected)) {
      const option = document.createElement('option');
      option.value = selected;
      option.textContent = selected;
      option.selected = true;
      cityEl.appendChild(option);
    }

    cityEl.disabled = false;
  }

  function syncExcludeCountries(){
    if (!excludeCountriesEl || !excludeCountriesInputEl) return;

    const includeValues = getSelectedValues(includeCountriesEl);

    Array.from(excludeCountriesEl.options).forEach(function(opt){
      if (includeValues.includes(String(opt.value || ''))) {
        opt.selected = false;
      }
    });

    const excludeValues = getSelectedValues(excludeCountriesEl).filter(function(code){
      return !includeValues.includes(code);
    });

    excludeCountriesInputEl.value = excludeValues.join(', ');
  }

  function syncIncludeCountries(resetCity){
    if (!includeCountriesEl || !includeCountriesInputEl) return;

    const includeValues = getSelectedValues(includeCountriesEl);
    includeCountriesInputEl.value = includeValues.join(', ');

    const selectedCity = (!resetCity && cityEl) ? String(cityEl.value || cityEl.getAttribute('data-selected') || '') : '';
    fillCityOptions(includeValues, includeValues.length === 1 ? selectedCity : '');
    syncExcludeCountries();
  }

  if (typeEl) {
    typeEl.addEventListener('change', syncType);
  }

  if (startDateEl) {
    startDateEl.addEventListener('change', syncBudget);
    startDateEl.addEventListener('input', syncBudget);
  }

  if (endDateEl) {
    endDateEl.addEventListener('change', syncBudget);
    endDateEl.addEventListener('input', syncBudget);
  }

  if (includeCountriesEl) {
    includeCountriesEl.addEventListener('change', function(){
      syncIncludeCountries(true);
    });
  }

  if (excludeCountriesEl) {
    excludeCountriesEl.addEventListener('change', syncExcludeCountries);
  }

  syncType();
  syncBudget();
  syncIncludeCountries(false);
  syncExcludeCountries();
})();
</script>

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