<?php
/*
desenvolvedor: luciano donizeti
mania de script: www.maniadescript.com.br
whatsapp 43998240911
*/

// Integração protegida do Gerador de Banners com o sistema Futebol API.

if (!function_exists('array_is_list')) {
    function array_is_list(array $array): bool {
        $i = 0;
        foreach ($array as $k => $_) {
            if ($k !== $i++) { return false; }
        }
        return true;
    }
}
// Credenciais internas protegidas: não ficam gravadas em texto puro no pacote.
// Observação: em PHP instalado no servidor do cliente, isso dificulta cópia casual,
// mas a proteção total depende de validação/licenciamento no servidor da API.
function sistemaApiProtectedValue(string $name): string {
    $vault = [
        // Base64 informada pelo cliente. Ao decodificar, ela contém o endpoint completo.
        'base64' => [73, [40, 18, 57, 76, 238, 214, 226, 246, 157, 155, 202, 126, 116, 126, 121, 120, 3, 61, 75, 249, 196, 156, 237, 165, 130, 181, 69, 100, 71, 91, 17, 43, 37, 20, 197, 245, 206, 199, 246, 212, 189, 48, 85, 83, 84, 21, 110, 2, 27, 205, 247, 192, 223, 160, 142, 134, 79, 104, 113, 95, 11, 60, 15, 16, 196, 247, 229, 214, 131, 236, 170, 50, 75, 72, 97, 41, 12, 12, 54, 187, 214, 253, 253, 165, 132, 132, 166, 105, 110, 117, 26, 103, 60, 28, 236, 168, 243, 254, 167, 182, 160, 148, 86, 19, 126, 21, 30, 80, 56, 209, 194, 209, 244, 142, 158, 148, 176, 89, 86, 72, 13, 96, 19, 2, 223, 164, 158, 194, 153, 232, 185, 148, 104, 74, 30, 47, 51, 80, 3, 232]],
        'key'    => [191, [136, 228, 133, 196, 59, 117, 23, 85, 36, 111, 8, 76, 237, 168, 203, 220, 255, 215, 200, 99, 113, 70, 3, 116, 111, 14, 78, 232, 162, 152, 217, 247, 188, 194, 55, 37, 26, 87, 125, 103, 2, 74, 185, 171, 154, 141, 175, 239]],
    ];
    if (!isset($vault[$name])) { return ''; }
    [$seed, $payload] = $vault[$name];
    $out = '';
    foreach ($payload as $i => $byte) {
        $out .= chr($byte ^ (($seed + $i * 17) & 0xff));
    }
    return $out;
}

function sistemaApiProtectedBase64Url(): string {
    return sistemaApiProtectedValue('base64');
}

function sistemaApiProtectedBaseUrl(): string {
    $decoded = sistemaApiDecodeBase64Url(sistemaApiProtectedBase64Url());
    $parts = sistemaApiEndpointParts($decoded);
    return (string)($parts['base_url'] ?? '');
}

function sistemaApiProtectedToken(): string {
    return sistemaApiProtectedValue('key');
}

function sistemaApiConfigDir(): string {
    $dir = __DIR__ . '/api/sistema_futebol';
    if (!is_dir($dir)) { @mkdir($dir, 0755, true); }
    return $dir;
}

function sistemaApiConfigPath(): string {
    // Configuração única do admin: todos os revendedores usam esta mesma API.
    return sistemaApiConfigDir() . '/config_admin.json';
}

function sistemaApiCacheDir(): string {
    $dir = sistemaApiConfigDir() . '/cache_jogos';
    if (!is_dir($dir)) { @mkdir($dir, 0755, true); }
    $index = $dir . '/index.php';
    if (!is_file($index)) { @file_put_contents($index, '<?php http_response_code(403); exit; ?>'); }
    return $dir;
}

