<?php
declare(strict_types=1);

require_once __DIR__ . '/bootstrap.php';
require_once __DIR__ . '/admin_auth_lib.php';
require_once __DIR__ . '/site_join_guides_lib.php';

header('Content-Type: application/json; charset=utf-8');

if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') {
    http_response_code(405);
    echo json_encode(['ok' => false, 'error' => 'method'], JSON_UNESCAPED_UNICODE);
    exit;
}

mocker_require_csrf_post();

mocker_admin_require_login();

$input = json_decode((string) file_get_contents('php://input'), true) ?: [];
$type = $input['type'] ?? '';
$data = $input['data'] ?? null;

$permByType = [
    'sponsors' => 'sponsors',
    'sponsor_promo_codes' => 'sponsors',
    'social' => 'social',
    'site' => 'site',
    'popup' => 'site',
    'gamdom_turnuva' => 'site',
    'market' => 'market',
];
if ($type === 'bonuses') {
    mocker_admin_require_login();
    if (!mocker_admin_can('bonuses') && !mocker_admin_can('sponsors')) {
        http_response_code(403);
        echo json_encode(['ok' => false, 'error' => 'forbidden'], JSON_UNESCAPED_UNICODE);
        exit;
    }
} elseif (!isset($permByType[$type])) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'error' => 'unknown_type']);
    exit;
} else {
    mocker_admin_require_permission($permByType[$type]);
}

$dataDir = dirname(__DIR__) . '/data/';
if (!is_dir($dataDir)) {
    if (!mkdir($dataDir, 0755, true) && !is_dir($dataDir)) {
        http_response_code(500);
        echo json_encode(['ok' => false, 'error' => 'data klasörü oluşturulamadı']);
        exit;
    }
}

$writeJson = static function (string $path, $payload): void {
    $json = json_encode(
        $payload,
        JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
    );
    if ($json === false) {
        throw new RuntimeException('JSON encode failed');
    }
    if (file_put_contents($path, $json) === false) {
        throw new RuntimeException('Yazılamadı: ' . basename($path));
    }
};

