<?php
/**
 * GESTOR CYBER - API de Autenticação e Entrega M3U
 * Handles: login auth, M3U playlist delivery, token validation
 */

define('GESTOR_CYBER', true);
define('DB_FILE', __DIR__ . '/database.json');

// ─── Cabeçalhos ───────────────────────────────────────────────────────────────
header('Access-Control-Allow-Origin: *');

// ─── Funções de banco de dados ─────────────────────────────────────────────────
function db_read(): array {
    if (!file_exists(DB_FILE)) die(json_encode(['error' => 'Database not found']));
    return json_decode(file_get_contents(DB_FILE), true) ?? [];
}

function db_write(array $data): void {
    file_put_contents(DB_FILE, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}

// ─── Verificação de expiração ──────────────────────────────────────────────────
function is_expired(array $client): bool {
    if (empty($client['expires_at'])) return true;
    return strtotime($client['expires_at']) < time();
}

// ─── Roteamento da API ─────────────────────────────────────────────────────────
$action = $_GET['action'] ?? '';

switch ($action) {

    // ── Autenticação do painel (Ajax login) ─────────────────────────────────
    case 'login':
        $input = json_decode(file_get_contents('php://input'), true) ?? [];
        $username = trim($input['username'] ?? '');
        $password = trim($input['password'] ?? '');

        if (!$username || !$password) {
            http_response_code(400);
            echo json_encode(['success' => false, 'message' => 'Credenciais inválidas']);
            exit;
        }

        $db = db_read();
        $hash = hash('sha256', $password);

        // Verificar admins
        foreach ($db['admins'] ?? [] as $admin) {
            if ($admin['username'] === $username && $admin['password'] === $hash) {
                session_start();
                session_regenerate_id(true);
                $_SESSION['user_id']   = $admin['id'];
                $_SESSION['username']  = $admin['username'];
                $_SESSION['role']      = 'admin';
                $_SESSION['logged_in'] = true;
                echo json_encode(['success' => true, 'role' => 'admin']);
                exit;
            }
        }

        // Verificar revendedores
        foreach ($db['resellers'] ?? [] as $reseller) {
            if ($reseller['username'] === $username && $reseller['password'] === $hash) {
                if (($reseller['status'] ?? 'active') !== 'active') {
                    echo json_encode(['success' => false, 'message' => 'Conta bloqueada']);
                    exit;
                }
                session_start();
                session_regenerate_id(true);
                $_SESSION['user_id']   = $reseller['id'];
                $_SESSION['username']  = $reseller['username'];
                $_SESSION['role']      = 'reseller';
                $_SESSION['logged_in'] = true;
                echo json_encode(['success' => true, 'role' => 'reseller']);
                exit;
            }
        }

        http_response_code(401);
        echo json_encode(['success' => false, 'message' => 'Usuário ou senha incorretos']);
        break;

    // ── Entrega da lista M3U (por usuário/senha do cliente) ─────────────────
    case 'get':
        $username = $_GET['username'] ?? '';
        $password = $_GET['password'] ?? '';
        $type     = $_GET['type'] ?? 'm3u_plus';

        if (!$username || !$password) {
            http_response_code(400);
            echo "Parâmetros inválidos";
            exit;
        }

        $db   = db_read();
        $hash = hash('sha256', $password);
        $found = null;

        foreach ($db['clients'] ?? [] as $client) {
            if ($client['username'] === $username && $client['password'] === $hash) {
                $found = $client;
                break;
            }
        }

        if (!$found) {
            http_response_code(401);
            echo "Usuário não encontrado";
            exit;
        }

        if (($found['status'] ?? 'active') !== 'active') {
            http_response_code(403);
            echo "Conta bloqueada";
            exit;
        }

        // Verificar expiração (com tolerância de renovação de confiança)
        if (is_expired($found)) {
            // Verificar se ainda está no período de renovação de confiança
            $config = $db['config'] ?? [];
            $trust_days = (int)($config['trust_renewal_days'] ?? 2);
            $trust_end  = strtotime($found['expires_at']) + ($trust_days * 86400);

            if (time() > $trust_end) {
                http_response_code(403);
                echo "Assinatura expirada. Entre em contato com seu revendedor.";
                exit;
            }
        }

        // Buscar fonte M3U ativa
        $sources = $db['sources'] ?? [];
        if (empty($sources)) {
            http_response_code(503);
            echo "Nenhuma fonte disponível";
            exit;
        }

        // Escolher fonte ativa
        $active_source = null;
        foreach ($sources as $src) {
            if (($src['status'] ?? 'active') === 'active') {
                $active_source = $src;
                break;
            }
        }

        if (!$active_source) {
            http_response_code(503);
            echo "Nenhuma fonte ativa";
            exit;
        }

        // Fetch M3U da fonte master
        $m3u_url  = $active_source['url'];
        $m3u_user = $active_source['username'] ?? '';
        $m3u_pass = $active_source['password'] ?? '';

        // Montar URL com credenciais se necessário
        if ($m3u_user && $m3u_pass) {
            $parsed = parse_url($m3u_url);
            $base = ($parsed['scheme'] ?? 'http') . '://' . ($parsed['host'] ?? '') . ':' . ($parsed['port'] ?? 80);
            $fetch_url = "$base/get.php?username=$m3u_user&password=$m3u_pass&type=$type";
        } else {
            $fetch_url = $m3u_url;
        }

        // Filtrar conteúdo adulto se não habilitado
        $allow_adult = ($found['adult_content'] ?? false) === true;

        // Entrega direta (proxy)
        header('Content-Type: application/x-mpegURL');
        header('Content-Disposition: attachment; filename="playlist.m3u"');

        $ctx = stream_context_create(['http' => ['timeout' => 15]]);
        $content = @file_get_contents($fetch_url, false, $ctx);

        if ($content === false) {
            http_response_code(502);
            echo "Erro ao buscar lista da fonte";
            exit;
        }

        // Filtrar adulto se necessário
        if (!$allow_adult) {
            $lines  = explode("\n", $content);
            $output = [];
            $skip   = false;

            foreach ($lines as $line) {
                $lower = strtolower($line);
                if (str_starts_with($line, '#EXTINF')) {
                    $skip = (
                        str_contains($lower, 'adult') ||
                        str_contains($lower, 'xxx') ||
                        str_contains($lower, '+18') ||
                        str_contains($lower, 'erotic')
                    );
                    if (!$skip) $output[] = $line;
                } elseif ($skip && !str_starts_with($line, '#')) {
                    $skip = false; // próxima entrada
                } elseif (!$skip) {
                    $output[] = $line;
                }
            }
            echo implode("\n", $output);
        } else {
            echo $content;
        }
        break;

    // ── Status do cliente (para apps) ───────────────────────────────────────
    case 'status':
        header('Content-Type: application/json');
        $username = $_GET['username'] ?? '';
        $password = $_GET['password'] ?? '';

        if (!$username || !$password) {
            echo json_encode(['status' => 'error', 'message' => 'Parâmetros inválidos']);
            exit;
        }

        $db   = db_read();
        $hash = hash('sha256', $password);

        foreach ($db['clients'] ?? [] as $client) {
            if ($client['username'] === $username && $client['password'] === $hash) {
                $expired = is_expired($client);
                echo json_encode([
                    'status'      => $client['status'] ?? 'active',
                    'username'    => $client['username'],
                    'expires_at'  => $client['expires_at'] ?? null,
                    'expired'     => $expired,
                    'connections' => $client['max_connections'] ?? 1,
                    'adult'       => $client['adult_content'] ?? false,
                ]);
                exit;
            }
        }

        echo json_encode(['status' => 'not_found']);
        break;

    // ── Limpar cache M3U ─────────────────────────────────────────────────────
    case 'clear_cache':
        session_start();
        header('Content-Type: application/json');
        if (!isset($_SESSION['logged_in']) || $_SESSION['role'] !== 'admin') {
            echo json_encode(['success' => false, 'message' => 'Não autorizado']);
            exit;
        }
        $pattern = sys_get_temp_dir() . '/gestor_m3u_*.cache';
        $files   = glob($pattern);
        $deleted = 0;
        if ($files) {
            foreach ($files as $f) {
                if (@unlink($f)) $deleted++;
            }
        }
        echo json_encode(['success' => true, 'deleted' => $deleted]);
        break;

    // ── Logout ───────────────────────────────────────────────────────────────
    case 'logout':
        session_start();
        session_destroy();
        echo json_encode(['success' => true]);
        break;

    default:
        http_response_code(400);
        header('Content-Type: application/json');
        echo json_encode(['error' => 'Ação inválida']);
}
