<?php
/**
 * get.php - Gerador de Lista e Redirecionador de Streaming (Completo)
 */

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

// Limpeza de buffer
if (ob_get_level()) ob_end_clean();
ob_start();

require_once 'includes/db.php';
ob_clean(); 

// 1. Captura de Dados
$username  = $_REQUEST['username'] ?? '';
$password  = $_REQUEST['password'] ?? '';
$stream_id = $_REQUEST['stream_id'] ?? ''; // Vem do .htaccess
$extension = $_REQUEST['extension'] ?? $_REQUEST['ext'] ?? 'ts';
$type      = $_REQUEST['type'] ?? 'm3u'; // Para geração da lista

// 2. Autenticação do Usuário
if (empty($username) || empty($password)) { http_response_code(401); die("Missing credentials"); }

try {
    $stmt = $pdo->prepare("SELECT id, username, password, active, expire_date, max_connections, bouquets FROM users WHERE username = ? AND password = ? LIMIT 1");
    $stmt->execute([$username, $password]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$user) { http_response_code(401); die("Auth Failed"); }
    if ((int)$user['active'] !== 1) { http_response_code(403); die("Account Blocked"); }
    if (!empty($user['expire_date']) && strtotime($user['expire_date']) < time()) { http_response_code(403); die("Account Expired"); }

} catch (Exception $e) { http_response_code(500); die(); }


// =============================================================
// MODO 1: REDIRECIONAMENTO DE STREAM (PLAY)
// =============================================================
if (!empty($stream_id)) {
    
    $real_link = "";
    $monitor_type = "";
    $content_name = "Desconhecido";
    $content_img = "";
    $monitor_id = 0;

    // A) Verifica se é Arquivo de Vídeo (Filme ou Série)
    if (in_array($extension, ['mp4', 'mkv', 'avi'])) {
        
        // 1. Tenta achar em FILMES
        $q = $pdo->prepare("SELECT stream_url, name, cover_url FROM movies WHERE id = ?");
        $q->execute([$stream_id]);
        $res = $q->fetch(PDO::FETCH_ASSOC);
        
        if ($res) {
            $monitor_type = 'movie';
            $monitor_id   = $stream_id;
            $real_link    = $res['stream_url'];
            $content_name = $res['name'];
            $content_img  = $res['cover_url'];
        } else {
            // 2. Tenta achar em EPISÓDIOS (Join para pegar dados da Série)
            $q = $pdo->prepare("SELECT e.stream_url, s.series_id, ser.name as serie_name, ser.cover_url 
                                FROM series_episodes e 
                                JOIN series_seasons s ON e.season_id = s.id 
                                JOIN series ser ON s.series_id = ser.id
                                WHERE e.id = ?");
            $q->execute([$stream_id]);
            $res = $q->fetch(PDO::FETCH_ASSOC);
            
            if ($res) {
                $monitor_type = 'series';
                $monitor_id   = $res['series_id']; // ID da Série para o monitor agrupar
                $real_link    = $res['stream_url'];
                $content_name = $res['serie_name']; // Nome da Série
                $content_img  = $res['cover_url'];
            }
        }

    } else {
        // B) Se não é arquivo, assume que é CANAL (Live)
        $q = $pdo->prepare("SELECT stream_url, name, logo_url FROM channels WHERE id = ?");
        $q->execute([$stream_id]);
        $res = $q->fetch(PDO::FETCH_ASSOC);
        
        if ($res) {
            $monitor_type = 'live';
            $monitor_id   = $stream_id;
            $real_link    = $res['stream_url'];
            $content_name = $res['name'];
            $content_img  = $res['logo_url'];
        }
    }

    // 4. Atualiza Monitor e Redireciona
    if ($real_link) {
        try {
            $user_ip = $_SERVER['REMOTE_ADDR'];
            $ua = $_SERVER['HTTP_USER_AGENT'] ?? 'Unknown';
            $now = time();

            // Limpa conexões travadas deste usuário/IP específico para não duplicar no monitor
            $pdo->prepare("DELETE FROM active_connections WHERE username = ? AND user_ip = ?")->execute([$user['username'], $user_ip]);

            // Insere novo registro completo
            $sql = "INSERT INTO active_connections (username, user_ip, user_agent, content_id, content_name, content_image, stream_type, start_time) 
                    VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
            $pdo->prepare($sql)->execute([$user['username'], $user_ip, $ua, $monitor_id, $content_name, $content_img, $monitor_type, $now]);
            
        } catch (Exception $e) { }

        // Redireciona para o link real
        header("Location: " . $real_link);
        exit;
    } else {
        http_response_code(404); die("Stream Down");
    }
}

// =============================================================
// MODO 2: GERAÇÃO DA LISTA M3U (GET LIST)
// =============================================================
// Se chegou aqui, não tem stream_id, então o cliente quer baixar a lista.

$server_url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]";

// Busca canais permitidos (Lógica de pacotes pode ser adicionada aqui se necessário)
$sql_channels = "SELECT c.id, c.name, c.logo_url, cat.name as cat_name 
                 FROM channels c 
                 LEFT JOIN categories cat ON c.category_id = cat.id 
                 ORDER BY cat.name ASC, c.name ASC";
$channels = $pdo->query($sql_channels)->fetchAll(PDO::FETCH_ASSOC);

header("Content-Type: audio/x-mpegurl");
header("Content-Disposition: attachment; filename=\"lista.m3u\"");

echo "#EXTM3U\n";

// Loop Canais
foreach ($channels as $c) {
    $name = str_replace([',', '"'], '', $c['name']);
    $group = str_replace([',', '"'], '', $c['cat_name']);
    $logo = $c['logo_url'];
    
    // Link apontando para o próprio get.php via .htaccess ou direto
    // Formato: /live/user/pass/id.ts
    $stream_link = "$server_url/live/$username/$password/{$c['id']}.ts";

    echo "#EXTINF:-1 tvg-id=\"\" tvg-name=\"$name\" tvg-logo=\"$logo\" group-title=\"$group\",$name\n";
    echo "$stream_link\n";
}

// Loop Filmes (Opcional - Adicionar se quiser que saia na lista M3U)
// ... código de filmes aqui se necessário ...

exit;
?>
