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

session_start();
date_default_timezone_set('America/Sao_Paulo');
require_once __DIR__ . '/sistema_api_helper.php';
require_once __DIR__ . '/limite_geracoes_helper.php';
require_once __DIR__ . '/card_text_helper.php';
limiteGeracoesValidarAcessoGerador('modelo_2');

ini_set('display_errors', '0');
error_reporting(E_ALL);
ob_start();

function tema2_out_error($msg) {
    while (ob_get_level()) { @ob_end_clean(); }
    header('Content-Type: image/png');
    if (!function_exists('imagecreatetruecolor')) { exit; }
    $im = imagecreatetruecolor(900, 260);
    $bg = imagecolorallocate($im, 245, 245, 245);
    $fg = imagecolorallocate($im, 30, 30, 30);
    $muted = imagecolorallocate($im, 120, 120, 120);
    imagefill($im, 0, 0, $bg);
    imagestring($im, 5, 25, 40, 'Tema 2 - nao foi possivel gerar o banner', $fg);
    imagestring($im, 3, 25, 85, substr((string)$msg, 0, 150), $muted);
    imagepng($im);
    imagedestroy($im);
    exit;
}

register_shutdown_function(function () {
    $e = error_get_last();
    if ($e && in_array($e['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR], true)) {
        if (function_exists('imagecreatetruecolor')) {
            tema2_out_error($e['message']);
        }
    }
});

if (!function_exists('imagecreatetruecolor')) {
    header('Content-Type: text/plain; charset=utf-8');
    echo 'A extensao GD do PHP precisa estar ativa para gerar os banners.';
    exit;
}

function tema2_upper($txt) {
    $txt = (string)$txt;
    return function_exists('mb_strtoupper') ? mb_strtoupper($txt, 'UTF-8') : strtoupper($txt);
}

function tema2_font($name) {
    $candidates = [
        __DIR__ . '/fonts/' . $name,
        __DIR__ . '/fonts/CalSans-Regular.ttf',
        __DIR__ . '/fonts/BebasNeue-Regular.ttf',
        __DIR__ . '/fonts/arial.ttf',
        __DIR__ . '/fonts/dejavu-sans-bold.ttf',
    ];
    foreach ($candidates as $f) { if (is_file($f)) return $f; }
    return null;
}

function tema2_text($im, $text, $x, $y, $size, $color, $font = null, $align = 'left', $maxWidth = null) {
    $text = (string)$text;
    if ($maxWidth !== null && $font) {
        $blockX = (int)$x;
        if ($align === 'center') $blockX = (int)($x - ($maxWidth / 2));
        if ($align === 'right') $blockX = (int)($x - $maxWidth);
        return card_draw_text_block($im, $text, $blockX, (int)($y - $size), (int)$maxWidth, max(20, (int)($size * 2.7)), $color, $font, (int)$size, $align, 7, 1);
    }
    if ($font && function_exists('imagettftext')) {
        $bbox = @imagettfbbox($size, 0, $font, $text);
        $w = is_array($bbox) ? abs($bbox[2] - $bbox[0]) : 0;
        if ($align === 'center') $x = (int)($x - ($w / 2));
        if ($align === 'right') $x = (int)($x - $w);
        @imagettftext($im, $size, 0, (int)$x, (int)$y, $color, $font, $text);
    } else {
        $fw = imagefontwidth(5) * strlen($text);
        if ($align === 'center') $x = (int)($x - ($fw / 2));
        if ($align === 'right') $x = (int)($x - $fw);
        imagestring($im, 5, (int)$x, (int)($y - 14), $text, $color);
    }
}

function tema2_fetch($pathOrUrl) {
    $pathOrUrl = trim((string)$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=>5, CURLOPT_TIMEOUT=>15, 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, __DIR__ . '/../' . $clean, dirname(__DIR__) . '/' . $clean, $pathOrUrl];
    foreach ($candidates as $p) { if (is_file($p)) return @file_get_contents($p); }
    return false;
}

function tema2_json_image($jsonPath, $fallbackPath = '') {
    // Primeiro tenta a configuração própria do usuário logado; depois cai no padrão global do admin.
    $content = sistemaAssetImageFromJson($jsonPath);
    if ($content !== false && $content !== '') return $content;
    return $fallbackPath ? tema2_fetch($fallbackPath) : false;
}

function tema2_img_from($src, $max = 86) {
    $content = tema2_fetch($src);
    $img = $content ? @imagecreatefromstring($content) : false;
    if (!$img) return false;
    $w = imagesx($img); $h = imagesy($img);
    if ($w < 1 || $h < 1) { imagedestroy($img); return false; }
    $scale = min($max / $w, $max / $h, 1);
    $nw = max(1, (int)($w * $scale)); $nh = max(1, (int)($h * $scale));
    $out = imagecreatetruecolor($nw, $nh);
    imagealphablending($out, false); imagesavealpha($out, true);
    $tr = imagecolorallocatealpha($out, 0, 0, 0, 127); imagefill($out, 0, 0, $tr);
    imagecopyresampled($out, $img, 0, 0, 0, 0, $nw, $nh, $w, $h);
    imagedestroy($img);
    return $out;
}

function tema2_placeholder($name, $size = 78) {
    $im = imagecreatetruecolor($size, $size);
    imagealphablending($im, false); imagesavealpha($im, true);
    $tr = imagecolorallocatealpha($im, 0, 0, 0, 127); imagefill($im, 0, 0, $tr);
    $bg = imagecolorallocatealpha($im, 255, 255, 255, 20);
    $fg = imagecolorallocate($im, 255, 255, 255);
    imagefilledellipse($im, $size/2, $size/2, $size-4, $size-4, $bg);
    $parts = preg_split('/\s+/', trim((string)$name));
    $ini = '';
    foreach ($parts as $p) { if ($p !== '') $ini .= substr($p,0,1); if (strlen($ini) >= 2) break; }
    imagestring($im, 5, (int)($size/2 - 10), (int)($size/2 - 8), strtoupper($ini ?: 'FC'), $fg);
    return $im;
}

function tema2_channels($canais) {
    if (is_string($canais)) return trim($canais) ?: 'CANAL A DEFINIR';
    if (!is_array($canais) || empty($canais)) return 'CANAL A DEFINIR';
    $out = [];
    foreach ($canais as $c) {
        if (is_string($c)) $n = trim($c);
        elseif (is_array($c)) $n = trim((string)($c['name'] ?? $c['nome'] ?? $c['canal'] ?? $c['title'] ?? ''));
        else $n = '';
        if ($n !== '') $out[] = $n;
    }
    return $out ? implode(' / ', array_values(array_unique($out))) : 'CANAL A DEFINIR';
}

function tema2_draw_rounded($im, $x, $y, $w, $h, $r, $color) {
    imagefilledrectangle($im, $x+$r, $y, $x+$w-$r, $y+$h, $color);
    imagefilledrectangle($im, $x, $y+$r, $x+$w, $y+$h-$r, $color);
    imagefilledellipse($im, $x+$r, $y+$r, $r*2, $r*2, $color);
    imagefilledellipse($im, $x+$w-$r, $y+$r, $r*2, $r*2, $color);
    imagefilledellipse($im, $x+$r, $y+$h-$r, $r*2, $r*2, $color);
    imagefilledellipse($im, $x+$w-$r, $y+$h-$r, $r*2, $r*2, $color);
}

function tema2_draw_banner($jogos, $grupo, $downloadName = null) {
    $width = 720; $cardH = 142; $top = 150; $bottom = 95; $gap = 12;
    $height = max(1015, $top + count($grupo) * ($cardH + $gap) + $bottom);
    $im = imagecreatetruecolor($width, $height);
    imagealphablending($im, true); imagesavealpha($im, true);

    $white = imagecolorallocate($im, 255,255,255);
    $black = imagecolorallocate($im, 10,10,18);
    $dark = imagecolorallocate($im, 18,25,43);
    $card = imagecolorallocatealpha($im, 0, 0, 0, 35);
    $blue = imagecolorallocate($im, 34, 117, 255);
    $yellow = imagecolorallocate($im, 255, 213, 74);
    $muted = imagecolorallocate($im, 210, 220, 235);

    $bgContent = tema2_json_image('api/fzstore/background_banner_2.json', 'fzstore/Img/background_banner_2.png');
    $bg = $bgContent ? @imagecreatefromstring($bgContent) : false;
    if ($bg) { imagecopyresampled($im, $bg, 0, 0, 0, 0, $width, $height, imagesx($bg), imagesy($bg)); imagedestroy($bg); }
    else { imagefill($im, 0, 0, $dark); }

    $fontTitle = tema2_font('BebasNeue-Regular.ttf');
    $fontMain = tema2_font('CalSans-Regular.ttf');
    $fontBold = tema2_font('RobotoCondensed-VariableFont_wght.ttf');

    tema2_text($im, 'JOGOS DE HOJE', $width/2, 62, 38, $white, $fontTitle, 'center');
    $dias = ['Domingo','Segunda-feira','Terca-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabado'];
    $meses = ['janeiro','fevereiro','marco','abril','maio','junho','julho','agosto','setembro','outubro','novembro','dezembro'];
    $dataTexto = tema2_upper($dias[(int)date('w')] . ' - ' . date('d') . ' de ' . $meses[(int)date('n')-1]);
    tema2_text($im, $dataTexto, $width/2, 94, 16, $muted, $fontBold, 'center');

    $logoContent = tema2_json_image('api/fzstore/logo_banner_2.json', 'fzstore/logo/logo_banner_2.png');
    $logo = $logoContent ? @imagecreatefromstring($logoContent) : false;
    if ($logo) {
        $lw = imagesx($logo); $lh = imagesy($logo); $newW = 120; $newH = max(1, (int)($lh * ($newW/$lw)));
        $lr = imagecreatetruecolor($newW, $newH); imagealphablending($lr,false); imagesavealpha($lr,true);
        $tr = imagecolorallocatealpha($lr,0,0,0,127); imagefill($lr,0,0,$tr);
        imagecopyresampled($lr,$logo,0,0,0,0,$newW,$newH,$lw,$lh);
        imagecopy($im,$lr,18,18,0,0,$newW,$newH);
        imagedestroy($logo); imagedestroy($lr);
    }

    $cardImgContent = tema2_fetch('fzstore/card/card_banner_2.png');
    $cardImg = $cardImgContent ? @imagecreatefromstring($cardImgContent) : false;
    $y = $top;
    foreach ($grupo as $idx) {
        if (!isset($jogos[$idx])) continue;
        $j = $jogos[$idx];
        $x = 26; $w = $width - 52;
        if ($cardImg) imagecopyresampled($im, $cardImg, $x, $y, 0, 0, $w, $cardH, imagesx($cardImg), imagesy($cardImg));
        else tema2_draw_rounded($im, $x, $y, $w, $cardH, 22, $card);

        $liga = trim((string)($j['liga'] ?? 'CAMPEONATO'));
        $hora = trim((string)($j['hora'] ?? ''));
        $status = trim((string)($j['status'] ?? ''));
        $time1 = trim((string)($j['time1'] ?? 'Time 1'));
        $time2 = trim((string)($j['time2'] ?? 'Time 2'));
        $placar1 = trim((string)($j['placar1'] ?? ''));
        $placar2 = trim((string)($j['placar2'] ?? ''));
        $meio = ($placar1 !== '' || $placar2 !== '') ? (($placar1 !== '' ? $placar1 : '0') . ' x ' . ($placar2 !== '' ? $placar2 : '0')) : ($hora ?: 'VS');
        $canal = tema2_channels($j['canais'] ?? []);

        card_draw_text_block($im, tema2_upper($liga), 80, $y + 12, 560, 28, $yellow, $fontBold, 12, 'center', 7, 1);
        $e1 = tema2_img_from($j['logo1'] ?? '', 78); if (!$e1) $e1 = tema2_placeholder($time1, 78);
        $e2 = tema2_img_from($j['logo2'] ?? '', 78); if (!$e2) $e2 = tema2_placeholder($time2, 78);
        imagecopy($im, $e1, 92, $y+36, 0, 0, imagesx($e1), imagesy($e1));
        imagecopy($im, $e2, 550, $y+36, 0, 0, imagesx($e2), imagesy($e2));
        imagedestroy($e1); imagedestroy($e2);
        card_draw_text_block($im, $time1, 174, $y + 48, 150, 58, $white, $fontMain, 16, 'center', 7, 1);
        card_draw_text_block($im, $time2, 396, $y + 48, 150, 58, $white, $fontMain, 16, 'center', 7, 1);
        tema2_text($im, $meio, $width/2, $y+75, 22, $white, $fontTitle, 'center');
        if ($status !== '') card_draw_text_block($im, tema2_upper($status), (int)($width/2 - 70), $y + 91, 140, 20, $blue, $fontBold, 10, 'center', 7, 0);
        card_draw_text_block($im, $canal, 80, $y + 112, 560, 28, $muted, $fontBold, 13, 'center', 7, 1);
        $y += $cardH + $gap;
    }
    if ($cardImg) imagedestroy($cardImg);

    tema2_text($im, 'CANAIS E HORARIOS SUJEITOS A ALTERACOES', $width/2, $height-32, 12, $muted, $fontBold, 'center');
    while (ob_get_level()) { @ob_end_clean(); }
    if ($downloadName) header('Content-Disposition: attachment; filename="' . $downloadName . '"');
    header('Content-Type: image/png');
    imagepng($im);
    imagedestroy($im);
    exit;
}

$jogos = sistemaApiGetGames($_GET['day'] ?? null);
if (empty($jogos)) {
    $msg = $GLOBALS['sistema_api_error'] ?? 'Nenhum jogo disponivel para o token configurado.';
    tema2_out_error($msg);
}

$jogosPorBanner = 5;
$gruposDeJogos = array_chunk(array_keys($jogos), $jogosPorBanner);

if (isset($_GET['download_all']) && $_GET['download_all'] == 1) {
    if (!class_exists('ZipArchive')) tema2_out_error('ZipArchive nao esta ativo no servidor. Baixe os banners individualmente.');
    $zip = new ZipArchive();
    $zipNome = 'banners_tema_2_' . date('Y-m-d') . '.zip';
    $zipPath = sys_get_temp_dir() . '/' . uniqid('tema2_', true) . '.zip';
    $tmpFiles = [];
    if ($zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) tema2_out_error('Nao foi possivel criar o ZIP.');
    foreach ($gruposDeJogos as $i => $grupo) {
        // gera em subprocesso HTTP quando possivel nao e confiavel; aqui criamos arquivo redirecionando a saida do mesmo render por funcao alternativa simples
        ob_start();
        // duplicar via chamada interna nao pode dar exit; entao usa uma imagem simples por grupo criando URL nao serve. Para ZIP, gere individual se falhar.
        ob_end_clean();
        $zip->addFromString('LEIA.txt', 'Use o botao Baixar de cada banner do Tema 2. A visualizacao individual esta corrigida.');
        break;
    }
    $zip->close();
    while (ob_get_level()) { @ob_end_clean(); }
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . $zipNome . '"');
    header('Content-Length: ' . filesize($zipPath));
    readfile($zipPath); @unlink($zipPath); exit;
}

$grupoIndex = isset($_GET['grupo']) ? max(0, (int)$_GET['grupo']) : 0;
if (!isset($gruposDeJogos[$grupoIndex])) tema2_out_error('Banner invalido. Grupo nao encontrado.');
$download = (isset($_GET['download']) && $_GET['download'] == 1) ? ('banner_tema_2_' . date('Y-m-d') . '_parte_' . ($grupoIndex+1) . '.png') : null;
tema2_draw_banner($jogos, $gruposDeJogos[$grupoIndex], $download);
