<?php
function ugfx_read_json(string $path, $default = []) {
    if (!file_exists($path)) return $default;
    $data = json_decode(file_get_contents($path), true);
    return is_array($data) ? $data : $default;
}

function ugfx_write_json(string $path, $data): bool {
    $dir = dirname($path);
    if (!is_dir($dir)) mkdir($dir, 0775, true);
    return (bool) file_put_contents($path, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
}

function ugfx_asset(string $path): string {
    return 'assets/' . ltrim($path, '/');
}

function ugfx_vendor_asset(string $localPath, string $cdnUrl, string $prefix = ''): string {
    $normalized = ltrim($localPath, '/');
    $absolute = dirname(__DIR__) . '/' . $normalized;
    if (file_exists($absolute)) {
        return $prefix . $normalized;
    }
    return $cdnUrl;
}

function ugfx_is_active(string $page, string $current): string {
    return $page === $current ? 'active' : '';
}

function ugfx_slugify(string $text): string {
    $text = strtolower(trim($text));
    $text = preg_replace('/[^a-z0-9]+/', '-', $text);
    return trim($text ?? '', '-') ?: 'page';
}

function ugfx_strlen(string $text): int {
    return function_exists('mb_strlen') ? mb_strlen($text) : strlen($text);
}

function ugfx_substr(string $text, int $start, ?int $length = null): string {
    if (function_exists('mb_substr')) {
        return $length === null ? mb_substr($text, $start) : mb_substr($text, $start, $length);
    }
    return $length === null ? substr($text, $start) : substr($text, $start, $length);
}

function ugfx_excerpt(string $text, int $length = 180): string {
    $text = trim(strip_tags($text));
    return ugfx_strlen($text) > $length ? ugfx_substr($text, 0, $length - 1) . '…' : $text;
}

function ugfx_sort_items_by_date_desc(array $items): array {
    usort($items, function ($a, $b) {
        return strtotime((string)($b['start'] ?? $b['date'] ?? '')) <=> strtotime((string)($a['start'] ?? $a['date'] ?? ''));
    });
    return $items;
}

function ugfx_get_news(int $limit = 6): array {
    global $ugfx;
    $items = ugfx_read_json($ugfx['storage']['news'], []);
    $items = array_values(array_filter($items, function ($item) { return ($item['published'] ?? 0) == 1; }));
    return array_slice($items, 0, $limit);
}

function ugfx_get_events(int $limit = 4): array {
    global $ugfx;
    $items = ugfx_read_json($ugfx['storage']['events'], []);
    $items = array_values(array_filter($items, function ($item) { return ($item['published'] ?? 0) == 1; }));
    $items = ugfx_sort_items_by_date_desc($items);
    return array_slice($items, 0, $limit);
}

function ugfx_get_djs(int $limit = 8): array {
    global $ugfx;
    return array_slice(ugfx_read_json($ugfx['storage']['djs'], []), 0, $limit);
}

function ugfx_get_top50(int $limit = 10): array {
    global $ugfx;
    $items = ugfx_read_json($ugfx['storage']['top50'], []);
    uasort($items, function ($a, $b) { return ($b['count'] ?? 0) <=> ($a['count'] ?? 0); });
    return array_slice($items, 0, $limit, true);
}

function ugfx_get_schedule(): array {
    global $ugfx;
    return ugfx_read_json($ugfx['storage']['schedule'], []);
}

function ugfx_get_friends(int $limit = 12): array {
    global $ugfx;
    return array_slice(ugfx_read_json($ugfx['storage']['friends'], []), 0, $limit);
}

function ugfx_get_pages(bool $publishedOnly = true): array {
    global $ugfx;
    $items = ugfx_read_json($ugfx['storage']['pages'], []);
    if ($publishedOnly) {
        $items = array_values(array_filter($items, function ($item) { return ($item['published'] ?? 0) == 1; }));
    }
    return $items;
}

function ugfx_get_page_by_slug(string $slug): ?array {
    foreach (ugfx_get_pages(false) as $page) {
        if (($page['slug'] ?? '') === $slug) {
            return $page;
        }
    }
    return null;
}

function ugfx_day_name(?int $timestamp = null): string {
    return date('l', $timestamp ?? time());
}

function ugfx_current_show(): array {
    $schedule = ugfx_get_schedule();
    $day = ugfx_day_name();
    $hour = (int) date('G');
    $current = $schedule[$day][$hour] ?? 'Underground FX Live';
    $next = $schedule[$day][($hour + 1) % 24] ?? 'Underground FX Live';
    return ['day' => $day, 'hour' => $hour, 'current' => $current, 'next' => $next];
}


function ugfx_stream_status(): array {
    require_once __DIR__ . '/stream_lib.php';

    static $cached = null;
    if ($cached !== null) {
        return $cached;
    }

    $fresh = ugfx_read_stream_cache();
    if (is_array($fresh) && array_key_exists('server_listeners', $fresh)) {
        return $cached = $fresh;
    }

    $status = ugfx_build_status_from_streams();
    if (is_array($status) && array_key_exists('server_listeners', $status)) {
        ugfx_write_stream_cache($status);
        return $cached = $status;
    }

    $stale = ugfx_read_stale_stream_cache();
    if (is_array($stale) && array_key_exists('server_listeners', $stale)) {
        return $cached = $stale;
    }

    return $cached = [
        'server_listeners' => 0,
        'current_listeners' => 0,
        'title' => 'Underground FX Live',
        'artist' => 'AutoDJ',
        'mount' => '/autodj',
        'stream_url' => '/stream-proxy.php',
        'public_stream_url' => 'http://radio.undergroundfxradio.com:9000/stream',
        'direct_stream_url' => 'http://radio.undergroundfxradio.com:9000/stream',
        'status' => 'LIVE'
    ];
}

function ugfx_icecast_status(): array {
    return ugfx_stream_status();
}

function ugfx_now_playing(): array {
    $show = ugfx_current_show();
    $icecast = ugfx_stream_status();
    return [
        'title' => $icecast['title'] ?: 'Underground FX Live',
        'artist' => $icecast['artist'] ?: $show['current'],
        'album' => 'Underground FX Radio',
        'art' => ugfx_asset('img/brand/ugfx-hero.png'),
        'listeners' => (int)($icecast['server_listeners'] ?? 0),
        'current_listeners' => (int)($icecast['current_listeners'] ?? 0),
        'status' => $icecast['status'] ?? 'LIVE',
        'mount' => $icecast['mount'] ?? '/autodj',
        'stream_url' => $icecast['stream_url'] ?? '/stream-proxy.php',
        'public_stream_url' => $icecast['public_stream_url'] ?? 'http://radio.undergroundfxradio.com:9000/stream',
        'direct_stream_url' => $icecast['direct_stream_url'] ?? 'http://radio.undergroundfxradio.com:9000/stream'
    ];
}

function ugfx_nav_items(): array {
    return [
        ['label' => 'Home', 'href' => 'index.php'],
        ['label' => 'Listen Live', 'href' => 'listen-live.php'],
        ['label' => 'Schedule', 'href' => 'schedule.php'],
        ['label' => 'Requests', 'href' => 'requests.php'],
        ['label' => 'News', 'href' => 'news.php'],
        ['label' => 'Events', 'href' => 'events.php'],
        ['label' => 'Team', 'href' => 'team.php'],
        ['label' => 'Join', 'href' => 'join.php'],
        ['label' => 'Friends', 'href' => 'friends.php'],
        ['label' => 'Chat', 'href' => 'chat.php'],
        ['label' => 'Contact', 'href' => 'contact.php'],
    ];
}

function ugfx_safe_links(string $text): string {
    $escaped = nl2br(htmlspecialchars($text, ENT_QUOTES, 'UTF-8'));
    return preg_replace_callback('/(https?:\/\/[^\s<]+)/i', function ($matches) {
        $url = htmlspecialchars($matches[1], ENT_QUOTES, 'UTF-8');
        return '<a href="' . $url . '" target="_blank" rel="noopener noreferrer nofollow">' . $url . '</a>';
    }, $escaped);
}

function ugfx_chat_messages(): array {
    global $ugfx;
    return ugfx_read_json($ugfx['storage']['chat'], []);
}

function ugfx_chat_add(array $message): bool {
    global $ugfx;
    $messages = ugfx_chat_messages();
    $message['id'] = time() . rand(100,999);
    $messages[] = $message;
    return ugfx_write_json($ugfx['storage']['chat'], array_slice($messages, -200));
}

function ugfx_banned_words(): array {
    global $ugfx;
    return ugfx_read_json($ugfx['storage']['banned_words'], []);
}

function ugfx_contains_banned_word(string $message): bool {
    foreach (ugfx_banned_words() as $word) {
        if ($word !== '' && stripos($message, $word) !== false) return true;
    }
    return false;
}

function ugfx_require_admin(): void {
    if (empty($_SESSION['ugfx_admin'])) {
        header('Location: login.php');
        exit;
    }
}

function ugfx_admin_attempt(string $username, string $password): bool {
    global $ugfx;
    $users = ugfx_read_json($ugfx['storage']['users'], []);
    foreach ($users as $user) {
        if (($user['username'] ?? '') === $username && ($user['password'] ?? '') === $password) {
            $_SESSION['ugfx_admin'] = $user;
            return true;
        }
    }
    return false;
}
?>
