<?php
session_start();
// --- CORREÇÃO DE MEMÓRIA E TEMPO DE EXECUÇÃO MÁXIMOS ---
ini_set('memory_limit', '-1'); 
set_time_limit(0); 

require_once 'config.php';

$pdo = getConexaoAtiva(); // Banco Principal
$pdo_int = getConexaoInterna(); // Banco Local

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

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

// =========================================================================
// API AJAX (MOTOR TURBO DE LIMPEZA BRUTA)
// =========================================================================
if (isset($_GET['ajax_clean']) && $_GET['ajax_clean'] == 1) {
    header('Content-Type: application/json; charset=utf-8');
    
    $tipo = intval($_GET['tipo']);
    $apagados_lote = 0;
    
    $stream_dir = "/var/www/html/streams/";

    // Lógica para Xtream UI x XUI One
    if ($tipo == 5 && $modo_ativo === 'xui') {
        // --- LIMPEZA DE SÉRIES DUPLICADAS NO XUI ONE ---
        $sql = "SELECT id, title as name 
                FROM streams_series 
                WHERE id NOT IN (
                    SELECT MAX(id) FROM streams_series GROUP BY title
                ) 
                LIMIT 500";
    } else {
        // --- LIMPEZA DE CANAIS, FILMES OU SÉRIES NO XTREAM UI ---
        $sql = "SELECT id, stream_display_name as name, direct_source 
                FROM streams 
                WHERE type = ? 
                AND id NOT IN (
                    SELECT MAX(id) FROM streams WHERE type = ? GROUP BY stream_display_name
                ) 
                LIMIT 500";
    }
            
    $stmt = $pdo->prepare($sql);
    if ($tipo == 5 && $modo_ativo === 'xui') {
        $stmt->execute();
    } else {
        $stmt->execute([$tipo, $tipo]);
    }
    $itens_para_apagar = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (empty($itens_para_apagar)) {
        echo json_encode(['status' => 'concluido', 'apagados' => 0]);
        exit;
    }

    $ids_para_deletar = [];

    foreach ($itens_para_apagar as $item) {
        $id_del = $item['id'];
        $ids_para_deletar[] = $id_del;
        
        // Limpeza física (Só para canais ao vivo no Xtream UI ou XUI)
        if ($tipo == 1 && isset($item['direct_source']) && $item['direct_source'] == 0) {
            $stmtPid = $pdo->query("SELECT ffmpeg_pid FROM streams WHERE id = $id_del");
            $pid = $stmtPid->fetchColumn();
            if ($pid) @exec("kill -9 $pid");
            @exec("rm -f {$stream_dir}{$id_del}_*");
            @exec("rm -f {$stream_dir}{$id_del}_.m3u8");
        }
    }

    // Exclusão em Massa (Deleta os 500 de uma vez do banco ao invés de um por um)
    if (!empty($ids_para_deletar)) {
        $ids_str = implode(',', $ids_para_deletar);
        if ($tipo == 5 && $modo_ativo === 'xui') {
            // Remove episódios atrelados antes de remover a série
            try { $pdo->exec("DELETE FROM series_episodes WHERE series_id IN ($ids_str)"); } catch(Exception $e) {}
            try { $pdo->exec("DELETE FROM streams_seasons WHERE stream_id IN ($ids_str)"); } catch(Exception $e) {}
            $pdo->exec("DELETE FROM streams_series WHERE id IN ($ids_str)");
        } else {
            if ($tipo == 5) {
               try { $pdo->exec("DELETE FROM series_episodes WHERE series_id IN ($ids_str)"); } catch(Exception $e) {}
               try { $pdo->exec("DELETE FROM streams_seasons WHERE stream_id IN ($ids_str)"); } catch(Exception $e) {}
            }
            $pdo->exec("DELETE FROM streams WHERE id IN ($ids_str)");
        }
        $apagados_lote = count($ids_para_deletar);
    }

    echo json_encode(['status' => 'continuar', 'apagados' => $apagados_lote]);
    exit;
}
// =========================================================================

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

