<?php
/**
 * functions.php
 * ডাটা fetching, ক্যাশিং এবং হেল্পার ফাংশনসমূহ
 */

require_once __DIR__ . '/config.php';

/**
 * API থেকে ম্যাচ লিস্ট আনে, disk cache সহ।
 * শেয়ার্ড হোস্টিং এ প্রতি রিকোয়েস্টে বাইরের API কল করলে
 * CloudLinux EntryProcess (EP) লিমিট শেষ হয়ে যেতে পারে হাই ট্রাফিকে,
 * তাই ছোট TTL সহ disk cache ব্যবহার করা হয়েছে।
 */
function fetchMatches($forceRefresh = false)
{
    // 1) ফ্রেশ ক্যাশ থাকলে সরাসরি সেটা রিটার্ন করো
    if (!$forceRefresh && file_exists(CACHE_FILE)) {
        $age = time() - filemtime(CACHE_FILE);
        if ($age < CACHE_TTL) {
            $cached = @file_get_contents(CACHE_FILE);
            $data = json_decode($cached, true);
            if (is_array($data)) {
                return $data;
            }
        }
    }

    // 2) upstream API কল করো
    $ch = curl_init(API_URL);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 8,
        CURLOPT_CONNECTTIMEOUT => 5,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_USERAGENT      => 'ePlayHD-Fetcher/1.0',
        CURLOPT_HTTPHEADER     => ['Accept: application/json'],
    ]);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlErr  = curl_error($ch);
    curl_close($ch);

    // 3) সমস্যা হলে পুরনো (stale) ক্যাশ থাকলে সেটাই সার্ভ করো, একদম খালি রাখার চেয়ে ভালো
    if ($response === false || $httpCode !== 200) {
        $stale = readStaleCache();
        if ($stale !== null) {
            $stale['_stale'] = true;
            return $stale;
        }
        return ['matches' => [], 'error' => $curlErr ?: ('HTTP ' . $httpCode), 'lastScraped' => null];
    }

    $data = json_decode($response, true);
    if (!is_array($data) || !isset($data['matches'])) {
        $stale = readStaleCache();
        if ($stale !== null) {
            $stale['_stale'] = true;
            return $stale;
        }
        return ['matches' => [], 'error' => 'Invalid JSON from upstream', 'lastScraped' => null];
    }

    // 4) নতুন ডাটা ক্যাশে সংরক্ষণ করো
    @file_put_contents(CACHE_FILE, $response, LOCK_EX);

    return $data;
}

function readStaleCache()
{
    if (file_exists(CACHE_FILE)) {
        $cached = @file_get_contents(CACHE_FILE);
        $data = json_decode($cached, true);
        if (is_array($data)) {
            return $data;
        }
    }
    return null;
}

/** ম্যাচ আইডি অথবা slug (team-vs-team) দিয়ে নির্দিষ্ট ম্যাচ খুঁজে বের করে */
function findMatch(array $matches, $matchId)
{
    $target = (string)$matchId;
    // 1) numeric/upstream id দিয়ে ম্যাচ
    foreach ($matches as $m) {
        if ((string)($m['id'] ?? '') === $target) {
            return $m;
        }
    }
    // 2) team-vs-team slug দিয়ে ম্যাচ (একই নাম হলে -1,-2,-3 …)
    $counts = [];
    foreach ($matches as $m) {
        $home = (string)($m['homeTeam'] ?? '');
        $away = (string)($m['awayTeam'] ?? '');
        $vs = trim($home && $away ? "$home vs $away" : (string)($m['title'] ?? ''));
        $base = slugifyServerName($vs);
        if ($base === '') $base = 'match';
        $n = ($counts[$base] ?? 0) + 1;
        $counts[$base] = $n;
        $slug = $n === 1 ? $base : ($base . '-' . $n);
        if ($slug === $target) return $m;
    }
    return null;
}