try {
    if ($type === 'sponsors') {
        if (!is_array($data)) {
            throw new InvalidArgumentException('Geçersiz sponsor verisi');
        }
        $clean = [];
        foreach ($data as $row) {
            if (!is_array($row)) {
                continue;
            }
            $id = isset($row['id']) ? (string) $row['id'] : '';
            $title = isset($row['title']) ? trim((string) $row['title']) : '';
            if ($id === '' || $title === '') {
                continue;
            }
            $promo = $row['promo'] ?? [];
            if (!is_array($promo)) {
                $promo = [];
            }
            $promo = array_values(array_filter(array_map('strval', $promo), static fn ($x) => $x !== ''));
            $badge = $row['badge'] ?? null;
            if ($badge !== null) {
                $badge = trim((string) $badge);
                $legacyBadgeMap = [
                    'oynadigim' => 'ana-sponsorlar',
                    'guvenilir' => 'ana-sponsorlar',
                    'Önerilen' => 'ana-sponsorlar',
                    'SPONSORLAR' => 'ana-sponsorlar',
                    'Güvenilir' => 'ana-sponsorlar',
                ];
                if (isset($legacyBadgeMap[$badge])) {
                    $badge = $legacyBadgeMap[$badge];
                }
                if ($badge !== 'ana-sponsorlar') {
                    $badge = 'ana-sponsorlar';
                }
            }
            $logo = isset($row['logo']) ? trim((string) $row['logo']) : '';
            if ($logo !== '' && !preg_match('#^https?://#i', $logo)) {
                throw new InvalidArgumentException('Logo CDN tam adresi http:// veya https:// ile başlamalı (kart: ' . $id . ')');
            }
            $clean[] = [
                'id' => $id,
                'title' => $title,
                'logo' => $logo,
                'promo' => $promo,
                'description' => isset($row['description']) ? trim((string) $row['description']) : '',
                'url' => isset($row['url']) ? trim((string) $row['url']) : '',
                'badge' => $badge,
            ];
        }
        $writeJson($dataDir . 'sponsors.json', $clean);
    } elseif ($type === 'social') {
        if (!is_array($data)) {
            throw new InvalidArgumentException('Geçersiz sosyal verisi');
        }
        $clean = [];
        foreach ($data as $row) {
            if (!is_array($row)) {
                continue;
            }
            $id = isset($row['id']) ? trim((string) $row['id']) : '';
            $name = isset($row['name']) ? trim((string) $row['name']) : '';
            if ($id === '' || $name === '') {
                continue;
            }
            $icon = isset($row['icon']) ? (string) $row['icon'] : '';
            $icon = preg_replace('/<script\b[^>]*>.*?<\/script>/is', '', $icon) ?? '';
            $clean[] = [
                'id' => $id,
                'name' => $name,
                'href' => isset($row['href']) ? trim((string) $row['href']) : '#',
                'icon' => $icon,
            ];
        }
        $writeJson($dataDir . 'social.json', $clean);
    } elseif ($type === 'site') {
        if (!is_array($data)) {
            throw new InvalidArgumentException('Geçersiz site verisi');
        }
        $rawCss = isset($data['customCss']) ? (string) $data['customCss'] : '';
        $cssLen = function_exists('mb_strlen') ? mb_strlen($rawCss, 'UTF-8') : strlen($rawCss);
        if ($cssLen > 200000) {
            throw new InvalidArgumentException('Özel CSS en fazla 200000 karakter olabilir.');
        }

        $trimLocaleBlock = static function (array $b): array {
            return [
                'telegramUrl' => isset($b['telegramUrl']) ? trim((string) $b['telegramUrl']) : '',
                'contactIntro' => isset($b['contactIntro']) ? trim((string) $b['contactIntro']) : '',
                'contactCardTitle' => isset($b['contactCardTitle']) ? trim((string) $b['contactCardTitle']) : '',
                'contactCardSubtitle' => isset($b['contactCardSubtitle']) ? trim((string) $b['contactCardSubtitle']) : '',
                'contactButton' => isset($b['contactButton']) ? trim((string) $b['contactButton']) : '',
                'contactEyebrow' => isset($b['contactEyebrow']) ? trim((string) $b['contactEyebrow']) : '',
                'contactHeading' => isset($b['contactHeading']) ? trim((string) $b['contactHeading']) : '',
            ];
        };

        $trimMaintLocale = static function (array $b): array {
            return [
                'eyebrow' => isset($b['eyebrow']) ? trim((string) $b['eyebrow']) : '',
                'title' => isset($b['title']) ? trim((string) $b['title']) : '',
                'message' => isset($b['message']) ? trim((string) $b['message']) : '',
            ];
        };

        $trimMaintenance = static function ($raw) use ($trimMaintLocale): array {
            if (!is_array($raw)) {
                return [
                    'enabled' => false,
                    'imageUrl' => '',
                    'locales' => [
                        'tr' => $trimMaintLocale([]),
                        'en' => $trimMaintLocale([]),
                    ],
                ];
            }
            $enabled = !empty($raw['enabled']);
            $imageUrl = isset($raw['imageUrl']) ? trim((string) $raw['imageUrl']) : '';
            if ($imageUrl !== '' && !preg_match('#^https?://#i', $imageUrl)) {
                throw new InvalidArgumentException('Bakım görseli boş olmalı veya http(s) adresi olmalı.');
            }
            $localesIn = isset($raw['locales']) && is_array($raw['locales']) ? $raw['locales'] : [];
            $trM = isset($localesIn['tr']) && is_array($localesIn['tr']) ? $trimMaintLocale($localesIn['tr']) : $trimMaintLocale([]);
            $enM = isset($localesIn['en']) && is_array($localesIn['en']) ? $trimMaintLocale($localesIn['en']) : $trimMaintLocale([]);
            return [
                'enabled' => $enabled,
                'imageUrl' => $imageUrl,
                'locales' => [
                    'tr' => $trM,
                    'en' => $enM,
                ],
            ];
        };

        
        $trimOptionalHttpUrl = static function (string $key) use ($data): string {
            $v = isset($data[$key]) ? trim((string) $data[$key]) : '';
            if ($v === '') {
                return '';
            }
            if (!preg_match('#^https?://#i', $v)) {
                throw new InvalidArgumentException($key . ' boş olmalı veya http(s) adresi olmalı.');
            }
            return $v;
        };

        if (isset($data['locales']) && is_array($data['locales'])) {
            $defLoc = isset($data['defaultLocale']) && $data['defaultLocale'] === 'en' ? 'en' : 'tr';
            $localesIn = $data['locales'];
            $tr = isset($localesIn['tr']) && is_array($localesIn['tr']) ? $trimLocaleBlock($localesIn['tr']) : $trimLocaleBlock([]);
            $en = isset($localesIn['en']) && is_array($localesIn['en']) ? $trimLocaleBlock($localesIn['en']) : $trimLocaleBlock([]);
            $clean = [
                'customCss' => $rawCss,
                'defaultLocale' => $defLoc,
                'locales' => [
                    'tr' => $tr,
                    'en' => $en,
                ],
            ];
        } else {
            $clean = [
                'telegramUrl' => isset($data['telegramUrl']) ? trim((string) $data['telegramUrl']) : '',
                'contactIntro' => isset($data['contactIntro']) ? trim((string) $data['contactIntro']) : '',
                'contactCardTitle' => isset($data['contactCardTitle']) ? trim((string) $data['contactCardTitle']) : '',
                'contactCardSubtitle' => isset($data['contactCardSubtitle']) ? trim((string) $data['contactCardSubtitle']) : '',
                'contactButton' => isset($data['contactButton']) ? trim((string) $data['contactButton']) : '',
                'customCss' => $rawCss,
            ];
        }
        $clean['logoUrl'] = $trimOptionalHttpUrl('logoUrl');
        $clean['faviconUrl'] = $trimOptionalHttpUrl('faviconUrl');
        $clean['ogImageUrl'] = $trimOptionalHttpUrl('ogImageUrl');
        $clean['maintenance'] = $trimMaintenance($data['maintenance'] ?? null);

        $existingSitePath = $dataDir . 'site.json';
        $existingSite = is_readable($existingSitePath)
            ? json_decode((string) file_get_contents($existingSitePath), true)
            : [];
        if (!is_array($existingSite)) {
            $existingSite = [];
        }
        $prevYoutube = is_array($existingSite['youtube'] ?? null) ? $existingSite['youtube'] : [];

        $trimYoutube = static function (?array $ytIn) use ($data, $prevYoutube): array {
            $in = is_array($ytIn) ? $ytIn : (is_array($data['youtube'] ?? null) ? $data['youtube'] : $prevYoutube);
            $channelId = isset($in['channelId']) ? trim((string) $in['channelId']) : '';
            $handle = isset($in['handle']) ? trim((string) $in['handle']) : '';
            $channelUrl = isset($in['channelUrl']) ? trim((string) $in['channelUrl']) : '';
            if ($handle !== '' && str_starts_with($handle, '@')) {
                $handle = ltrim($handle, '@');
            }
            if ($channelUrl !== '') {
                $channelUrl = strtok($channelUrl, '?') ?: $channelUrl;
                $channelUrl = rtrim($channelUrl, '/');
                if ($handle === '' && preg_match('#youtube\.com/@([^/?#]+)#i', $channelUrl, $m)) {
                    $handle = trim((string) $m[1]);
                }
                if ($channelId === '' && preg_match('#youtube\.com/channel/(UC[a-zA-Z0-9_-]{22})#i', $channelUrl, $m)) {
                    $channelId = $m[1];
                }
            }
            if ($channelUrl === '' && $handle !== '') {
                $channelUrl = 'https://www.youtube.com/@' . rawurlencode($handle);
            }
            if ($channelUrl === '' && $channelId !== '') {
                $channelUrl = 'https://www.youtube.com/channel/' . rawurlencode($channelId);
            }
            if ($channelId !== '' && !preg_match('/^UC[a-zA-Z0-9_-]{22}$/', $channelId)) {
                throw new InvalidArgumentException('YouTube kanal kimliği UC ile başlayan 24 karakter olmalı.');
            }
            $maxVideos = isset($in['maxVideos']) ? (int) $in['maxVideos'] : 4;
            if ($maxVideos < 1) {
                $maxVideos = 4;
            }
            if ($maxVideos > 12) {
                $maxVideos = 12;
            }
            return [
                'channelId' => $channelId,
                'handle' => $handle,
                'channelUrl' => $channelUrl,
                'maxVideos' => $maxVideos,
            ];
        };

        $newYoutube = $trimYoutube(is_array($data['youtube'] ?? null) ? $data['youtube'] : null);
        $clean['youtube'] = $newYoutube;

        $prevJoinGuides = is_array($existingSite['joinGuides'] ?? null) ? $existingSite['joinGuides'] : [];
        $clean['joinGuides'] = mocker_join_guides_trim_all($data['joinGuides'] ?? $prevJoinGuides);

        if (json_encode($prevYoutube) !== json_encode($newYoutube)) {
            foreach ([
                $dataDir . 'cache/youtube_feed.json',
                $dataDir . 'youtube_feed.json',
                $dataDir . 'cache/youtube_channel.json',
            ] as $cachePath) {
                if (is_file($cachePath)) {
                    @unlink($cachePath);
                }
            }
        }

        $writeJson($dataDir . 'site.json', $clean);
    } elseif ($type === 'popup') {
        if (!is_array($data)) {
            throw new InvalidArgumentException('Geçersiz popup verisi');
        }
        $enabled = !empty($data['enabled']);
        $title = isset($data['title']) ? trim((string) $data['title']) : '';
        if (mocker_utf8_len($title) > 120) {
            throw new InvalidArgumentException('Popup başlığı en fazla 120 karakter olabilir.');
        }
        $imageUrl = isset($data['imageUrl']) ? trim((string) $data['imageUrl']) : '';
        $linkUrl = isset($data['linkUrl']) ? trim((string) $data['linkUrl']) : '';
        $frequency = isset($data['frequency']) ? (string) $data['frequency'] : 'session';
        if (!in_array($frequency, ['session', 'day'], true)) {
            $frequency = 'session';
        }
        $rawStart = $data['startAt'] ?? null;
        $rawEnd = $data['endAt'] ?? null;
        $startAt = ($rawStart === null || $rawStart === '') ? null : (int) $rawStart;
        $endAt = ($rawEnd === null || $rawEnd === '') ? null : (int) $rawEnd;
        if ($startAt !== null && $startAt < 0) {
            throw new InvalidArgumentException('Başlangıç tarihi geçersiz.');
        }
        if ($endAt !== null && $endAt < 0) {
            throw new InvalidArgumentException('Bitiş tarihi geçersiz.');
        }
        if ($startAt !== null && $endAt !== null && $endAt < $startAt) {
            throw new InvalidArgumentException('Bitiş tarihi başlangıçtan önce olamaz.');
        }
        if ($enabled) {
            if ($imageUrl === '' || !preg_match('#^https?://#i', $imageUrl)) {
                throw new InvalidArgumentException('Popup açıkken görsel URL (https://) zorunludur.');
            }
        } elseif ($imageUrl !== '' && !preg_match('#^https?://#i', $imageUrl)) {
            throw new InvalidArgumentException('Görsel URL tam adresi http:// veya https:// ile başlamalı.');
        }
        if ($linkUrl !== '' && !preg_match('#^https?://#i', $linkUrl) && !str_starts_with($linkUrl, '#')) {
            throw new InvalidArgumentException('Görsel linki http(s) veya # ile başlayan site içi rota olmalı.');
        }

        $clean = [
            'enabled' => $enabled,
            'title' => $title,
            'imageUrl' => $imageUrl,
            'linkUrl' => $linkUrl,
            'startAt' => $startAt,
            'endAt' => $endAt,
            'frequency' => $frequency,
        ];
        $writeJson($dataDir . 'popup.json', $clean);
    } elseif ($type === 'legal_pages') {
        if (!is_array($data)) {
            throw new InvalidArgumentException('Geçersiz yasal sayfa verisi');
        }
        $allowedSlugs = ['privacy', 'terms', 'cookies'];
        $allowedLocales = ['tr', 'en'];
        $clean = [];
        foreach ($allowedSlugs as $slug) {
            $bucket = $data[$slug] ?? [];
            if (!is_array($bucket)) {
                $bucket = [];
            }
            $localesIn = $bucket['locales'] ?? [];
            if (!is_array($localesIn)) {
                $localesIn = [];
            }
            $cleanLocales = [];
            foreach ($allowedLocales as $loc) {
                $L = $localesIn[$loc] ?? [];
                if (!is_array($L)) {
                    $L = [];
                }
                $title = trim((string) ($L['title'] ?? ''));
                $intro = trim((string) ($L['intro'] ?? ''));
                if (mocker_utf8_len($title) > 200) {
                    throw new InvalidArgumentException('Yasal sayfa başlığı çok uzun (en fazla 200 karakter).');
                }
                if (mocker_utf8_len($intro) > 500) {
                    throw new InvalidArgumentException('Yasal sayfa özeti çok uzun (en fazla 500 karakter).');
                }
                $sections = [];
                $rawSections = $L['sections'] ?? [];
                if (is_array($rawSections)) {
                    foreach ($rawSections as $sec) {
                        if (!is_array($sec)) {
                            continue;
                        }
                        $st = trim((string) ($sec['title'] ?? ''));
                        $sb = trim((string) ($sec['body'] ?? ''));
                        if ($st === '' && $sb === '') {
                            continue;
                        }
                        if (mocker_utf8_len($st) > 120) {
                            throw new InvalidArgumentException('Bölüm başlığı çok uzun (en fazla 120 karakter).');
                        }
                        if (mocker_utf8_len($sb) > 8000) {
                            throw new InvalidArgumentException('Bölüm metni çok uzun (en fazla 8000 karakter).');
                        }
                        $sections[] = ['title' => $st, 'body' => $sb];
                    }
                }
                if (count($sections) > 40) {
                    throw new InvalidArgumentException('Bölüm sayısı en fazla 40 olabilir.');
                }
                $cleanLocales[$loc] = [
                    'title' => $title,
                    'intro' => $intro,
                    'sections' => $sections,
                ];
            }
            $clean[$slug] = ['locales' => $cleanLocales];
        }
        $writeJson($dataDir . 'legal-pages.json', $clean);
    } elseif ($type === 'gamdom_turnuva') {
        if (!is_array($data)) {
            throw new InvalidArgumentException('Geçersiz Gamdom turnuva verisi');
        }
        $enabled = !empty($data['enabled']);
        $title = isset($data['title']) ? trim((string) $data['title']) : 'Gamdom Çevrim Etkinliği';
        $prizePool = isset($data['prizePool']) ? trim((string) $data['prizePool']) : '';
        $logoUrl = isset($data['logoUrl']) ? trim((string) $data['logoUrl']) : '';
        $ctaLabel = isset($data['ctaLabel']) ? trim((string) $data['ctaLabel']) : '';
        $ctaUrl = isset($data['ctaUrl']) ? trim((string) $data['ctaUrl']) : '';
        $rulesUrl = isset($data['rulesUrl']) ? trim((string) $data['rulesUrl']) : '';
        $rulesText = isset($data['rulesText']) ? trim((string) $data['rulesText']) : '';
        $rulesTitle = isset($data['rulesTitle']) ? trim((string) $data['rulesTitle']) : '';
        if (mocker_utf8_len($rulesText) > 50000) {
            throw new InvalidArgumentException('Kurallar metni çok uzun (en fazla 50000 karakter).');
        }
        if (mocker_utf8_len($rulesTitle) > 200) {
            throw new InvalidArgumentException('Kurallar başlığı çok uzun.');
        }
        $rawEnd = $data['endAt'] ?? null;
        $endAt = ($rawEnd === null || $rawEnd === '') ? null : (int) $rawEnd;
        if ($endAt !== null && $endAt < 0) {
            throw new InvalidArgumentException('Bitiş tarihi geçersiz.');
        }
        if ($logoUrl !== '') {
            $logoOk = preg_match('#^https?://#i', $logoUrl) === 1
                || preg_match('#^/assets/gamdom/[a-zA-Z0-9._-]+(?:\?v=\d+)?$#', $logoUrl) === 1;
            if (!$logoOk) {
                throw new InvalidArgumentException('Logo: https://… adresi veya /assets/gamdom/… yolu kullanın.');
            }
            if (strlen($logoUrl) > 2048) {
                throw new InvalidArgumentException('Logo URL çok uzun.');
            }
        }
        if ($ctaUrl !== '' && !preg_match('#^https?://#i', $ctaUrl) && !str_starts_with($ctaUrl, '#')) {
            throw new InvalidArgumentException('Katılım linki http(s) veya # ile başlamalı.');
        }
        if ($rulesUrl !== '' && !preg_match('#^https?://#i', $rulesUrl)) {
            throw new InvalidArgumentException('Kurallar linki http(s) ile başlamalı.');
        }

        $periods = [];
        if (isset($data['periods']) && is_array($data['periods'])) {
            foreach ($data['periods'] as $p) {
                if (!is_array($p)) {
                    continue;
                }
                $id = isset($p['id']) ? preg_replace('/[^a-zA-Z0-9_-]/', '', (string) $p['id']) : '';
                $label = isset($p['label']) ? trim((string) $p['label']) : '';
                if ($id === '') {
                    continue;
                }
                $periods[] = ['id' => $id, 'label' => $label !== '' ? $label : $id];
            }
        }
        if ($periods === []) {
            $periods[] = ['id' => 'default', 'label' => 'Güncel dönem'];
        }

        $activePeriodId = isset($data['activePeriodId']) ? preg_replace('/[^a-zA-Z0-9_-]/', '', (string) $data['activePeriodId']) : '';
        $validIds = array_column($periods, 'id');
        if ($activePeriodId === '' || !in_array($activePeriodId, $validIds, true)) {
            $activePeriodId = $periods[0]['id'];
        }

        $sanitizeEntries = static function ($raw): array {
            if (!is_array($raw)) {
                return [];
            }
            $out = [];
            $n = 0;
            foreach ($raw as $row) {
                if (!is_array($row)) {
                    continue;
                }
                $n++;
                if ($n > 50) {
                    break;
                }
                $hidden = !empty($row['hidden']);
                $username = $hidden ? '' : trim((string) ($row['username'] ?? ''));
                $wager = isset($row['wager']) ? (float) $row['wager'] : 0.0;
                $wagerDisplay = trim((string) ($row['wagerDisplay'] ?? ''));
                $reward = trim((string) ($row['reward'] ?? ''));
                $out[] = [
                    'rank' => isset($row['rank']) ? max(1, min(50, (int) $row['rank'])) : $n,
                    'username' => $username,
                    'hidden' => $hidden,
                    'wager' => $wager,
                    'wagerDisplay' => $wagerDisplay,
                    'reward' => $reward,
                ];
            }
            usort($out, static fn (array $a, array $b): int => ((float) ($b['wager'] ?? 0)) <=> ((float) ($a['wager'] ?? 0)));
            foreach ($out as $i => &$e) {
                $e['rank'] = $i + 1;
            }
            unset($e);
            return $out;
        };

        $periodsData = [];
        if (isset($data['periodsData']) && is_array($data['periodsData'])) {
            foreach ($data['periodsData'] as $pid => $bucket) {
                if (!is_array($bucket)) {
                    continue;
                }
                $safePid = preg_replace('/[^a-zA-Z0-9_-]/', '', (string) $pid);
                if ($safePid === '' || !in_array($safePid, $validIds, true)) {
                    continue;
                }
                $periodsData[$safePid] = [
                    'entries' => $sanitizeEntries($bucket['entries'] ?? []),
                ];
            }
        }
        foreach ($validIds as $vid) {
            if (!isset($periodsData[$vid])) {
                $periodsData[$vid] = ['entries' => []];
            }
        }

        $apiIn = isset($data['api']) && is_array($data['api']) ? $data['api'] : [];
        $clientId = trim((string) ($apiIn['clientId'] ?? $apiIn['xClient'] ?? 'mocker.com'));
        $api = [
            'enabled' => !empty($apiIn['enabled']),
            'url' => isset($apiIn['url']) ? trim((string) $apiIn['url']) : '',
            'clientId' => $clientId !== '' ? $clientId : 'mocker.com',
            'origin' => isset($apiIn['origin']) ? trim((string) $apiIn['origin']) : 'https://mocker27.com',
            'apiKey' => isset($apiIn['apiKey']) ? trim((string) $apiIn['apiKey']) : '',
            'method' => 'GET',
            'monthParam' => isset($apiIn['monthParam']) ? trim((string) $apiIn['monthParam']) : 'month',
        ];
        if ($api['url'] !== '' && !preg_match('#^https?://#i', $api['url'])) {
            throw new InvalidArgumentException('API URL http(s) ile başlamalı.');
        }
        if ($api['monthParam'] === '') {
            $api['monthParam'] = 'month';
        }

        $clean = [
            'enabled' => $enabled,
            'title' => $title !== '' ? $title : 'Gamdom Çevrim Etkinliği',
            'prizePool' => $prizePool,
            'logoUrl' => $logoUrl,
            'ctaLabel' => $ctaLabel,
            'ctaUrl' => $ctaUrl,
            'rulesUrl' => $rulesUrl,
            'rulesText' => $rulesText,
            'rulesTitle' => $rulesTitle !== '' ? $rulesTitle : 'Kurallar ve Şartlar',
            'endAt' => $endAt,
            'activePeriodId' => $activePeriodId,
            'periods' => $periods,
            'periodsData' => $periodsData,
            'api' => $api,
        ];
        $writeJson($dataDir . 'gamdom-turnuva.json', $clean);
    } elseif ($type === 'market') {
        if (!is_array($data)) {
            throw new InvalidArgumentException('Geçersiz market verisi');
        }
        $seen = [];
        $clean = [];
        foreach ($data as $row) {
            if (!is_array($row)) {
                continue;
            }
            $id = isset($row['id']) ? trim((string) $row['id']) : '';
            $title = isset($row['title']) ? trim((string) $row['title']) : '';
            if ($id === '' || $title === '') {
                continue;
            }
            if (isset($seen[$id])) {
                throw new InvalidArgumentException('Yinelenen ürün kodu (id): ' . $id);
            }
            $seen[$id] = true;
            $price = isset($row['price']) ? (int) $row['price'] : 0;
            if ($price < 1) {
                throw new InvalidArgumentException('Coin fiyatı en az 1 olmalı (ürün: ' . $id . ')');
            }
            $stock = isset($row['stock']) ? (int) $row['stock'] : 0;
            if ($stock < 0) {
                throw new InvalidArgumentException('Stok 0 veya üzeri olmalı (ürün: ' . $id . ')');
            }
            $logo = isset($row['logo']) ? trim((string) $row['logo']) : '';
            if ($logo !== '' && !preg_match('#^https?://#i', $logo)) {
                throw new InvalidArgumentException('Resim URL tam adresi http:// veya https:// ile başlamalı (ürün: ' . $id . ')');
            }
            $clean[] = [
                'id' => $id,
                'title' => $title,
                'logo' => $logo,
                'description' => isset($row['description']) ? trim((string) $row['description']) : '',
                'price' => $price,
                'stock' => $stock,
            ];
        }
        $writeJson($dataDir . 'market.json', $clean);
    } elseif ($type === 'sponsor_promo_codes') {
        if (!is_array($data)) {
            throw new InvalidArgumentException('Geçersiz promosyon kodu verisi');
        }
        $clean = [];
        $seen = [];
        foreach ($data as $row) {
            if (!is_array($row)) {
                continue;
            }
            $id = isset($row['id']) ? trim((string) $row['id']) : '';
            $sponsorId = isset($row['sponsorId']) ? trim((string) $row['sponsorId']) : '';
            $sponsorTitle = isset($row['sponsorTitle']) ? trim((string) $row['sponsorTitle']) : '';
            $code = isset($row['code']) ? trim((string) $row['code']) : '';
            if ($id === '' || $code === '' || ($sponsorId === '' && $sponsorTitle === '')) {
                continue;
            }
            if (isset($seen[$id])) {
                throw new InvalidArgumentException('Yinelenen kayıt id: ' . $id);
            }
            $seen[$id] = true;
            if (strlen($code) > 128) {
                throw new InvalidArgumentException('Promo kod en fazla 128 karakter (id: ' . $id . ')');
            }
            $expiresAt = null;
            if (isset($row['expiresAt']) && $row['expiresAt'] !== null && $row['expiresAt'] !== '') {
                $expiresAt = (int) $row['expiresAt'];
                if ($expiresAt < 0) {
                    $expiresAt = null;
                }
            }
            $linkUrl = isset($row['url']) ? trim((string) $row['url']) : '';
            if ($linkUrl !== '' && !preg_match('#^https?://#i', $linkUrl)) {
                throw new InvalidArgumentException('Link http(s) ile başlamalı (id: ' . $id . ')');
            }
            $isActive = !isset($row['isActive']) || $row['isActive'] !== false;
            $createdAt = isset($row['createdAt']) ? (int) $row['createdAt'] : time();
            if ($createdAt < 1) {
                $createdAt = time();
            }
            $clean[] = [
                'id' => $id,
                'sponsorId' => $sponsorId,
                'sponsorTitle' => $sponsorTitle,
                'code' => $code,
                'label' => isset($row['label']) ? trim((string) $row['label']) : '',
                'description' => isset($row['description']) ? trim((string) $row['description']) : '',
                'expiresAt' => $expiresAt,
                'url' => $linkUrl,
                'isActive' => $isActive,
                'createdAt' => $createdAt,
            ];
        }
        $writeJson($dataDir . 'sponsor_promo_codes.json', $clean);
    } elseif ($type === 'bonuses') {
        if (!is_array($data)) {
            throw new InvalidArgumentException('Geçersiz bonus verisi');
        }
        $clean = [];
        $seen = [];
        foreach ($data as $row) {
            if (!is_array($row)) {
                continue;
            }
            $id = isset($row['id']) ? trim((string) $row['id']) : '';
            $sponsorId = isset($row['sponsorId']) ? trim((string) $row['sponsorId']) : '';
            $sponsorTitle = isset($row['sponsorTitle']) ? trim((string) $row['sponsorTitle']) : '';
            $title = isset($row['title']) ? trim((string) $row['title']) : '';
            if ($id === '' || $title === '' || ($sponsorId === '' && $sponsorTitle === '')) {
                continue;
            }
            if (isset($seen[$id])) {
                throw new InvalidArgumentException('Yinelenen kayıt id: ' . $id);
            }
            $seen[$id] = true;
            if (strlen($title) > 200) {
                throw new InvalidArgumentException('Bonus başlığı en fazla 200 karakter (id: ' . $id . ')');
            }
            $promoCode = isset($row['promoCode']) ? trim((string) $row['promoCode']) : '';
            if (strlen($promoCode) > 128) {
                throw new InvalidArgumentException('Promo kod en fazla 128 karakter (id: ' . $id . ')');
            }
            $expiresAt = null;
            if (isset($row['expiresAt']) && $row['expiresAt'] !== null && $row['expiresAt'] !== '') {
                $expiresAt = (int) $row['expiresAt'];
                if ($expiresAt < 0) {
                    $expiresAt = null;
                }
            }
            $linkUrl = isset($row['url']) ? trim((string) $row['url']) : '';
            if ($linkUrl !== '' && !preg_match('#^https?://#i', $linkUrl)) {
                throw new InvalidArgumentException('Link http(s) ile başlamalı (id: ' . $id . ')');
            }
            $isActive = !isset($row['isActive']) || $row['isActive'] !== false;
            $createdAt = isset($row['createdAt']) ? (int) $row['createdAt'] : time();
            if ($createdAt < 1) {
                $createdAt = time();
            }
            $clean[] = [
                'id' => $id,
                'sponsorId' => $sponsorId,
                'sponsorTitle' => $sponsorTitle,
                'title' => $title,
                'badge' => isset($row['badge']) ? trim((string) $row['badge']) : '',
                'description' => isset($row['description']) ? trim((string) $row['description']) : '',
                'promoCode' => $promoCode,
                'expiresAt' => $expiresAt,
                'url' => $linkUrl,
                'isActive' => $isActive,
                'createdAt' => $createdAt,
            ];
        }
        $writeJson($dataDir . 'bonuses.json', $clean);
    }
} catch (Throwable $e) {
    http_response_code(500);
    echo json_encode(['ok' => false, 'error' => $e->getMessage()]);
    exit;
}

echo json_encode(['ok' => true], JSON_UNESCAPED_UNICODE);
