<?php
session_start();
// --- CORREÇÃO DE MEMÓRIA E TEMPO PARA PROCESSAR VÁRIOS EPGs ---
ini_set('memory_limit', '-1');
set_time_limit(0);

require_once 'config.php';

$pdo = getConexaoInterna(); // Banco Local (Salva os links EPG)
$pdo_ext = getConexaoAtiva(); // Banco Principal (Onde ficam os Streams e EPG Data)

$pdo->exec("SET NAMES utf8mb4");
$pdo_ext->exec("SET NAMES utf8mb4");

if (!isset($_SESSION['user_id'])) { die("Acesso negado."); }

$id_usuario = $_SESSION['user_id'];
$nome_usuario = $_SESSION['username'] ?? 'Usuário';
$role = $_SESSION['user_role'] ?? 'revenda';
if ($role !== 'admin') { die("Acesso restrito ao administrador."); }

// ====================================================================
// INTELIGÊNCIA ARTIFICIAL: DETECTA SE É XUI ONE OU XTREAM UI
// ====================================================================
$modo_ativo = 'interno';
try {
    $modo_ativo = $pdo->query("SELECT modo_ativo FROM configuracoes LIMIT 1")->fetchColumn() ?: 'interno';
} catch (Exception $e) {}

// --- GARANTE AS TABELAS NECESSÁRIAS ---
try {
    // Cria tabela de links no banco interno
    $pdo->exec("CREATE TABLE IF NOT EXISTS `epg_links` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `nome` varchar(255) NOT NULL,
        `url` text NOT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
    
    // Cria a coluna custom_sid de forma segura no banco principal
    $pdo_ext->exec("ALTER TABLE streams ADD COLUMN IF NOT EXISTS custom_sid VARCHAR(255) DEFAULT NULL");
} catch (Exception $e) {}

// --- CRUD DOS LINKS DE EPG (Banco Interno) ---
if (isset($_POST['action_save_epg'])) {
    $nome = trim($_POST['epg_nome']);
    $url = trim($_POST['epg_url']);
    $id = isset($_POST['epg_id']) ? (int)$_POST['epg_id'] : 0;
    
    if ($id > 0) {
        $pdo->prepare("UPDATE epg_links SET nome = ?, url = ? WHERE id = ?")->execute([$nome, $url, $id]);
    } else {
        $pdo->prepare("INSERT INTO epg_links (nome, url) VALUES (?, ?)")->execute([$nome, $url]);
    }
    header("Location: admin_epg_sync.php"); exit;
}

if (isset($_GET['delete_epg'])) {
    $pdo->prepare("DELETE FROM epg_links WHERE id = ?")->execute([(int)$_GET['delete_epg']]);
    header("Location: admin_epg_sync.php"); exit;
}

// --- INÍCIO: PERSONALIZAÇÃO DINÂMICA PADRÃO ---
$nome_painel = 'TOP IPTV';
$logo_url = '';
$cor_primaria = '#007bff';

try {
    $tabela_existe = $pdo->query("SHOW TABLES LIKE 'painel_config'")->rowCount() > 0;
    if ($tabela_existe) {
        $config_painel = $pdo->query("SELECT * FROM painel_config LIMIT 1")->fetch(PDO::FETCH_ASSOC);
        if ($config_painel) {
            $nome_painel = !empty($config_painel['nome_painel']) ? $config_painel['nome_painel'] : $nome_painel;
            $logo_url = !empty($config_painel['logo_url']) ? $config_painel['logo_url'] : $logo_url;
            $cor_primaria = !empty($config_painel['cor_primaria']) ? $config_painel['cor_primaria'] : $cor_primaria;
        }
    }
} catch (Exception $e) { }

$api_conf = ['api_binstream_url' => ''];
try {
    $api_conf = $pdo->query("SELECT api_binstream_url FROM painel_config LIMIT 1")->fetch(PDO::FETCH_ASSOC) ?: ['api_binstream_url' => ''];
} catch (Exception $e) {}

try {
    $tabela_revendedores = ($modo_ativo === 'xui') ? '`users`' : '`reg_users`';
    $user_credits = $pdo_ext->query("SELECT credits FROM $tabela_revendedores WHERE id = " . intval($id_usuario))->fetchColumn() ?: 0;
} catch (Exception $e) { $user_credits = 0; }
// --- FIM: PERSONALIZAÇÃO DINÂMICA PADRÃO ---

// =========================================================================
// O TRITURADOR DE NOMES E SINCRONIZADOR EM MASSA
// =========================================================================
function normalizeId($str) {
    $str = strtolower(trim($str));
    $str = preg_replace('/https?:\/\/\S+/', '', $str); 
    $str = preg_replace('/\[.*?\]|\(.*?\)|\{.*?\}/', '', $str); 
    $str = preg_replace('/\b(fhd|hd|sd|4k|uhd|h265|h\.265|hevc|br|pt|pt\-br|leg|dub|tv|canal|ao vivo)\b/i', '', $str); 
    $str = preg_replace('/[^a-z0-9]/', '', $str); 
    return $str;
}

if (isset($_GET['action']) && $_GET['action'] == 'processar_xml') {
    header('Content-Type: text/plain');
    header('Cache-Control: no-cache');
    header('X-Accel-Buffering: no'); 
    header('X-LiteSpeed-Timeout: 10000'); // MÁGICA: Pede pro CyberPanel não derrubar a conexão por 2 horas!
    
    while (ob_get_level()) { ob_end_clean(); }
    ob_implicit_flush(true);

    $links_salvos = $pdo->query("SELECT * FROM epg_links")->fetchAll(PDO::FETCH_ASSOC);
    if (empty($links_salvos)) {
        echo "[ERRO FATAL] Nenhum link de EPG cadastrado. Adicione um link primeiro.\n";
        exit;
    }

    echo "[SISTEMA] Iniciando TRITURADOR DE EPG...\n";
    echo "[INFO] Mapeando canais do sistema...\n";
    
    // MÁGICA: No XUI, Live Streams usam types 1, 3 ou 4. No Xtream é type 1.
    $tipos_live = ($modo_ativo === 'xui') ? '1, 3, 4' : '1';
    
    $streams = $pdo_ext->query("SELECT id, stream_display_name FROM streams WHERE type IN ($tipos_live)")->fetchAll(PDO::FETCH_ASSOC);
    
    $map_sid_to_ids = []; // MÁGICA: Mapeamento para o XUI One atrelar os programas ao stream_id correto

    // CORREÇÃO XUI ONE: Salva o ID do EPG na coluna 'epg_id' além do 'custom_sid'
    if ($modo_ativo === 'xui') {
        try { $pdo_ext->exec("ALTER TABLE streams ADD COLUMN IF NOT EXISTS epg_id VARCHAR(255) DEFAULT NULL"); } catch (Exception $e) {}
        $stmt_update = $pdo_ext->prepare("UPDATE streams SET custom_sid = ?, epg_id = ? WHERE id = ?");
        foreach ($streams as $stream) {
            $nid = normalizeId($stream['stream_display_name']);
            if (!empty($nid)) {
                $stmt_update->execute([$nid, $nid, $stream['id']]); 
                $map_sid_to_ids[$nid][] = $stream['id']; // Guarda o ID da stream no Array do XUI
            }
        }
    } else {
        $stmt_update = $pdo_ext->prepare("UPDATE streams SET custom_sid = ? WHERE id = ?");
        foreach ($streams as $stream) {
            $nid = normalizeId($stream['stream_display_name']);
            if (!empty($nid)) {
                $stmt_update->execute([$nid, $stream['id']]); 
            }
        }
    }
    echo "[OK] Banco de dados preparado!\n\n";

    echo "========================================================\n";
    echo " IMPORTANDO GUIAS SALVOS\n";
    echo "========================================================\n";

    $is_xui_timestamp = false;

    // PREPARAÇÃO DAS TABELAS DEPENDENDO DO MODO
    if ($modo_ativo === 'xui') {
        // XUI One exige os dados na tabela `epg` amarrados ao `stream_id`
        $pdo_ext->exec("CREATE TABLE IF NOT EXISTS `epg` (
            `id` int(11) NOT NULL AUTO_INCREMENT, `stream_id` int(11) NOT NULL DEFAULT 0, `epg_id` varchar(255) NOT NULL, `title` text,
            `description` text, `start` datetime, `end` datetime, `lang` varchar(10) DEFAULT '',
            PRIMARY KEY (`id`), KEY `stream_id` (`stream_id`), KEY `epg_id` (`epg_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
        
        // --- CORREÇÃO BLINDADA: Força a injeção das colunas caso a tabela 'epg' do XUI nativo exista sem elas ---
        try { $pdo_ext->exec("ALTER TABLE `epg` ADD COLUMN `stream_id` int(11) NOT NULL DEFAULT 0"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg` ADD COLUMN `epg_id` varchar(255) DEFAULT ''"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg` ADD COLUMN `title` text"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg` ADD COLUMN `description` text"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg` ADD COLUMN `start` datetime"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg` ADD COLUMN `end` datetime"); } catch(Exception $e){}
        // -----------------------------------------------------------------------------------------------
        
        // Backup para APIs de XUI que usam epg_data em paralelo
        $pdo_ext->exec("CREATE TABLE IF NOT EXISTS `epg_data` (
            `id` int(11) NOT NULL AUTO_INCREMENT, `channel_id` varchar(255) NOT NULL, `title` text,
            `description` text, `start` datetime, `end` datetime,
            PRIMARY KEY (`id`), KEY `channel_id` (`channel_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

        // --- CORREÇÃO BLINDADA: Força a injeção das colunas caso a tabela 'epg_data' falhe ---
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `channel_id` varchar(255) DEFAULT ''"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `title` text"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `description` text"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `start` datetime"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `end` datetime"); } catch(Exception $e){}
        // -----------------------------------------------------------------------------------------------

        $pdo_ext->exec("TRUNCATE TABLE epg");
        $pdo_ext->exec("TRUNCATE TABLE epg_data");
        
        // Identifica dinamicamente se a tabela epg do XUI usa INT (Timestamp) ou DATETIME
        try {
            $col_type = $pdo_ext->query("SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'epg' AND COLUMN_NAME = 'start' AND TABLE_SCHEMA = DATABASE()")->fetchColumn();
            if (strtoupper($col_type) == 'INT' || strtoupper($col_type) == 'BIGINT') {
                $is_xui_timestamp = true;
            }
        } catch (Exception $e) {}

        $stmt_insert_xui = $pdo_ext->prepare("INSERT INTO epg (stream_id, epg_id, title, description, start, end) VALUES (?, ?, ?, ?, ?, ?)");
        $stmt_insert_data = $pdo_ext->prepare("INSERT INTO epg_data (channel_id, title, description, start, end) VALUES (?, ?, ?, ?, ?)");
        
    } else {
        // Xtream UI Clássico
        $pdo_ext->exec("CREATE TABLE IF NOT EXISTS `epg_data` (
            `id` int(11) NOT NULL AUTO_INCREMENT, `channel_id` varchar(255) NOT NULL, `title` text,
            `description` text, `start` datetime, `end` datetime,
            PRIMARY KEY (`id`), KEY `channel_id` (`channel_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

        // --- CORREÇÃO BLINDADA: Xtream UI
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `channel_id` varchar(255) DEFAULT ''"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `title` text"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `description` text"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `start` datetime"); } catch(Exception $e){}
        try { $pdo_ext->exec("ALTER TABLE `epg_data` ADD COLUMN `end` datetime"); } catch(Exception $e){}

        $pdo_ext->exec("TRUNCATE TABLE epg_data");
        $stmt_insert = $pdo_ext->prepare("INSERT INTO epg_data (channel_id, title, description, start, end) VALUES (?, ?, ?, ?, ?)");
    }

    function parseXMLDate($xmlDate) {
        if (preg_match('/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\s*([+-]\d{4})?/', $xmlDate, $m)) {
            $dateStr = $m[1].'-'.$m[2].'-'.$m[3].' '.$m[4].':'.$m[5].':'.$m[6];
            if (!empty($m[7])) { return date('Y-m-d H:i:s', strtotime($dateStr . ' ' . $m[7])); }
            return $dateStr;
        }
        return date('Y-m-d H:i:s');
    }

    foreach ($links_salvos as $l) {
        echo "[INFO] Baixando EPG: " . $l['nome'] . " (Isso pode demorar um pouco...)\n";
        @ob_flush(); flush();
        
        // =========================================================================
        // MÁGICA DO ARQUIVO TEMPORÁRIO (ACABA COM O NETWORK ERROR / FALTA DE MEMÓRIA)
        // =========================================================================
        $tmp_file = sys_get_temp_dir() . '/epg_' . md5(uniqid()) . '.xml';
        $fp = @fopen($tmp_file, 'w+');

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $l['url']);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 600); // 10 Minutos pro download
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
        curl_setopt($ch, CURLOPT_ENCODING, ''); // Suporte nativo a compressão GZIP/Deflate
        curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $chunk) use ($fp) {
            if ($fp) { fwrite($fp, $chunk); }
            echo " "; // Manda um espaço invisível pro LiteSpeed não matar a conexão
            @ob_flush(); flush();
            return strlen($chunk);
        });
        curl_exec($ch);
        curl_close($ch);
        
        if ($fp) { fclose($fp); }

        if (!file_exists($tmp_file) || filesize($tmp_file) < 100) { 
            echo "   [!] Link falhou ou retornou arquivo vazio. Pulando...\n"; 
            @unlink($tmp_file);
            continue; 
        }

        echo "\n   [INFO] Lendo XML na memória...\n";
        @ob_flush(); flush();

        // Verifica se o arquivo final baixado ainda está compactado em GZ (Ex: url terminada em .gz)
        $primeiros_bytes = file_get_contents($tmp_file, false, null, 0, 3);
        if ($primeiros_bytes === "\x1f\x8b\x08") {
            echo "   [INFO] Descompactando arquivo GZ...\n";
            @ob_flush(); flush();
            $gz_tmp_file = sys_get_temp_dir() . '/epg_unzip_' . md5(uniqid()) . '.xml';
            $gz = @gzopen($tmp_file, 'rb');
            $out = @fopen($gz_tmp_file, 'w');
            if ($gz && $out) {
                while (!gzeof($gz)) {
                    fwrite($out, gzread($gz, 4096));
                }
                gzclose($gz);
                fclose($out);
                @unlink($tmp_file); // Remove o antigo GZ
                $tmp_file = $gz_tmp_file; // Assume o novo XML descompactado
            }
        }

        // Carrega direto do arquivo poupando 50% de RAM!
        $xml = @simplexml_load_file($tmp_file);
        @unlink($tmp_file); // Limpa o arquivo oculto logo após o carregamento da RAM
        
        // =========================================================================

        if(!$xml || !isset($xml->channel)) { 
            echo "   [!] XML inválido. Pulando...\n"; 
            continue; 
        }

        $xml_channels = [];
        foreach ($xml->channel as $channel) {
            $id = (string)$channel['id'];
            $display = (string)$channel->{'display-name'}[0];
            $norm = normalizeId($display);
            if (empty($norm)) { $norm = normalizeId($id); }
            $xml_channels[$id] = $norm; 
        }

        $prog_lote = 0;
        $prog_total = 0;
        $pdo_ext->beginTransaction(); 

        foreach ($xml->programme as $prog) {
            $raw_id = (string)$prog['channel'];
            if (!isset($xml_channels[$raw_id])) continue;
            
            $c_id = $xml_channels[$raw_id]; 
            if (empty($c_id)) continue;

            $title = (string)$prog->title;
            $desc = (string)$prog->desc;
            $start = parseXMLDate((string)$prog['start']);
            $stop = parseXMLDate((string)$prog['stop']);

            if ($modo_ativo === 'xui') {
                // Checa dinamicamente se o XUI precisa de UNIX_TIMESTAMP ou String DATETIME
                $start_val = $is_xui_timestamp ? strtotime($start) : $start;
                $stop_val = $is_xui_timestamp ? strtotime($stop) : $stop;

                $stmt_insert_data->execute([$c_id, $title, $desc, $start, $stop]);
                
                // MÁGICA XUI NATIVO: Multiplica as linhas pelo número de streams que usam aquele EPG
                if (isset($map_sid_to_ids[$c_id])) {
                    foreach ($map_sid_to_ids[$c_id] as $s_id) {
                        $stmt_insert_xui->execute([$s_id, $c_id, $title, $desc, $start_val, $stop_val]);
                        $prog_lote++; $prog_total++;
                    }
                }
            } else {
                // Modo Xtream UI Padrão
                $stmt_insert->execute([$c_id, $title, $desc, $start, $stop]);
                $prog_lote++; $prog_total++;
            }

            if ($prog_lote >= 5000) {
                $pdo_ext->commit();
                echo "   -> " . number_format($prog_total) . " programas injetados...\n";
                @ob_flush(); flush();
                $pdo_ext->beginTransaction();
                $prog_lote = 0;
            }
        }
        $pdo_ext->commit();
        echo "   [✓] " . number_format($prog_total) . " programas salvos com sucesso!\n\n";
        @ob_flush(); flush();
    }

    echo "========================================================\n";
    echo "[CONCLUÍDO] Sincronização Total Finalizada.\n";
    echo "========================================================\n";
    exit;
}