function sistemaApiCacheKey(array $config, ?string $day = null): string {
    $normalized = sistemaApiNormalizeConfig($config);
    $base = rtrim((string)($normalized['base_url'] ?? ''), '/');
    $token = trim((string)($normalized['token'] ?? ''));
    $day = sistemaApiNormalizeDay($day ?: (string)($normalized['day'] ?? 'hoje'));
    return substr(hash('sha256', $base . '|' . $token . '|' . $day), 0, 16);
}

function sistemaApiCachePath(array $config, ?string $day = null): string {
    $day = sistemaApiNormalizeDay($day ?: (string)($config['day'] ?? 'hoje'));
    $date = date('Y-m-d');
    return sistemaApiCacheDir() . '/jogos_' . $date . '_' . $day . '_' . sistemaApiCacheKey($config, $day) . '.json';
}

function sistemaApiReadDailyCache(array $config, ?string $day = null): ?array {
    $file = sistemaApiCachePath($config, $day);
    if (!is_file($file)) { return null; }
    $raw = @file_get_contents($file);
    if ($raw === false || $raw === '') { return null; }
    $data = json_decode((string)$raw, true);
    if (!is_array($data) || !isset($data['payload']) || !is_array($data['payload'])) { return null; }
    if (($data['cache_date'] ?? '') !== date('Y-m-d')) { return null; }
    $GLOBALS['sistema_api_cache_status'] = 'hit';
    $GLOBALS['sistema_api_cache_file'] = $file;
    $GLOBALS['sistema_api_cache_fetched_at'] = (string)($data['fetched_at'] ?? '');
    return $data['payload'];
}