/** ম্যাচের ভিতর থেকে নির্দিষ্ট সার্ভার আইডি অথবা নাম-ভিত্তিক slug দিয়ে খুঁজে বের করে */
function findServer(?array $match, $serverId)
{
    if (!$match || empty($match['servers']) || !is_array($match['servers'])) {
        return null;
    }
    $target = (string)$serverId;
    // 1) পুরনো numeric id দিয়ে ম্যাচ
    foreach ($match['servers'] as $s) {
        if ((string)($s['id'] ?? '') === $target) {
            return $s;
        }
    }
    // 2) সার্ভারের নাম থেকে slug বানিয়ে ম্যাচ (একই নাম হলে -1,-2,-3 …)
    $counts = [];
    foreach ($match['servers'] as $s) {
        $base = slugifyServerName((string)($s['name'] ?? ''));
        if ($base === '') $base = 'server';
        $n = ($counts[$base] ?? 0) + 1;
        $counts[$base] = $n;
        $slug = $n === 1 ? $base : ($base . '-' . $n);
        if ($slug === $target) return $s;
    }
    return null;
}

function slugifyServerName(string $name): string
{
    $s = strtolower(trim($name));
    if (function_exists('iconv')) {
        $tr = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s);
        if ($tr !== false && $tr !== '') $s = $tr;
    }
    $s = preg_replace('~[^a-z0-9]+~', '-', $s);
    return trim($s, '-');
}

/** Match-এর canonical team-vs-team slug (match.php-এর মতো একই ordering/suffix লজিক) */
function computeMatchSlug(array $matches, array $target): string
{
    $targetId = (string)($target['id'] ?? '');
    $counts = [];
    foreach ($matches as $m) {
        $home = (string)($m['homeTeam'] ?? '');
        $away = (string)($m['awayTeam'] ?? '');
        $vs = trim($home && $away ? "$home vs $away" : (string)($m['title'] ?? ''));
        $base = slugifyServerName($vs);
        if ($base === '') $base = 'match';
        $n = ($counts[$base] ?? 0) + 1;
        $counts[$base] = $n;
        $slug = $n === 1 ? $base : ($base . '-' . $n);
        if ((string)($m['id'] ?? '') === $targetId) return $slug;
    }
    return '';
}

/** Server-এর canonical slug (একই match-এ same-name হলে -1,-2,…) */
function computeServerSlug(array $match, array $target): string
{
    if (empty($match['servers']) || !is_array($match['servers'])) return '';
    $targetId = (string)($target['id'] ?? '');
    $counts = [];
    foreach ($match['servers'] as $s) {
        $base = slugifyServerName((string)($s['name'] ?? ''));
        if ($base === '') $base = 'server';
        $n = ($counts[$base] ?? 0) + 1;
        $counts[$base] = $n;
        $slug = $n === 1 ? $base : ($base . '-' . $n);
        if ((string)($s['id'] ?? '') === $targetId) return $slug;
    }
    return '';
}


/** XSS সেফ আউটপুট */
function h($str)
{
    return htmlspecialchars((string)$str, ENT_QUOTES, 'UTF-8');
}

/** স্ট্যাটাস অনুযায়ী ব্যাজ কালার ক্লাস */
function statusBadgeClass($status)
{
    switch (strtoupper((string)$status)) {
        case 'LIVE':
            return 'badge-live';
        case 'UPCOMING':
            return 'badge-upcoming';
        case 'FINISH':
        case 'FINISHED':
            return 'badge-finish';
        default:
            return 'badge-default';
    }
}

/** স্ট্যাটাস প্রায়োরিটি (LIVE সবার আগে, তারপর UPCOMING, তারপর FINISH) */
function statusSortWeight($status)
{
    switch (strtoupper((string)$status)) {
        case 'LIVE':
            return 0;
        case 'UPCOMING':
            return 1;
        default:
            return 2;
    }
}