$links_salvos = $pdo->query("SELECT * FROM epg_links ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC);
?>

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <link rel="stylesheet" href="tema.css">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Sincronizar EPG - <?php echo htmlspecialchars($nome_painel); ?></title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        :root { --bg-dark: #121519; --bg-sidebar: #1e2227; --bg-card: #272c33; --text-main: #d1d5da; --text-muted: #8a94a1; --accent: <?php echo $cor_primaria; ?>; --border-color: #3a4149; --success: #28a745; --danger: #dc3545; --warning: #f39c12; }
        body { margin: 0; font-family: 'Segoe UI', sans-serif; background-color: var(--bg-dark); color: var(--text-main); display: flex; height: 100vh; overflow: hidden; }
        
        /* USANDO O SIDEBAR.PHP */
        .sidebar { width: 260px; background-color: var(--bg-sidebar); display: flex; flex-direction: column; transition: 0.3s; border-right: 1px solid var(--border-color); z-index: 1001; flex-shrink: 0; }
        .sidebar-header { padding: 25px 20px; text-align: center; font-size: 22px; font-weight: bold; color: white; border-bottom: 1px solid var(--border-color); }
        .sidebar-logo { max-width: 180px; max-height: 55px; object-fit: contain; display: block; margin: 0 auto; }
        .user-info { padding: 20px; text-align: center; border-bottom: 1px solid var(--border-color); }
        .user-info .badge { background: rgba(255, 255, 255, 0.05); color: var(--accent); padding: 4px 10px; border-radius: 4px; font-size: 11px; text-transform: uppercase; font-weight: bold; margin-top: 5px; display: inline-block; }
        .credits-badge { display: block; margin-top: 10px; color: var(--success); font-weight: bold; font-size: 13px; }
        
        .menu-list { list-style: none; padding: 0; margin: 0; overflow-y: auto; flex: 1; padding-bottom: 20px;}
        .menu-list::-webkit-scrollbar { width: 6px; }
        .menu-list::-webkit-scrollbar-thumb { background: #3a4149; border-radius: 3px; }

        .menu-item { padding: 14px 20px; color: var(--text-main); text-decoration: none; display: flex; align-items: center; transition: 0.2s; border-left: 3px solid transparent; font-size: 14px; cursor: pointer; }
        .menu-item i:first-child { margin-right: 12px; width: 20px; text-align: center; color: var(--text-muted); }
        .menu-item:hover, .menu-item.active { background-color: #2c3138; color: white; border-left-color: var(--accent); }
        .menu-item.active i:first-child { color: var(--accent); }
        .menu-category { padding: 20px 20px 5px; font-size: 11px; font-weight: bold; color: var(--text-muted); text-transform: uppercase; letter-spacing: 1px;}
        .logout-btn { padding: 15px; background-color: var(--danger); color: white; text-align: center; text-decoration: none; font-weight: bold; }

        .submenu { display: none; background: #16191d; list-style: none; padding: 0; margin: 0; }
        .submenu .menu-item { padding-left: 52px; font-size: 13px; border-left: none; }
        .arrow-icon { margin-left: auto; transition: transform 0.3s ease; font-size: 11px; }
        
        /* ÁREA PRINCIPAL */
        .main-content { flex: 1; display: flex; flex-direction: column; overflow-y: auto; width: 100%; position: relative; }
        .topbar { display: flex; justify-content: space-between; align-items: center; padding: 15px 25px; background-color: var(--bg-sidebar); border-bottom: 1px solid var(--border-color); gap: 15px;}
        .menu-toggle { display: none; background: none; border: none; color: white; font-size: 22px; cursor: pointer; padding: 5px; }
        .sidebar-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.7); z-index: 1000; }
        .mode-badge { padding: 6px 15px; background: rgba(0, 123, 255, 0.15); color: var(--accent); border-radius: 20px; font-size: 12px; font-weight: bold; border: 1px solid var(--accent); white-space: nowrap; }
        
        .content-area { padding: 30px; flex: 1; max-width: 1200px; margin: 0 auto; width: 100%; box-sizing: border-box; }
        .card { background: var(--bg-card); border-radius: 12px; border: 1px solid var(--border-color); padding: 25px; margin-bottom: 25px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); }
        .card h3 { margin-top: 0; color: white; border-bottom: 1px solid var(--border-color); padding-bottom: 15px; display: flex; align-items: center; gap: 10px;}
        
        input[type="text"], input[type="url"] { width: 100%; padding: 12px; background: #121519; border: 1px solid var(--border-color); color: white; border-radius: 8px; margin-bottom: 15px; box-sizing: border-box; font-size: 14px;}
        input[type="text"]:focus, input[type="url"]:focus { outline: none; border-color: var(--accent); }
        
        .btn-save { background: var(--accent); color: white; border: none; padding: 15px; border-radius: 8px; cursor: pointer; font-weight: bold; width: 100%; font-size: 15px; transition: 0.2s; display: flex; justify-content: center; align-items: center; gap: 8px;}
        .btn-save:hover { filter: brightness(1.1); box-shadow: 0 4px 15px rgba(0,0,0,0.2); }
        .btn-save:disabled { background: #555; cursor: not-allowed; }
        
        .btn-action { padding: 8px 12px; border-radius: 4px; border: none; cursor: pointer; color: white; font-weight: bold; font-size: 12px; text-decoration: none;}
        .btn-edit { background: var(--warning); color: black; }
        .btn-del { background: var(--danger); }
        
        .terminal { background: #000; border-radius: 8px; border: 1px solid var(--border-color); margin-top: 20px; height: 350px; padding: 15px; overflow-y: auto; font-family: monospace; color: #0f0; white-space: pre-wrap; font-size: 13px; line-height: 1.5; }
        .terminal::-webkit-scrollbar { width: 8px; }
        .terminal::-webkit-scrollbar-thumb { background: #3a4149; border-radius: 4px; }

        /* TABELA DE LINKS */
        table { width: 100%; border-collapse: collapse; margin-top: 15px; font-size: 14px;}
        th { background: #121519; padding: 12px; text-align: left; color: var(--text-muted); border-bottom: 1px solid var(--border-color); }
        td { padding: 12px; border-bottom: 1px solid var(--border-color); color: white; }

        /* MODAL */
        .modal { display: none; position: fixed; z-index: 2000; left: 0; top: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.85); align-items: center; justify-content: center; padding: 15px; box-sizing: border-box;}
        .modal-content { background: var(--bg-card); width: 100%; max-width: 450px; padding: 25px; border-radius: 12px; border: 1px solid var(--border-color); position: relative; margin: auto; }

        /* ==================================================================== */
        /* FORÇA A COR AZUL NO ADMINISTRADOR E VERDE NO SALDO */
        /* ==================================================================== */
        .user-info > div:nth-child(2), .user-info .badge { background: rgba(0, 123, 255, 0.2) !important; color: var(--accent) !important; padding: 4px 10px !important; border-radius: 4px !important; font-size: 11px !important; text-transform: uppercase !important; font-weight: bold !important; margin-top: 5px !important; margin-bottom: 5px !important; display: inline-block !important; }
        .user-info > div:nth-child(3), .user-info .credits-badge, .user-info i.fa-coins { color: var(--success) !important; font-weight: bold !important; font-size: 13px !important; display: inline-block !important; }
        .user-info > div:nth-child(3) { margin-top: 8px !important; display: block !important; }

        /* ==================================================================== */
        /* FORÇA OS ÍCONES DA SIDEBAR A FICAREM AZUIS */
        /* ==================================================================== */
        .sidebar i, .sidebar span[class*="icon"], .sidebar .fas, .sidebar .fab { color: var(--accent) !important; }
        .menu-item i:first-child { margin-right: 12px; width: 20px; text-align: center; color: var(--accent) !important; }
        .menu-item:hover, .menu-item.active { background-color: #2c3138 !important; color: white !important; border-left-color: var(--accent) !important; }
        .sidebar .active, .sidebar .menu-item.active, .sidebar li.active > a { border-left-color: var(--accent) !important; color: white !important; background: #24282d !important; }
        .sidebar a:hover, .sidebar .menu-item:hover { border-left-color: var(--accent) !important; color: white !important; background: #2c3138 !important; }

        @media (max-width: 768px) {
            .menu-toggle { display: block; }
            .sidebar { position: fixed; left: -260px; height: 100%; box-shadow: 10px 0 20px rgba(0,0,0,0.5); }
            .sidebar.active { left: 0; }
            .sidebar-overlay.active { display: block; }
            .content-area { padding: 15px; }
            table { display: block; overflow-x: auto; white-space: nowrap; }
            .topbar-right { margin-left: auto; }
            .mode-badge { font-size: 10px; padding: 4px 10px; }
        }
    </style>
</head>
<body>
    <div class="sidebar-overlay" id="overlay" onclick="toggleMenu()"></div>
    
    <?php include 'sidebar.php'; ?>

    <div class="main-content">
        <header class="topbar">
            <div style="display:flex; align-items:center; gap: 10px;">
                <button class="menu-toggle" onclick="toggleMenu()"><i class="fas fa-bars"></i></button>
                <h2 style="margin:0; font-size: 18px; color:white;"><i class="fas fa-clock" style="color:var(--accent);"></i> Sincronizar EPG</h2>
            </div>
            <div class="topbar-right">
                <span class="mode-badge"><i class="fas fa-database"></i> MODO: <?php echo defined('MODO_SISTEMA') ? strtoupper(MODO_SISTEMA) : strtoupper($modo_ativo); ?></span>
            </div>
        </header>

        <div class="content-area">
            
            <div class="card" style="border-top: 4px solid var(--info);">
                <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom: 15px; flex-wrap: wrap; gap: 10px;">
                    <h3 style="margin:0; border: none; padding: 0;"><i class="fas fa-link" style="color:var(--info);"></i> Seus Links de EPG</h3>
                    <button class="btn-save" style="width:auto; padding: 10px 15px; font-size:13px; background:var(--info); margin: 0;" onclick="openEpgModal()"><i class="fas fa-plus"></i> Novo Link</button>
                </div>
                
                <div style="overflow-x: auto;">
                    <table>
                        <thead>
                            <tr>
                                <th>Nome de Referência</th>
                                <th>Link (URL XML)</th>
                                <th style="text-align:right;">Ações</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php if (empty($links_salvos)): ?>
                                <tr><td colspan="3" style="text-align:center; padding: 20px;">Nenhum link salvo. Adicione seu primeiro link de EPG.</td></tr>
                            <?php else: foreach ($links_salvos as $l): ?>
                                <tr>
                                    <td><strong><?php echo htmlspecialchars($l['nome']); ?></strong></td>
                                    <td><span style="color:var(--text-muted); font-size:12px;"><?php echo htmlspecialchars($l['url']); ?></span></td>
                                    <td style="text-align:right;">
                                        <button class="btn-action btn-edit" onclick="openEpgModal(<?php echo $l['id']; ?>, '<?php echo addslashes($l['nome']); ?>', '<?php echo addslashes($l['url']); ?>')"><i class="fas fa-edit"></i></button>
                                        <a href="?delete_epg=<?php echo $l['id']; ?>" class="btn-action btn-del" onclick="return confirm('Deseja excluir este link?')"><i class="fas fa-trash"></i></a>
                                    </td>
                                </tr>
                            <?php endforeach; endif; ?>
                        </tbody>
                    </table>
                </div>
            </div>

            <div class="card" style="border-top: 4px solid var(--accent);">
                <h3><i class="fas fa-sync" style="color:var(--accent);"></i> O Triturador de EPG</h3>
                <p style="font-size: 13px; color: var(--text-muted); margin-bottom: 20px;">Clique no botão abaixo para processar <b>todos os links salvos acima</b> de uma única vez. O painel cuidará de tudo!</p>
                
                <button type="button" id="btnSync" class="btn-save" onclick="startSync()" <?php echo empty($links_salvos) ? 'disabled' : ''; ?>>
                    <i class="fas fa-database"></i> INICIAR SINCRONIZAÇÃO TOTAL
                </button>
                
                <div class="terminal" id="terminalLog">Pronto para rodar. Clique no botão acima para sincronizar os EPGs salvos. O processo pode demorar alguns minutos.</div>
            </div>
            
            <?php include 'rodape.php'; ?>
        </div>
    </div>

    <div id="modalEpg" class="modal">
        <div class="modal-content">
            <h3 style="margin-top:0; color:white; border-bottom: 1px solid var(--border-color); padding-bottom: 15px;"><i class="fas fa-link" style="color:var(--accent);"></i> Salvar Link EPG</h3>
            <form method="POST">
                <input type="hidden" name="action_save_epg" value="1">
                <input type="hidden" name="epg_id" id="epg_id" value="0">
                
                <label style="color:var(--text-muted); font-size:12px; font-weight:bold;">Nome / Identificação</label>
                <input type="text" name="epg_nome" id="epg_nome" placeholder="Ex: EPG Brasil Completo" required>
                
                <label style="color:var(--text-muted); font-size:12px; font-weight:bold; margin-top: 10px;">URL do XML</label>
                <input type="url" name="epg_url" id="epg_url" placeholder="http://..." required>
                
                <button type="submit" class="btn-save" style="margin-top:20px; margin-bottom: 0;">SALVAR LINK</button>
                <button type="button" onclick="document.getElementById('modalEpg').style.display='none'" style="width:100%; background:none; border:none; color:#dc3545; margin-top:15px; cursor:pointer; font-weight:bold;">Cancelar</button>
            </form>
        </div>
    </div>

    <script>
        function toggleMenu() { 
            document.getElementById('sidebar').classList.toggle('active'); 
            document.getElementById('overlay').classList.toggle('active'); 
        }

        function toggleSubmenu(id) {
            var submenu = document.getElementById(id);
            var arrow = document.getElementById('arrow-' + id);
            if (submenu.style.display === "block") {
                submenu.style.display = "none";
                if(arrow) arrow.style.transform = "rotate(0deg)"; 
            } else {
                submenu.style.display = "block";
                if(arrow) arrow.style.transform = "rotate(180deg)"; 
            }
        }

        function openEpgModal(id = 0, nome = '', url = '') {
            document.getElementById('epg_id').value = id;
            document.getElementById('epg_nome').value = nome;
            document.getElementById('epg_url').value = url;
            document.getElementById('modalEpg').style.display = 'flex';
        }

        async function startSync() {
            const btn = document.getElementById('btnSync');
            const term = document.getElementById('terminalLog');
            
            btn.disabled = true; 
            btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Processando todos os links...'; 
            term.innerHTML = "Aguarde, conectando ao banco de dados...\n";
            
            try {
                const res = await fetch('?action=processar_xml');
                const reader = res.body.getReader();
                const decoder = new TextDecoder('utf-8');
                
                while (true) {
                    const { done, value } = await reader.read();
                    if (done) break;
                    term.innerHTML += decoder.decode(value, { stream: true });
                    term.scrollTop = term.scrollHeight; 
                }
                
                btn.disabled = false; 
                btn.innerHTML = '<i class="fas fa-check-circle"></i> CONCLUÍDO!';
            } catch (err) { 
                term.innerHTML += `\n[ERRO] ${err.message}`; 
                btn.disabled = false; 
                btn.innerHTML = '<i class="fas fa-database"></i> TENTAR NOVAMENTE';
            }
        }
    </script>
    <script src="tema.js"></script>
</body>
</html>