function sistemaApiWriteDailyCache(array $config, ?string $day, array $payload, string $url): bool {
    if (isset($payload['ok']) && $payload['ok'] === false) { return false; }
    $file = sistemaApiCachePath($config, $day);
    $wrapper = [
        'cache_date' => date('Y-m-d'),
        'day' => sistemaApiNormalizeDay($day ?: (string)($config['day'] ?? 'hoje')),
        'fetched_at' => date(DATE_ATOM),
        'url_hash' => sistemaApiCacheKey($config, $day),
        'protected_endpoint' => true,
        'payload' => $payload,
    ];
    $json = json_encode($wrapper, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    if ($json === false) { return false; }
    $tmp = $file . '.tmp';
    $ok = (bool)@file_put_contents($tmp, $json, LOCK_EX);
    if (!$ok) { return false; }
    @rename($tmp, $file);
    @chmod($file, 0644);
    $GLOBALS['sistema_api_cache_status'] = 'miss_saved';
    $GLOBALS['sistema_api_cache_file'] = $file;
    $GLOBALS['sistema_api_cache_fetched_at'] = (string)$wrapper['fetched_at'];
    return true;
}

function sistemaApiClearDailyCache(): int {
    $dir = sistemaApiCacheDir();
    $count = 0;
    foreach (glob($dir . '/jogos_*.json') ?: [] as $file) {
        if (is_file($file) && @unlink($file)) { $count++; }
    }
    return $count;
}

function sistemaApiLegacyConfigPaths(): array {
    // Compatibilidade com versões anteriores que salvavam por usuário.
    return [
        sistemaApiConfigDir() . '/config_1.json',
        sistemaApiConfigDir() . '/config_global.json',
    ];
}

function sistemaCurrentUserIdForAssets(): string {
    $uid = isset($_SESSION['user_id']) ? preg_replace('/[^0-9A-Za-z_-]/', '', (string)$_SESSION['user_id']) : '';
    return $uid ?: '';
}

function sistemaAssetFetchContent(string $pathOrUrl) {
    $pathOrUrl = trim($pathOrUrl);
    if ($pathOrUrl === '') { return false; }

    if (preg_match('#^https?://#i', $pathOrUrl)) {
        if (function_exists('curl_init')) {
            $ch = curl_init($pathOrUrl);
            curl_setopt_array($ch, [
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_CONNECTTIMEOUT => 8,
                CURLOPT_TIMEOUT => 25,
                CURLOPT_USERAGENT => 'Mozilla/5.0',
            ]);
            $content = curl_exec($ch);
            $http = (int)curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
            curl_close($ch);
            return ($content !== false && $http < 400) ? $content : false;
        }
        $content = @file_get_contents($pathOrUrl);
        return $content === false ? false : $content;
    }

    $clean = ltrim(str_replace('..', '', $pathOrUrl), '/');
    $candidates = [
        __DIR__ . '/' . $clean,
        dirname(__DIR__) . '/' . $clean,
        $pathOrUrl,
    ];
    foreach ($candidates as $candidate) {
        if (is_file($candidate)) {
            return @file_get_contents($candidate);
        }
    }
    return false;
}

function sistemaAssetJsonPaths(string $jsonPath): array {
    $jsonPath = ltrim($jsonPath, '/');
    $baseName = basename($jsonPath);
    $paths = [];
    $uid = sistemaCurrentUserIdForAssets();
    if ($uid !== '') {
        $paths[] = __DIR__ . '/api/fzstore/user_' . $uid . '/' . $baseName;
    }
    // Fallback global do admin/default. Nunca é sobrescrito por revendedores.
    $paths[] = __DIR__ . '/' . $jsonPath;
    $paths[] = dirname(__DIR__) . '/' . $jsonPath;
    return array_values(array_unique($paths));
}

function sistemaAssetImageFromJson(string $jsonPath) {
    foreach (sistemaAssetJsonPaths($jsonPath) as $candidateJson) {
        if (!is_file($candidateJson)) { continue; }
        $data = json_decode((string)@file_get_contents($candidateJson), true);
        if (!is_array($data) || empty($data[0]['ImageName'])) { continue; }
        $content = sistemaAssetFetchContent((string)$data[0]['ImageName']);
        if ($content !== false && $content !== '') { return $content; }
    }
    return false;
}


function sistemaApiDecodeBase64Url(string $encoded): string {
    $encoded = trim($encoded);
    if ($encoded === '') { return ''; }
    $encoded = preg_replace('/\s+/', '', $encoded);
    $normalized = strtr($encoded, '-_', '+/');
    $padding = strlen($normalized) % 4;
    if ($padding > 0) { $normalized .= str_repeat('=', 4 - $padding); }
    $decoded = base64_decode($normalized, true);
    if ($decoded === false) { return ''; }
    $decoded = trim($decoded);
    return filter_var($decoded, FILTER_VALIDATE_URL) ? $decoded : '';
}

function sistemaApiEndpointParts(string $url): array {
    $url = trim($url);
    if ($url === '') { return ['base_url' => '', 'token' => '', 'endpoint_url' => '']; }

    if (preg_match('~^(https?://.+?)/api/client/([^/]+)/jogos(?:\?[^#]*)?~i', $url, $m)) {
        return [
            'base_url' => rtrim($m[1], '/'),
            'token' => rawurldecode($m[2]),
            'endpoint_url' => $url,
        ];
    }

    return [
        'base_url' => rtrim($url, '/'),
        'token' => '',
        'endpoint_url' => '',
    ];
}

function sistemaApiNormalizeConfig(array $config): array {
    $baseUrl64 = trim((string)($config['base_url_64'] ?? $config['base64_url'] ?? $config['url64'] ?? ''));
    $manualBaseUrl = trim((string)($config['base_url'] ?? ''));
    $token = trim((string)($config['token'] ?? ''));
    $decodedUrl = sistemaApiDecodeBase64Url($baseUrl64);
    $endpointUrl = trim((string)($config['endpoint_url'] ?? ''));
    $baseUrl = $manualBaseUrl;

    if ($decodedUrl !== '') {
        $parts = sistemaApiEndpointParts($decodedUrl);
        $baseUrl = $parts['base_url'] ?: $baseUrl;
        $endpointUrl = $parts['endpoint_url'] ?: $endpointUrl;
        if ($token === '' && $parts['token'] !== '') { $token = $parts['token']; }
    }

    if ($baseUrl !== '') {
        $parts = sistemaApiEndpointParts($baseUrl);
        $baseUrl = $parts['base_url'] ?: $baseUrl;
        if ($endpointUrl === '' && $parts['endpoint_url'] !== '') { $endpointUrl = $parts['endpoint_url']; }
        if ($token === '' && $parts['token'] !== '') { $token = $parts['token']; }
    }

    if ($endpointUrl !== '') {
        $parts = sistemaApiEndpointParts($endpointUrl);
        $baseUrl = $parts['base_url'] ?: $baseUrl;
        if ($token === '' && $parts['token'] !== '') { $token = $parts['token']; }
    }

    $config['base_url_64'] = $baseUrl64;
    $config['decoded_url'] = $decodedUrl;
    $config['endpoint_url'] = $endpointUrl;
    $config['base_url'] = rtrim($baseUrl, '/');
    $config['token'] = $token;
    $config['day'] = sistemaApiNormalizeDay((string)($config['day'] ?? 'hoje'));
    $config['mostrar_resultados'] = !empty($config['mostrar_resultados']);
    return $config;
}

function sistemaApiLoadConfig(): array {
    // Configuração fixa embutida no código: admin e revendedores usam sempre a mesma API.
    // O menu de configuração foi removido para impedir alteração pelo painel.
    $defaults = [
        'base_url_64' => sistemaApiProtectedBase64Url(),
        'base_url' => sistemaApiProtectedBaseUrl(),
        'endpoint_url' => '',
        'decoded_url' => '',
        'token' => sistemaApiProtectedToken(),
        'day' => 'hoje',
        'mostrar_resultados' => false,
    ];

    // Mantém apenas a escolha do dia quando algum gerador pedir hoje/amanhã/ao vivo.
    if (!empty($_GET['day'])) { $defaults['day'] = (string)$_GET['day']; }

    return sistemaApiNormalizeConfig($defaults);
}

function sistemaApiSaveConfig(array $config): bool {
    // A API agora é fixa no código. Esta função permanece apenas por compatibilidade
    // com arquivos antigos, mas não altera URL/token.
    $fixed = sistemaApiLoadConfig();
    $data = [
        'source' => 'internal_protected',
        'day' => sistemaApiNormalizeDay((string)($fixed['day'] ?? 'hoje')),
        'mostrar_resultados' => false,
        'updated_at' => date(DATE_ATOM),
        'locked_in_code' => true,
    ];
    $json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    if ($json === false) { return false; }
    @file_put_contents(sistemaApiConfigPath(), $json);
    @file_put_contents(sistemaApiConfigDir() . '/config_1.json', $json);
    return true;
}

function sistemaApiNormalizeDay(string $day): string {
    $day = strtolower(trim($day));
    $day = str_replace('ã', 'a', $day);
    if (in_array($day, ['ontem','hoje','amanha','aovivo'], true)) { return $day; }
    if (in_array($day, ['amanhã','tomorrow'], true)) { return 'amanha'; }
    if (in_array($day, ['ao_vivo','ao vivo','live','agora'], true)) { return 'aovivo'; }
    return 'hoje';
}

function sistemaApiBuildUrl(array $config, ?string $day = null): string {
    $config = sistemaApiNormalizeConfig($config);
    $base = rtrim(trim((string)($config['base_url'] ?? '')), '/');
    $token = trim((string)($config['token'] ?? ''));
    $day = sistemaApiNormalizeDay($day ?: (string)($config['day'] ?? 'hoje'));
    if ($base === '' || $token === '') { return ''; }
    return $base . '/api/client/' . rawurlencode($token) . '/jogos?day=' . rawurlencode($day);
}

function sistemaApiFetchJson(string $url): array {
    if ($url === '') { return ['ok'=>false, 'error'=>'A API interna fixa não retornou URL/token. Verifique o código em sistema_api_helper.php.']; }
    $body = false; $http = 0; $err = '';
    if (function_exists('curl_init')) {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_CONNECTTIMEOUT => 8,
            CURLOPT_TIMEOUT => 25,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_USERAGENT => 'FutBanner-Token-Client/1.0',
            CURLOPT_HTTPHEADER => ['Accept: application/json'],
        ]);
        $body = curl_exec($ch);
        $http = (int)curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
        $err = curl_error($ch);
        curl_close($ch);
    } else {
        $ctx = stream_context_create(['http'=>['timeout'=>25, 'header'=>"User-Agent: FutBanner-Token-Client/1.0\r\nAccept: application/json\r\n"]]);
        $body = @file_get_contents($url, false, $ctx);
        $http = 200;
    }
    if ($body === false || $body === '') { return ['ok'=>false, 'error'=>'Falha ao consultar API do sistema. ' . $err, 'http'=>$http]; }
    $json = json_decode((string)$body, true);
    if (!is_array($json)) { return ['ok'=>false, 'error'=>'Resposta inválida da API do sistema.', 'raw'=>substr((string)$body,0,500), 'http'=>$http]; }
    if (isset($json['ok']) && $json['ok'] === false) { return $json; }
    return $json;
}