try {
    $tabela_existe = $pdo_int->query("SHOW TABLES LIKE 'painel_config'")->rowCount() > 0;
    if ($tabela_existe) {
        $config_painel = $pdo_int->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) {}

if (!isset($_SESSION['user_id'])) { header("Location: login.php"); exit; }

$role = $_SESSION['user_role'] ?? 'reseller'; 
$nome_usuario = $_SESSION['username'] ?? 'Usuário';
$user_id_logado = $_SESSION['user_id'];

// Somente ADMIN pode acessar a limpeza
if ($role !== 'admin') {
    header("Location: dashboard.php");
    exit;
}

$tabela_revendedores = ($modo_ativo === 'xui') ? '`users`' : '`reg_users`';
try { $user_credits = $pdo->query("SELECT credits FROM $tabela_revendedores WHERE id = " . intval($user_id_logado))->fetchColumn() ?: 0; } catch (Exception $e) { $user_credits = 0; }

// --- FUNÇÃO PARA CONTAR DUPLICADOS PARA A TELA (AJUSTADA PARA XUI E XTREAM) ---
function contarDuplicados($tipo) {
    global $pdo, $modo_ativo;
    
    if ($tipo == 5 && $modo_ativo === 'xui') {
        $sql = "SELECT SUM(qtd - 1) FROM (SELECT COUNT(*) as qtd FROM streams_series GROUP BY title HAVING COUNT(*) > 1) as sub";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
    } else {
        $sql = "SELECT SUM(qtd - 1) FROM (SELECT COUNT(*) as qtd FROM streams WHERE type = ? GROUP BY stream_display_name HAVING COUNT(*) > 1) as sub";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$tipo]);
    }
    
    return (int)$stmt->fetchColumn();
}

$duplicados_live = contarDuplicados(1);
$duplicados_filmes = contarDuplicados(2);
$duplicados_series = contarDuplicados(5);

