<?php
// --- BLOQUEIO AVANÇADO INTELIGENTE ---
$http_accept = strtolower($_SERVER['HTTP_ACCEPT'] ?? '');
$user_agent = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');

$apps_iptv = ['iptv', 'smarters', 'xciptv', '9xtream', 'vlc', 'exoplayer', 'libvlc', 'applecoremedia', 'stagefright', 'roku', 'tizen', 'kodi', 'smart-tv'];

$is_app = false;
foreach ($apps_iptv as $app) {
    if (strpos($user_agent, $app) !== false) {
        $is_app = true;
        break;
    }
}

if (!$is_app && strpos($http_accept, 'text/html') !== false && isset($_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'])) {
    header("HTTP/1.1 200 OK");
    header("Content-Type: text/html; charset=UTF-8");
    die("
    <!DOCTYPE html>
    <html>
    <head>
        <title>Acesso Restrito</title>
        <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    </head>
    <body style='background-color: #121212; color: #ffffff; font-family: Arial, sans-serif; text-align: center; padding-top: 10%'>
        <h1 style='color: #e74c3c; font-size: 40px;'>ACESSO RESTRITO</h1>
        <p style='font-size: 18px; color: #aaaaaa;'>O acesso a este conteúdo via navegador web foi bloqueado por motivos de segurança.</p>
        <div style='margin-top: 30px; padding: 20px; background-color: #1e1e1e; display: inline-block; border-radius: 8px;'>
            <p style='margin: 0; font-size: 16px;'>Por favor, insira seus dados diretamente no seu<br><b style='color: #3498db;'>Aplicativo de IPTV</b> ou <b style='color: #3498db;'>TV Box</b>.</p>
        </div>
    </body>
    </html>
    ");
}
// --- FIM DO BLOQUEIO AVANÇADO ---

require_once 'config.php';

$user = $_GET['user'] ?? '';
$pass = $_GET['pass'] ?? '';
$stream_id = (int)($_GET['id'] ?? 0);

if (!$user || !$pass || !$stream_id) {
    header("HTTP/1.0 400 Bad Request");
    die("Parametros invalidos.");
}

$pdo = getConexaoAtiva();

$stmtU = $pdo->prepare("SELECT id, exp_date, last_activity FROM users WHERE username = ? AND password = ? AND enabled = 1");
$stmtU->execute([$user, $pass]);
$uData = $stmtU->fetch();

if (!$uData || ($uData['exp_date'] < time() && $uData['exp_date'] != 0)) {
    header("HTTP/1.1 401 Unauthorized");
    die("Acesso Negado ou Conta Vencida.");
}

// --- ATUALIZAÇÃO DO STATUS ONLINE ---
$ip_cliente = $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];
$agora = time();
$ultima_ativ = (int)$uData['last_activity'];
$nova_sessao = ($agora - $ultima_ativ > 60) ? 1 : 0; 

$sql_update = "UPDATE users SET last_activity = ?, current_channel = ?, last_ip = ?, connected_at = IF(connected_at = 0 OR ? > 0, ?, connected_at) WHERE id = ?";
$pdo->prepare($sql_update)->execute([$agora, $stream_id, $ip_cliente, $nova_sessao, $agora, $uData['id']]);

$stmtS = $pdo->prepare("SELECT stream_source, direct_source FROM streams WHERE id = ?");
$stmtS->execute([$stream_id]);
$rowS = $stmtS->fetch(PDO::FETCH_ASSOC);

if (!$rowS || empty($rowS['stream_source'])) {
    header("HTTP/1.0 404 Not Found");
    die("Conteudo nao encontrado.");
}

$source = $rowS['stream_source'];
$modo_direct = (isset($rowS['direct_source']) && $rowS['direct_source'] == 1) ? true : false;

$link_real = $source;
if (strpos($link_real, '[') === 0) {
    $parsed = json_decode($link_real, true);
    if (is_array($parsed) && count($parsed) > 0) {
        $link_real = $parsed[0];
    }
}

// --- INTELIGÊNCIA VOD (FILMES/SÉRIES) VS LIVE ---
$ext = strtolower(pathinfo(parse_url($link_real, PHP_URL_PATH), PATHINFO_EXTENSION));
$ext_filmes = ['mp4', 'mkv', 'avi', 'mov', 'flv']; // Lista de extensões de vídeo

// Se for um formato de filme, forçamos o modo_direct para o SSIPTV não travar
if (in_array($ext, $ext_filmes)) {
    $modo_direct = true; 
}

// ==============================================================================
// CORREÇÃO P2P E BACKBLAZE (NUVEM):
// Nuvens exigem HTTPS para download. Portanto, só forçamos o HTTP 
// se o conteúdo NÃO for um filme (ou seja, apenas para Canais Ao Vivo).
// ==============================================================================
if (!$modo_direct) {
    $link_real = str_replace('https://', 'http://', $link_real);
}

if ($modo_direct) {
    // Redirecionamento 302 direto para a fonte original. 
    // Isso permite que o SSIPTV use "Range Requests" (avançar/retroceder) sem sobrecarregar seu PHP.
    header("Location: " . $link_real);
    exit;
} else {
    // Modo Proxy (Apenas para Canais Ao Vivo - TS, M3U8, etc)
    set_time_limit(0);
    @ini_set('output_buffering', 'off');
    @ini_set('zlib.output_compression', false);
    while (@ob_end_flush());
    
    header('Content-Type: video/mp2t'); 
    header('Cache-Control: no-cache');
    
    $opts = [
        "http" => [
            "method" => "GET",
            "header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\r\n"
        ]
    ];
    $context = stream_context_create($opts);
    
    $fp = @fopen($link_real, 'rb', false, $context);
    
    if ($fp) {
        while (!feof($fp) && connection_status() == 0) {
            echo fread($fp, 8192);
            @flush();
            
            // HEARTBEAT INTERNO E GATILHO DE CORTE (KILL SWITCH)
            if (time() - $agora > 10) {
                $agora = time();
                $pdo->prepare("UPDATE users SET last_activity = ? WHERE id = ?")->execute([$agora, $uData['id']]);
                
                // NOVO: Verifica se o painel mandou derrubar a conexão (zerou o canal)
                $stmtCheck = $pdo->prepare("SELECT current_channel FROM users WHERE id = ?");
                $stmtCheck->execute([$uData['id']]);
                if ($stmtCheck->fetchColumn() == 0) {
                    fclose($fp);
                    die(); // Corta a transmissão do vídeo na hora!
                }
            }
        }
        fclose($fp);
    } else {
        header("HTTP/1.0 502 Bad Gateway");
        die("Falha ao carregar a fonte (Modo Live).");
    }
    exit;
}
?>