function sistemaApiFetchJsonDailyCached(string $url, array $config, ?string $day = null): array {
    if ($url === '') { return ['ok'=>false, 'error'=>'A API interna fixa não retornou URL/token. Verifique o código em sistema_api_helper.php.']; }

    // O gerador de banners usa cache diário: a primeira chamada do dia consulta a API,
    // as próximas chamadas do mesmo dia leem o arquivo local e não consultam o servidor principal.
    $cached = sistemaApiReadDailyCache($config, $day);
    if (is_array($cached)) { return $cached; }

    $payload = sistemaApiFetchJson($url);
    if (is_array($payload) && !(isset($payload['ok']) && $payload['ok'] === false) && !isset($payload['error'])) {
        sistemaApiWriteDailyCache($config, $day, $payload, $url);
    } else {
        $GLOBALS['sistema_api_cache_status'] = 'miss_error';
    }
    return $payload;
}

function sistemaApiAbsUrl(string $url, string $base): string {
    $url = trim($url);
    if ($url === '') return '';
    if (preg_match('#^https?://#i', $url) || strpos($url, 'data:image/') === 0) return $url;
    return rtrim($base, '/') . '/' . ltrim($url, '/');
}

function sistemaApiChannelList($channels): array {
    $out = [];
    if (is_string($channels)) { $channels = preg_split('/[,;|]+/', $channels) ?: []; }
    if (!is_array($channels)) return [];
    foreach ($channels as $ch) {
        if (is_string($ch)) { $name = trim($ch); }
        elseif (is_array($ch)) { $name = trim((string)($ch['name'] ?? $ch['nome'] ?? $ch['canal'] ?? $ch['title'] ?? '')); }
        else { $name = ''; }
        if ($name !== '') $out[] = $name;
    }
    return array_values(array_unique($out));
}