?>
<!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>Limpeza de Dados - <?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: #0f1114; 
            --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;
            --info: #17a2b8;
        }
        body { margin: 0; font-family: 'Segoe UI', sans-serif; background-color: var(--bg-dark); color: var(--text-main); display: flex; height: 100vh; overflow: hidden; }

        /* SIDEBAR (HERDADO DA SIDEBAR.PHP) */
        .sidebar { width: 260px; background-color: var(--bg-sidebar); border-right: 1px solid var(--border-color); display: flex; flex-direction: column; transition: all 0.3s ease; z-index: 1001; }
        .sidebar-header { padding: 25px 20px; text-align: center; font-size: 22px; font-weight: bold; border-bottom: 1px solid var(--border-color); color: white; }
        .sidebar-header span { color: var(--accent); }
        .sidebar-logo { max-width: 180px; max-height: 60px; object-fit: contain; }
        .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; }
        .user-info .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; flex: 1; overflow-y: auto; }
        .menu-item { padding: 14px 25px; color: var(--text-main); text-decoration: none; display: flex; align-items: center; transition: 0.2s; font-size: 15px; border-left: 4px solid transparent; cursor: pointer; }
        .menu-item i:first-child { margin-right: 15px; width: 20px; text-align: center; font-size: 16px; color: var(--text-muted); }
        .menu-item:hover, .menu-item.active { background: #2c3138; color: white; border-left-color: var(--accent); }
        .menu-item.active i { color: var(--accent); }
        .submenu { display: none; background: #121519; list-style: none; padding: 0; margin: 0; }
        .submenu .menu-item { padding-left: 52px; font-size: 14px; border-left: none; }
        .arrow-icon { margin-left: auto; transition: 0.3s; font-size: 12px; }
        .rotate { transform: rotate(180deg); }
        .menu-category { padding: 20px 25px 8px; font-size: 11px; text-transform: uppercase; color: var(--text-muted); font-weight: bold; letter-spacing: 1px; }
        .logout-btn { padding: 15px; background-color: var(--danger); color: white; text-align: center; text-decoration: none; font-weight: bold; margin-top: auto; }

        /* MAIN CONTENT */
        .main { 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 30px; background-color: var(--bg-sidebar); border-bottom: 1px solid var(--border-color); }
        .content-area { padding: 25px; flex: 1; max-width: 1000px; margin: 0 auto; width: 100%; box-sizing: border-box; }
        .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; display: inline-block; }

        /* GRID E CARDS DE LIMPEZA */
        .clean-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-top: 20px; }
        .clean-card { background: var(--bg-card); border: 1px solid var(--border-color); border-radius: 10px; padding: 25px; text-align: center; transition: 0.3s; position: relative; overflow: hidden; }
        .clean-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0,0,0,0.2); border-color: var(--accent); }
        
        .clean-icon { font-size: 45px; margin-bottom: 15px; }
        .clean-title { font-size: 18px; color: white; font-weight: bold; margin-bottom: 10px; }
        .clean-desc { font-size: 13px; color: var(--text-muted); margin-bottom: 20px; line-height: 1.5; }
        
        .dup-count { display: inline-block; padding: 8px 15px; background: #121519; border: 1px solid var(--border-color); border-radius: 20px; font-size: 14px; font-weight: bold; margin-bottom: 20px; color: white; }
        .dup-count.has-dups { border-color: var(--warning); color: var(--warning); background: rgba(243, 156, 18, 0.1); }
        
        .btn-clean { background: var(--danger); color: white; border: none; padding: 12px 20px; border-radius: 6px; font-weight: bold; cursor: pointer; width: 100%; transition: 0.2s; font-size: 14px; display:flex; justify-content:center; align-items:center; gap:8px; }
        .btn-clean:hover { background: #c82333; }
        .btn-clean:disabled { background: #3a4149; color: #8a94a1; cursor: not-allowed; }

        .menu-toggle { display: none; background: none; border: none; color: white; font-size: 24px; cursor: pointer; }
        .sidebar-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.7); z-index: 1000; }

        /* INJEÇÃO CSS PARA AVISOS DA TELA */
        #alertBox { display: none; background: rgba(40, 167, 69, 0.1); border: 1px solid var(--success); color: var(--success); padding: 15px; border-radius: 8px; margin-bottom: 20px; font-weight: bold; align-items: center; gap: 10px; }

        @media (max-width: 768px) {
            .sidebar { position: fixed; left: -260px; height: 100%; }
            .sidebar.active { left: 0; }
            .sidebar-overlay.active { display: block; }
            .menu-toggle { display: block; margin-right: 15px; }
            .topbar { padding: 15px 20px; justify-content: flex-start; }
            .topbar-right { margin-left: auto; }
            .content-area { padding: 15px; }
        }
    </style>
</head>
<body>

    <div class="sidebar-overlay" id="overlay" onclick="toggleMenu()"></div>

    <?php include 'sidebar.php'; ?>

    <div class="main">
        <header class="topbar">
            <div style="display: flex; align-items: center;">
                <button class="menu-toggle" id="btn-menu" onclick="toggleMenu()"><i class="fas fa-bars"></i></button>
                <h2 style="margin:0; color: white; margin-left: 10px;">Limpeza de Dados</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">
            
            <h2 style="color: white; margin-top: 0;">Removedor de Duplicados</h2>
            <p style="color: var(--text-muted); font-size: 14px; margin-bottom: 25px;">Esta ferramenta varre o banco de dados procurando por conteúdos com exatamente o mesmo nome. Ao executar a limpeza, o sistema <b>manterá apenas o arquivo mais recente</b> que você adicionou e apagará as cópias velhas, aliviando o servidor.</p>

            <div id="alertBox"></div>

            <div class="clean-grid">
                
                <div class="clean-card">
                    <i class="fas fa-broadcast-tower clean-icon" style="color: #0ea5e9;"></i>
                    <div class="clean-title">Canais Ao Vivo</div>
                    <div class="clean-desc">Apaga cópias de canais de TV. Se o canal estiver aberto no FFmpeg, ele será finalizado com segurança antes de apagar.</div>
                    
                    <div class="dup-count <?php echo $duplicados_live > 0 ? 'has-dups' : ''; ?>">
                        <i class="fas fa-copy"></i> <?php echo $duplicados_live; ?> cópias inúteis
                    </div>
                    
                    <button type="button" class="btn-clean" id="btn_clean_1" onclick="iniciarLimpeza(1, <?php echo $duplicados_live; ?>)" <?php echo $duplicados_live == 0 ? 'disabled' : ''; ?>>
                        <i class="fas fa-broom"></i> <span id="txt_clean_1">Limpar Canais</span>
                    </button>
                </div>

                <div class="clean-card">
                    <i class="fas fa-film clean-icon" style="color: var(--success);"></i>
                    <div class="clean-title">Filmes (VOD)</div>
                    <div class="clean-desc">Apaga cópias duplicadas de filmes que foram importados mais de uma vez na sua lista M3U.</div>
                    
                    <div class="dup-count <?php echo $duplicados_filmes > 0 ? 'has-dups' : ''; ?>">
                        <i class="fas fa-copy"></i> <?php echo $duplicados_filmes; ?> cópias inúteis
                    </div>
                    
                    <button type="button" class="btn-clean" id="btn_clean_2" onclick="iniciarLimpeza(2, <?php echo $duplicados_filmes; ?>)" <?php echo $duplicados_filmes == 0 ? 'disabled' : ''; ?>>
                        <i class="fas fa-broom"></i> <span id="txt_clean_2">Limpar Filmes</span>
                    </button>
                </div>

                <div class="clean-card">
                    <i class="fas fa-video clean-icon" style="color: #8b5cf6;"></i>
                    <div class="clean-title">Episódios de Séries</div>
                    <div class="clean-desc">Remove episódios de séries, novelas e animes que ficaram duplicados no banco de dados.</div>
                    
                    <div class="dup-count <?php echo $duplicados_series > 0 ? 'has-dups' : ''; ?>">
                        <i class="fas fa-copy"></i> <?php echo $duplicados_series; ?> cópias inúteis
                    </div>
                    
                    <button type="button" class="btn-clean" id="btn_clean_5" onclick="iniciarLimpeza(5, <?php echo $duplicados_series; ?>)" <?php echo $duplicados_series == 0 ? 'disabled' : ''; ?>>
                        <i class="fas fa-broom"></i> <span id="txt_clean_5">Limpar Séries</span>
                    </button>
                </div>

            </div>

        </div>
        <?php include 'rodape.php'; ?>
    </div>

    <script>
        // MENU LATERAL VIA INCLUDE
        const sidebar = document.getElementById('sidebar');
        const overlay = document.getElementById('overlay');
        
        function toggleMenu() { 
            if(sidebar) sidebar.classList.toggle('active'); 
            if(overlay) overlay.classList.toggle('active'); 
        }

        function toggleSubmenu(id) {
            const sub = document.getElementById(id);
            const arrow = document.getElementById('arrow-' + id);
            if (sub.style.display === "block") { sub.style.display = "none"; if(arrow) arrow.classList.remove('rotate'); } 
            else { sub.style.display = "block"; if(arrow) arrow.classList.add('rotate'); }
        }

        // MOTOR AJAX ASSÍNCRONO PARA LIMPEZA
        let totalApagadoGeral = 0;

        async function iniciarLimpeza(tipo, totalDuplicados) {
            if(!confirm("Tem certeza que deseja apagar as cópias duplicadas? Essa ação é irreversível.")) return;

            const btn = document.getElementById(`btn_clean_${tipo}`);
            const txt = document.getElementById(`txt_clean_${tipo}`);
            const icone = btn.querySelector('i');

            btn.disabled = true;
            btn.style.background = 'var(--warning)';
            btn.style.color = 'black';
            icone.className = 'fas fa-spinner fa-spin';
            
            let apagadosAcumulados = 0;
            
            async function processarLote() {
                try {
                    const res = await fetch(`?ajax_clean=1&tipo=${tipo}`);
                    const data = await res.json();
                    
                    apagadosAcumulados += data.apagados;
                    
                    // Cálculo de porcentagem seguro
                    let pct = totalDuplicados > 0 ? Math.floor((apagadosAcumulados / totalDuplicados) * 100) : 100;
                    if(pct > 100) pct = 100;
                    
                    txt.innerText = `Limpando... ${pct}%`;

                    if (data.status === 'continuar' && data.apagados > 0) {
                        // Se ainda tem mais, chama o próximo lote
                        setTimeout(processarLote, 500);
                    } else {
                        // Terminou
                        icone.className = 'fas fa-check';
                        btn.style.background = 'var(--success)';
                        btn.style.color = 'white';
                        txt.innerText = 'Concluído!';
                        
                        const alertBox = document.getElementById('alertBox');
                        alertBox.style.display = 'flex';
                        alertBox.innerHTML = `<i class='fas fa-check-circle'></i> Limpeza de Categoria finalizada! Foram removidas <b>${apagadosAcumulados}</b> cópias.`;
                        
                        setTimeout(() => { window.location.reload(); }, 3000);
                    }
                } catch(e) {
                    icone.className = 'fas fa-exclamation-triangle';
                    btn.style.background = 'var(--danger)';
                    btn.style.color = 'white';
                    txt.innerText = 'Erro na conexão';
                    setTimeout(() => { window.location.reload(); }, 2000);
                }
            }

            processarLote();
        }
    </script>
    <script src="tema.js"></script>
</body>
</html>