function sistemaApiChannelLogos($channels, string $base): array {
    $out = [];
    if (!is_array($channels)) return [];
    foreach ($channels as $ch) {
        if (!is_array($ch)) continue;
        $url = (string)($ch['img_url'] ?? $ch['logo'] ?? $ch['logo_url'] ?? $ch['image'] ?? $ch['imagem'] ?? '');
        $url = sistemaApiAbsUrl($url, $base);
        if ($url !== '') $out[] = $url;
    }
    return array_values(array_unique($out));
}

function sistemaApiGetGames(?string $day = null): array {
    $config = sistemaApiLoadConfig();
    $base = rtrim((string)($config['base_url'] ?? ''), '/');
    $url = sistemaApiBuildUrl($config, $day);
    $payload = sistemaApiFetchJsonDailyCached($url, $config, $day);
    if (empty($payload['ok']) && isset($payload['error'])) {
        $GLOBALS['sistema_api_error'] = (string)$payload['error'];
        return [];
    }
    $rows = [];
    if (isset($payload['games']) && is_array($payload['games'])) $rows = $payload['games'];
    elseif (isset($payload['jogos']) && is_array($payload['jogos'])) $rows = $payload['jogos'];
    elseif (array_is_list($payload)) $rows = $payload;

    $games = [];
    foreach ($rows as $jogo) {
        if (!is_array($jogo)) continue;
        $homeTeam = is_array($jogo['home_team'] ?? null) ? $jogo['home_team'] : [];
        $awayTeam = is_array($jogo['away_team'] ?? null) ? $jogo['away_team'] : [];
        $score = is_array($jogo['score'] ?? null) ? $jogo['score'] : [];
        $rawChannels = $jogo['channels'] ?? $jogo['canais'] ?? [];
        $canais = sistemaApiChannelList($rawChannels);
        $logoCanais = sistemaApiChannelLogos($rawChannels, $base);
        $time1 = (string)($jogo['home'] ?? $jogo['time1'] ?? $jogo['mandante'] ?? $homeTeam['name'] ?? '');
        $time2 = (string)($jogo['away'] ?? $jogo['time2'] ?? $jogo['visitante'] ?? $awayTeam['name'] ?? '');
        $logo1 = (string)($jogo['home_logo'] ?? $jogo['logo1'] ?? $jogo['img_time1_url'] ?? $homeTeam['shield'] ?? $homeTeam['logo'] ?? '');
        $logo2 = (string)($jogo['away_logo'] ?? $jogo['logo2'] ?? $jogo['img_time2_url'] ?? $awayTeam['shield'] ?? $awayTeam['logo'] ?? '');
        $mostrarResultados = !empty($config['mostrar_resultados']);
        $placar1 = $mostrarResultados ? (string)($jogo['placar_time1'] ?? $jogo['score_home'] ?? $score['home'] ?? '') : '';
        $placar2 = $mostrarResultados ? (string)($jogo['placar_time2'] ?? $jogo['score_away'] ?? $score['away'] ?? '') : '';
        $statusJogo = $mostrarResultados ? (string)($jogo['status_label'] ?? $jogo['status'] ?? '') : '';
        $games[] = [
            'time1' => trim($time1),
            'time2' => trim($time2),
            'liga' => (string)($jogo['competition'] ?? $jogo['competicao'] ?? $jogo['liga'] ?? ''),
            'hora' => (string)($jogo['time'] ?? $jogo['horario'] ?? $jogo['hora'] ?? ''),
            'status' => $statusJogo,
            'logo1' => sistemaApiAbsUrl($logo1, $base),
            'logo2' => sistemaApiAbsUrl($logo2, $base),
            'competition_logo' => sistemaApiAbsUrl((string)($jogo['competition_logo'] ?? $jogo['img_competicao_url'] ?? ''), $base),
            'placar1' => $placar1,
            'placar2' => $placar2,
            'canais' => $canais,
            'logo_canais' => $logoCanais,
            'data_jogo' => (string)($jogo['day'] ?? $jogo['data_jogo'] ?? sistemaApiNormalizeDay($day ?: (string)($config['day'] ?? 'hoje'))),
        ];
    }
    $GLOBALS['sistema_api_last_url'] = $url;
    return $games;
}

function sistemaApiErrorImage(string $msg): void {
    header('Content-Type: image/png');
    $im = imagecreatetruecolor(1000, 180);
    $bg = imagecolorallocate($im, 255, 255, 255);
    $fg = imagecolorallocate($im, 20, 20, 20);
    imagefill($im, 0, 0, $bg);
    imagestring($im, 5, 20, 50, 'Nenhum jogo disponivel.', $fg);
    imagestring($im, 3, 20, 90, substr($msg, 0, 130), $fg);
    imagepng($im);
    imagedestroy($im);
    exit;
}
?>
