<?php
//<----------------------------------------------------------->
//<-------------------COPIA AI BRUXÃO------------------------->
//<-------------CONTATO: https://t.me/eonbry------------------>
//<-------------DEVELOPER: EMANUEL NASCIMENTO----------------->
//<----------------------------------------------------------->

date_default_timezone_set('America/Sao_Paulo');
error_reporting(0);
const ALLOWED_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

// ============================================
// FUNÇÃO DE DEBUG - DA PRIMEIRA VERSÃO (COMPLETA)
// ============================================
function logDebug($message, $mac_address = '') {
    $log_file = './debug_notifications.log';
    $timestamp = date('Y-m-d H:i:s');
    $mac_info = $mac_address ? " [MAC: $mac_address]" : "";
    $log_message = "[$timestamp]$mac_info: $message\n";
    
    // ADICIONADO: Sistema de rotação de logs (da primeira versão)
    if (file_exists($log_file) && filesize($log_file) > 100000) {
        // Mantém apenas as últimas 100 linhas
        $lines = file($log_file);
        $last_lines = array_slice($lines, -100);
        file_put_contents($log_file, implode('', $last_lines));
    }
    
    file_put_contents($log_file, $log_message, FILE_APPEND);
}

// ============================================
// ✅✅✅ DETECÇÃO SIMPLES DE PING (DA VERSÃO QUE FUNCIONA)
// ============================================
$post_raw = file_get_contents('php://input');

// Se for um ping simples (começa com "ping=")
if (strpos($post_raw, 'ping=') === 0) {
    // Extrair o MAC (que está em Base64!)
    $base64_mac = str_replace('ping=', '', $post_raw);
    
    // Decodificar Base64 para obter o MAC real
    $mac_raw = base64_decode($base64_mac);
    
    if ($mac_raw) {
        // Converter para formato com dois-pontos
        $mac_address = chunk_split($mac_raw, 2, ':');
        $mac_address = rtrim($mac_address, ':');
        $mac_address = strtolower($mac_address);
        
        logDebug("🏓 PING RECEBIDO: $mac_address");
        
        // Registrar no banco (igual ao updateConnectionLog)
        $db_path = __DIR__ . '/api/.adb.db';
        if (file_exists($db_path)) {
            $db = new SQLite3($db_path);
            $current_date = date('Y-m-d H:i:s');
            $mac_clean = strtolower(str_replace(':', '', $mac_address));
            $ip_address = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
            $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
            
            // Verificar se a tabela connections existe
            $table_check = $db->query("SELECT name FROM sqlite_master WHERE type='table' AND name='connections'");
            if (!$table_check->fetchArray()) {
                // Criar tabela se não existir
                $db->exec("CREATE TABLE IF NOT EXISTS connections (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    mac_address TEXT UNIQUE,
                    ip_address TEXT,
                    user_agent TEXT,
                    last_seen DATETIME,
                    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
                )");
            }
            
            try {
                $stmt = $db->prepare("
                    INSERT OR REPLACE INTO connections 
                    (mac_address, ip_address, user_agent, last_seen) 
                    VALUES (:mac, :ip, :ua, :last_seen)
                ");
                
                $stmt->bindValue(':mac', $mac_clean, SQLITE3_TEXT);
                $stmt->bindValue(':ip', $ip_address, SQLITE3_TEXT);
                $stmt->bindValue(':ua', $user_agent, SQLITE3_TEXT);
                $stmt->bindValue(':last_seen', $current_date, SQLITE3_TEXT);
                
                $stmt->execute();
                logDebug("✅ PING REGISTRADO: $mac_clean | IP: $ip_address | $current_date");
                
            } catch (Exception $e) {
                logDebug("❌ Erro ao registrar PING: " . $e->getMessage());
            }
        }
    }
    
    // Responder algo simples (MESMO DA VERSÃO QUE FUNCIONA!)
    echo "PING_OK";
    exit();
}

// ============================================
// ✅✅✅ FUNÇÃO PARA FAZER TESTE AUTOMÁTICO (ADICIONADA)
// ============================================
function fazerTesteAutomatico($username, $password, $dns, $mac_address) {
    logDebug("=== INICIANDO TESTE AUTOMÁTICO PARA: $username ===", $mac_address);
    
    if (empty($dns) || empty($username) || empty($password)) {
        logDebug("❌ Dados insuficientes para teste automático", $mac_address);
        return false;
    }
    
    $url_teste = $dns . "/player_api.php?username=" . $username . "&password=" . $password;
    logDebug("URL do teste: $url_teste", $mac_address);
    
    // Tenta fazer a requisição
    $context = stream_context_create([
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
        'http' => [
            'timeout' => 10,
            'ignore_errors' => true
        ]
    ]);
    
    try {
        $response = @file_get_contents($url_teste, false, $context);
        
        if ($response === false) {
            logDebug("❌ Não conseguiu acessar a URL do teste", $mac_address);
            return false;
        }
        
        $data = json_decode($response, true);
        
        if (json_last_error() !== JSON_ERROR_NONE) {
            logDebug("❌ Resposta não é JSON válido", $mac_address);
            return false;
        }
        
        // Verifica se a conta está ativa
        if (isset($data['user_info']['status']) && $data['user_info']['status'] == 'Active') {
            logDebug("✅✅✅ TESTE AUTOMÁTICO BEM SUCEDIDO! Conta ATIVA", $mac_address);
            
            // Log de informações da conta
            if (isset($data['user_info']['username'])) {
                logDebug("📋 Info conta: Usuário=" . $data['user_info']['username'], $mac_address);
            }
            if (isset($data['user_info']['exp_date'])) {
                logDebug("📋 Info conta: Expira=" . $data['user_info']['exp_date'], $mac_address);
            }
            if (isset($data['user_info']['active_cons'])) {
                logDebug("📋 Info conta: Conexões ativas=" . $data['user_info']['active_cons'], $mac_address);
            }
            
            return true;
        } else {
            logDebug("❌ TESTE FALHOU: Conta INATIVA ou status inválido", $mac_address);
            return false;
        }
        
    } catch (Exception $e) {
        logDebug("❌ Erro durante teste automático: " . $e->getMessage(), $mac_address);
        return false;
    }
}

// ============================================
// FUNÇÕES ORIGINAIS - DA PRIMEIRA VERSÃO (MANTIDAS)
// ============================================
function getDecodedString($str) {
    $encryptKeyPosition = getEncryptKeyPosition(substr($str, -2, 1));
    $encryptKeyPosition2 = getEncryptKeyPosition(substr($str, -1));
    $substring = substr($str, 0, -2);
    return trim(utf8_decode(base64_decode(substr($substring, 0, $encryptKeyPosition) . substr($substring, $encryptKeyPosition + $encryptKeyPosition2))));
}

function getEncryptKeyPosition($str) {
    return strpos(ALLOWED_CHARACTERS, $str);
}

function getEncodedString($str) {
    $encryptKeyPosition = getEncryptKeyPosition(substr($str, -2, 1));
    $encryptKeyPosition2 = getEncryptKeyPosition(substr($str, -1));
    $encodedString = base64_encode(utf8_encode($str));
    $substring = substr($encodedString, 0, $encryptKeyPosition) . substr($encodedString, $encryptKeyPosition + $encryptKeyPosition2);
    return $substring . substr(ALLOWED_CHARACTERS, $encryptKeyPosition, 1) . substr(ALLOWED_CHARACTERS, $encryptKeyPosition2, 1);
}

function themes(){
    // ADICIONADO: Logs da primeira versão
    logDebug("=== FUNÇÃO THEMES() INICIADA ===");
    
    $db = new SQLite3('./.eggziedb.db');
    
    // LOG: Verificar conexão
    if (!$db) {
        logDebug("❌ ERRO: Não conseguiu conectar ao banco");
        $themes = [
            ['name' => 'theme_d', 'url' => './themes/theme_d.apk']
        ];
        return json_encode($themes);
    }
    
    // LOG: Verificar se a tabela existe
    $tableCheck = $db->query("SELECT name FROM sqlite_master WHERE type='table' AND name='theme'");
    if ($tableRow = $tableCheck->fetchArray()) {
        logDebug("✅ Tabela 'theme' existe: " . $tableRow['name']);
    } else {
        logDebug("❌ Tabela 'theme' NÃO existe");
        $themes = [
            ['name' => 'theme_d', 'url' => './themes/theme_d.apk']
        ];
        return json_encode($themes);
    }
    
    // LOG: Contar registros
    $countQuery = $db->query("SELECT COUNT(*) as total FROM theme");
    $countResult = $countQuery->fetchArray();
    logDebug("Total de temas na tabela: " . $countResult['total']);
    
    $themes = [];
    $themes_query = $db->query('SELECT * FROM theme');
    
    // LOG: Verificar se query funcionou
    if (!$themes_query) {
        logDebug("❌ ERRO na query SELECT: " . $db->lastErrorMsg());
    } else {
        logDebug("✅ Query SELECT executada com sucesso");
    }
    
    while ($theme_row = $themes_query->fetchArray()) {
        logDebug("✅ Tema encontrado: name=" . $theme_row['name'] . ", url=" . $theme_row['url']);
        $themes[] = ['name' => $theme_row['name'], 'url' => $theme_row['url']];
    }
    
    // LOG: Verificar array final
    logDebug("Array themes final: " . print_r($themes, true));
    
    $result = json_encode($themes);
    logDebug("JSON resultante: " . $result);
    
    if (json_last_error() !== JSON_ERROR_NONE) {
        logDebug("❌ ERRO no json_encode: " . json_last_error_msg());
        $themes = [
            ['name' => 'theme_d', 'url' => './themes/theme_d.apk']
        ];
        return json_encode($themes);
    }
    
    logDebug("=== FUNÇÃO THEMES() FINALIZADA ===");
    return $result;
}

function loadIbo(){
    logDebug("=== FUNÇÃO LOADIBO() INICIADA ===");
    
    // Caminho do arquivo JSON
    $json_file = './ibo.json';
    $json_file_absolute = __DIR__ . '/ibo.json';
    
    // Usa o caminho que existe
    if (file_exists($json_file)) {
        $app_info_json = file_get_contents($json_file);
    } elseif (file_exists($json_file_absolute)) {
        $app_info_json = file_get_contents($json_file_absolute);
    } else {
        logDebug("❌ ERRO: Arquivo ibo.json não encontrado em nenhum caminho!");
        return array(
            'android_version_code' => '1.0',
            'apk_url' => '',
            'app_url' => '',
            'changelog' => '',
            'mandatory' => false,
            'release_date' => date('Y-m-d')
        );
    }
    
    logDebug("Conteúdo bruto do ibo.json: " . $app_info_json);
    
    $app_info = json_decode($app_info_json, true);
    
    if (json_last_error() !== JSON_ERROR_NONE) {
        logDebug("❌ ERRO ao decodificar JSON: " . json_last_error_msg());
        return array(
            'android_version_code' => '1.0',
            'apk_url' => '',
            'app_url' => '',
            'changelog' => '',
            'mandatory' => false,
            'release_date' => date('Y-m-d')
        );
    }
    
    logDebug("Array decodificado: " . print_r($app_info, true));
    
    // Verifica se a estrutura está correta (com app_info)
    if (isset($app_info['app_info'])) {
        logDebug("✅ Estrutura com 'app_info' encontrada");
        $data = $app_info['app_info'];
    } else {
        logDebug("⚠️ Estrutura sem 'app_info', usando estrutura direta");
        $data = $app_info;
    }
    
    // Extrai os dados com valores padrão
    $android_version_code = $data['android_version_code'] ?? '1.0';
    $apk_url = $data['apk_url'] ?? '';
    
    // Para debug, mostra o que foi extraído
    logDebug("✅ Versão extraída: " . $android_version_code);
    logDebug("✅ URL APK extraída: " . $apk_url);
    logDebug("✅ URL App (igual APK): " . $apk_url);
    
    // Verifica se a URL está vazia
    if (empty($apk_url)) {
        logDebug("⚠️ ATENÇÃO: URL do APK está vazia!");
    }
    
    $result = array(
        'android_version_code' => $android_version_code,
        'apk_url' => $apk_url,
        'app_url' => $apk_url, // IMPORTANTE: ambos são iguais
        'changelog' => $data['changelog'] ?? '',
        'mandatory' => $data['mandatory'] ?? false,
        'release_date' => $data['release_date'] ?? date('Y-m-d')
    );
    
    logDebug("Resultado final: " . print_r($result, true));
    logDebug("=== FUNÇÃO LOADIBO() FINALIZADA ===");
    
    return $result;
}

// ============================================
// FUNÇÃO lang() - DA PRIMEIRA VERSÃO
// ============================================
function lang(){
    $language_json = file_get_contents('./language.json');
    return $language_json;
}

// ============================================
// FUNÇÃO note() - DA PRIMEIRA VERSÃO (Notificação Universal)
// ============================================
function note(){
    logDebug("=== VERIFICANDO NOTIFICAÇÃO UNIVERSAL ===");
    
    $note_json_file = './note.json';
    
    if (file_exists($note_json_file)) {
        $file_content = file_get_contents($note_json_file);
        $note_data = json_decode($file_content, true);
        
        logDebug("Conteúdo do note.json: " . $file_content);
        
        if (json_last_error() !== JSON_ERROR_NONE) {
            logDebug("ERRO JSON no note.json: " . json_last_error_msg());
            return null;
        }
        
        // Verifica se a notificação universal está ativada e tem conteúdo
        if (isset($note_data['enabled']) && $note_data['enabled'] === true &&
            !empty($note_data['title']) && !empty($note_data['content'])) {
            logDebug("✓ NOTIFICAÇÃO UNIVERSAL ATIVA ENCONTRADA");
            return $note_data;
        } else {
            logDebug("✗ Notificação universal DESATIVADA ou sem conteúdo");
            return null;
        }
    } else {
        logDebug("✗ Arquivo note.json não encontrado");
        return null;
    }
}

// ============================================
// FUNÇÃO getIndividualNotification - DA PRIMEIRA VERSÃO
// ============================================
function getIndividualNotification($mac_address) {
    logDebug("=== BUSCANDO NOTIFICAÇÃO INDIVIDUAL ===", $mac_address);
    
    // Primeiro, normaliza o MAC address
    $mac_address = strtolower($mac_address);
    logDebug("MAC normalizado: $mac_address", $mac_address);
    
    // **CORREÇÃO: getappuser.php está em a/, então json/ está no mesmo diretório!**
    $json_dir = './json/';
    $json_dir_absolute = __DIR__ . '/json/';
    
    logDebug("Caminho relativo: $json_dir", $mac_address);
    logDebug("Caminho absoluto: $json_dir_absolute", $mac_address);
    logDebug("Diretório atual (__DIR__): " . __DIR__, $mac_address);
    
    // Verifica qual caminho existe
    if (!file_exists($json_dir) && !file_exists($json_dir_absolute)) {
        logDebug("❌ ERRO: Pasta 'json/' não encontrada em nenhum caminho!", $mac_address);
        
        // Lista o que existe no diretório atual
        $current_dir = __DIR__;
        $contents = scandir($current_dir);
        logDebug("Conteúdo do diretório atual ($current_dir): " . implode(', ', $contents), $mac_address);
        
        return null;
    }
    
    // Usa o caminho que existe
    $json_dir = file_exists($json_dir) ? $json_dir : $json_dir_absolute;
    logDebug("✅ Usando pasta: $json_dir", $mac_address);
    
    // Verifica múltiplos formatos possíveis
    $possible_filenames = [];
    
    // Formato 1: MAC com dois-pontos -> substitui por underscore
    $clean_mac1 = str_replace(':', '_', $mac_address);
    $possible_filenames[] = $clean_mac1 . '.json';
    
    // Formato 2: MAC sem dois-pontos
    $clean_mac2 = str_replace(':', '', $mac_address);
    $possible_filenames[] = $clean_mac2 . '.json';
    
    // Remove duplicados
    $possible_filenames = array_unique($possible_filenames);
    
    logDebug("Formatos a procurar: " . implode(', ', $possible_filenames), $mac_address);
    
    // Listar TODOS os arquivos na pasta json/
    $all_files = scandir($json_dir);
    logDebug("Todos os arquivos em $json_dir: " . implode(', ', $all_files), $mac_address);
    
    // Procurar pelos arquivos específicos
    foreach ($possible_filenames as $filename) {
        $filepath = $json_dir . $filename;
        
        logDebug("Procurando arquivo: $filename", $mac_address);
        logDebug("Caminho completo: $filepath", $mac_address);
        
        if (file_exists($filepath)) {
            logDebug("✅✅✅ ARQUIVO ENCONTRADO: $filename", $mac_address);
            
            $file_content = file_get_contents($filepath);
            logDebug("Conteúdo do arquivo: " . $file_content, $mac_address);
            
            $notification_data = json_decode($file_content, true);
            
            if (json_last_error() !== JSON_ERROR_NONE) {
                logDebug("❌ ERRO JSON: " . json_last_error_msg(), $mac_address);
                continue;
            }
            
            logDebug("✅ Dados decodificados: " . print_r($notification_data, true), $mac_address);
            
            // Verifica se a notificação está ativa
            if (isset($notification_data['enabled']) && $notification_data['enabled'] === true) {
                logDebug("✅✅✅ NOTIFICAÇÃO INDIVIDUAL ATIVA ENCONTRADA!", $mac_address);
                return $notification_data;
            } else {
                logDebug("❌ Notificação DESATIVADA (enabled: false)", $mac_address);
                return null;
            }
        } else {
            logDebug("❌ Arquivo NÃO encontrado: $filename", $mac_address);
        }
    }
    
    logDebug("❌ NENHUMA notificação individual encontrada", $mac_address);
    return null;
}

// ============================================
// FUNÇÃO getUserData - VERSÃO CORRIGIDA COM TESTE AUTOMÁTICO
// ============================================
function getUserData($mac_address){
    // ============================================
// ✅ VERIFICAÇÃO DO MODO TESTE (ADICIONAR AQUI)
// ============================================
$trial_mode_file = __DIR__ . '/../trial_mode';
$modo_teste_ativo = false;

if (file_exists($trial_mode_file)) {
    $conteudo = trim(file_get_contents($trial_mode_file));
    $modo_teste_ativo = ($conteudo === 'trial');
}
    $db = new SQLite3('./.eggziedb.db');
    $mac_address = strtolower($mac_address);
    
    // Primeiro verifica se o MAC já existe
    $check_query = $db->query('SELECT * FROM ibo WHERE LOWER(mac_address)="' . $mac_address . '"');
    $ibo_row = $check_query->fetchArray();
    
    // Se o MAC não existe no banco, cadastra automaticamente
    if (!$ibo_row) {
        logDebug("⚠️ MAC NÃO ENCONTRADO NO BANCO. CADASTRANDO AUTOMATICAMENTE...", $mac_address);
        
        // Verifica a estrutura da tabela primeiro
        $table_info = $db->query("PRAGMA table_info(ibo)");
        $columns = [];
        while ($col = $table_info->fetchArray()) {
            $columns[] = $col['name'];
        }
        logDebug("Colunas da tabela ibo: " . implode(', ', $columns), $mac_address);
        
        // ✅✅✅ DADOS REAIS PARA TESTE AUTOMÁTICO
        // Lê dados do painel (app_url e app_dns)
        $url_server = @file_get_contents("../app_url");
        $dns = @file_get_contents("../app_dns");
        
        // Gera dados para o teste
        $test_id = "test_" . substr(str_replace(':', '', $mac_address), -8);
        $test_username = $test_id;
        $test_password = substr(md5($mac_address . time()), 0, 10);
        
        // Data de expiração (TESTE DE 1 DIA)
        $default_expire_date = date('Y-m-d', strtotime('+1 day'));
        
        // URL da playlist
        $default_url = $dns . "/get.php?username=" . $test_username . "&password=" . $test_password . "&type=m3u_plus&output=ts";
        
        // Tenta criar a conta no painel IPTV
        if ($modo_teste_ativo && !empty($url_server) && !empty($dns)) {
            logDebug("✅ URL do painel encontrada: $url_server", $mac_address);
            logDebug("✅ DNS encontrado: $dns", $mac_address);
            
            // Monta JSON para criar conta
            $json = '{"receiveMessageAppId":"com.whatsapp","receiveMessagePattern":["*"],"senderName":"API DE CADASTRO","groupName":"","senderMesage":"api_cadastro","senderMessage":"api_cadastro","messageDateTime":' . time() . ',"isMessageFromGroup":false}';
            
            $ch = curl_init($url_server);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36');
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Content-Type: application/json',
                'Content-Length: ' . strlen($json),
            ]);
            curl_setopt($ch, CURLOPT_TIMEOUT, 15);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            
            $jsonRetorno = json_decode(curl_exec($ch), true);
            
            if (curl_errno($ch)) {
                logDebug("❌ Erro cURL: " . curl_error($ch), $mac_address);
            }
            
            curl_close($ch);
            
            // Verifica retorno
            $username = null;
            $password = null;
            
            // Retorno do painel Qpanel
            if (isset($jsonRetorno['username']) && isset($jsonRetorno['password'])) {
                $username = $jsonRetorno['username'];
                $password = $jsonRetorno['password'];
                logDebug("✅✅✅ CONTA CRIADA NO PAINEL: $username / $password", $mac_address);
            }
            // Retorno de outros painéis
            elseif (isset($jsonRetorno['data'][0]['message'])) {
                $user_pass = explode("|", $jsonRetorno['data'][0]['message']);
                if (isset($user_pass[0]) && isset($user_pass[1])) {
                    $username = $user_pass[0];
                    $password = $user_pass[1];
                    logDebug("✅✅✅ CONTA CRIADA (outro painel): $username / $password", $mac_address);
                }
            }
            
            // Se conseguiu criar conta no painel, usa esses dados
            if (!empty($username) && !empty($password)) {
                $test_username = $username;
                $test_password = $password;
                $default_url = $dns . "/get.php?username=" . $username . "&password=" . $password . "&type=m3u_plus&output=ts";
                $default_title = "NOVO*** (TESTE CADASTRADO)";
                
                // ✅✅✅ FAZ TESTE AUTOMÁTICO
                logDebug("🔍 INICIANDO TESTE AUTOMÁTICO DA CONTA...", $mac_address);
                if (fazerTesteAutomatico($test_username, $test_password, $dns, $mac_address)) {
                    $default_title = "NOVO*** (TESTE OK)";
                    logDebug("✅✅✅ TESTE AUTOMÁTICO BEM SUCEDIDO!", $mac_address);
                } else {
                    $default_title = "IBO NOTE IPTV";
                    logDebug("⚠️ TESTE AUTOMÁTICO FALHOU, mas conta criada", $mac_address);
                }
            } else {
                $default_title = "NOVO*** (SEM PAINEL)";
                logDebug("⚠️ Não conseguiu criar conta no painel IPTV", $mac_address);
            }
        } else {
            $default_title = "NOVO*** (SEM DNS)";
            logDebug("❌ Arquivos app_url ou app_dns não encontrados", $mac_address);
        }
        
        // Tenta inserir o novo registro
        try {
            $stmt = $db->prepare("INSERT INTO ibo (mac_address, title, username, password, url, expire_date) 
                                  VALUES (:mac, :title, :user, :pass, :url, :expire)");
            
            $stmt->bindValue(':mac', $mac_address, SQLITE3_TEXT);
            $stmt->bindValue(':title', $default_title, SQLITE3_TEXT);
            $stmt->bindValue(':user', $test_username, SQLITE3_TEXT);
            $stmt->bindValue(':pass', $test_password, SQLITE3_TEXT);
            $stmt->bindValue(':url', $default_url, SQLITE3_TEXT);
            $stmt->bindValue(':expire', $default_expire_date, SQLITE3_TEXT);
            
            $result = $stmt->execute();
            
            if ($result) {
                logDebug("✅✅✅ NOVO MAC CADASTRADO COM SUCESSO!", $mac_address);
                logDebug("Dados cadastrados: Título=$default_title, User=$test_username, Expira=$default_expire_date", $mac_address);
                
                // Busca os dados recém-cadastrados
                $ibo_query = $db->query('SELECT * FROM ibo WHERE LOWER(mac_address)="' . $mac_address . '"');
                $ibo_row = $ibo_query->fetchArray();
            } else {
                logDebug("❌ FALHA AO CADASTRAR NOVO MAC", $mac_address);
            }
        } catch (Exception $e) {
            logDebug("❌ ERRO AO CADASTRAR MAC: " . $e->getMessage(), $mac_address);
        }
    } else {
        logDebug("✅ MAC já existe no banco de dados", $mac_address);
        
        // Se já existe, também pode fazer teste automático para verificar status
        if (!empty($ibo_row['username']) && !empty($ibo_row['password']) && !empty($ibo_row['url'])) {
            // Extrai DNS da URL
            $url_parts = parse_url($ibo_row['url']);
            if (isset($url_parts['host'])) {
                $dns = $url_parts['host'];
                // Verifica status da conta existente
                fazerTesteAutomatico($ibo_row['username'], $ibo_row['password'], $dns, $mac_address);
            }
        }
    }
    
    // Agora busca os dados (seja o existente ou o recém-cadastrado)
    $ibo_query = $db->query('SELECT * FROM ibo WHERE LOWER(mac_address)="' . $mac_address . '"');
    $ibo_row = $ibo_query->fetchArray();
    
    $urls = [];
    $expire_date = "";
    
    if ($ibo_row) {
        // VERIFICAÇÃO IMPORTANTE: O URL já vem completo do banco?
        // Se o campo 'url' no banco já tiver o endpoint completo, usa diretamente
        $playlist_url = $ibo_row['url'];
        
        // Se o URL não tiver parâmetros, adiciona os parâmetros padrão
        if (strpos($playlist_url, '?') === false) {
            $playlist_url = $ibo_row['url']."/get.php?username=".$ibo_row['username']."&password=".$ibo_row['password']."&type=m3u_plus&output=ts";
        }
        
        // LOG PARA DEBUG
        logDebug("URL do banco: " . $ibo_row['url'], $mac_address);
        logDebug("URL final da playlist: " . $playlist_url, $mac_address);
        
        $urls[] = [
            'is_protected' => "1", 
            'id' => md5($ibo_row['password'] . $ibo_row['id']), 
            'url' => $playlist_url, 
            'name' => $ibo_row['title'], 
            'created_at' => '2023-04-15 00:06:09',
            'updated_at' => '2023-04-15 00:06:09'
        ];
        $expire_date = $ibo_row['expire_date'];
    }
    
    return [
        'urls' => json_encode($urls),
        'expire_date' => $expire_date
    ];
}

// ============================================
// FUNÇÃO escapeUrl - DA PRIMEIRA VERSÃO
// ============================================
function escapeUrl($url) {
    return addcslashes($url, '/\\');
}

// ============================================
// ✅✅✅ FUNÇÃO updateConnectionLog - DA VERSÃO QUE FUNCIONA
// ============================================
function updateConnectionLog($mac_address, $ip_address = '', $user_agent = '') {
    $db_path = '../api/.adb.db';
    $db_path_absolute = __DIR__ . '/api/.adb.db';
    
    // Verificar qual caminho existe
    if (!file_exists($db_path) && !file_exists($db_path_absolute)) {
        logDebug("❌ Banco API não encontrado em nenhum caminho", $mac_address);
        return false;
    }
    
    $db = new SQLite3(file_exists($db_path) ? $db_path : $db_path_absolute);
    $current_date = date('Y-m-d H:i:s');
    $mac_clean = strtolower(str_replace(':', '', $mac_address));
    
    // Verificar se a tabela connections existe
    $table_check = $db->query("SELECT name FROM sqlite_master WHERE type='table' AND name='connections'");
    if (!$table_check->fetchArray()) {
        // Criar tabela se não existir
        $db->exec("CREATE TABLE IF NOT EXISTS connections (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            mac_address TEXT UNIQUE,
            ip_address TEXT,
            user_agent TEXT,
            last_seen DATETIME,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )");
        logDebug("✅ Tabela 'connections' criada", $mac_address);
    }
    
    try {
        $stmt = $db->prepare("
            INSERT OR REPLACE INTO connections 
            (mac_address, ip_address, user_agent, last_seen) 
            VALUES (:mac, :ip, :ua, :last_seen)
        ");
        
        $stmt->bindValue(':mac', $mac_clean, SQLITE3_TEXT);
        $stmt->bindValue(':ip', $ip_address, SQLITE3_TEXT);
        $stmt->bindValue(':ua', $user_agent, SQLITE3_TEXT);
        $stmt->bindValue(':last_seen', $current_date, SQLITE3_TEXT);
        
        $result = $stmt->execute();
        logDebug("✅ Conexão registrada: $mac_clean | IP: $ip_address | $current_date", $mac_address);
        return true;
        
    } catch (Exception $e) {
        logDebug("❌ Erro ao registrar conexão: " . $e->getMessage(), $mac_address);
        return false;
    }
}

// ============================================
// PROCESSAMENTO PRINCIPAL - PARA REQUISIÇÕES NORMAIS
// ============================================
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    
    logDebug("=== NOVA REQUISIÇÃO RECEBIDA ===");
    logDebug("RAW POST data: " . file_get_contents('php://input'));
    
    $post_data = file_get_contents('php://input');
    $db = new SQLite3('./.eggziedb.db');
    
    $json_data = json_decode($post_data);
    if (!$json_data) {
        logDebug("❌ JSON inválido");
        exit;
    }
    
    $json_data = $json_data->data;
    $json_data_decoded = getDecodedString($json_data);
    logDebug("JSON decodificado: " . $json_data_decoded);
    
    $json_data = json_decode($json_data_decoded, true);
    $mac_address_raw = getDecodedString($json_data['app_device_id']);
    logDebug("MAC raw: " . $mac_address_raw);
    
    $mac_address = chunk_split($mac_address_raw, 2, ':');
    $mac_address = rtrim($mac_address, ':');
    $mac_address = strtolower($mac_address);
    
    logDebug("MAC final: " . $mac_address);
    
    // ✅✅✅ REGISTRAR CONEXÃO (FUNÇÃO QUE FUNCIONA)
    $ip_address = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    updateConnectionLog($mac_address, $ip_address, $user_agent);
    
    $expire_date = "";
    
    $ibo_data = loadIbo();
    
    // Agora a função getUserData já cadastra automaticamente se não existir
    $result = getUserData($mac_address);
    
    $userData = $result['urls'];
    
    logDebug("Usuário tem dados? " . ($userData !== "[]" ? "SIM" : "NÃO"), $mac_address);
    
    // NOVO: Verificar notificações
    $individual_notification = getIndividualNotification($mac_address);
    $universal_notification = note();
    
    // DEBUG: Mostrar o que foi encontrado
    if ($individual_notification !== null) {
        logDebug("✓ Notificação INDIVIDUAL encontrada", $mac_address);
        logDebug("Título individual: " . $individual_notification['title'], $mac_address);
    } else {
        logDebug("✗ Nenhuma notificação individual", $mac_address);
    }
    
    if ($universal_notification !== null) {
        logDebug("✓ Notificação UNIVERSAL encontrada", $mac_address);
        logDebug("Título universal: " . $universal_notification['title'], $mac_address);
    } else {
        logDebug("✗ Nenhuma notificação universal", $mac_address);
    }
    
    // Decidir qual notificação usar
    $notification_to_send = null;
    
    // 1. Primeiro verifica individual
    if ($individual_notification !== null) {
        $notification_to_send = $individual_notification;
        logDebug("✓ USANDO NOTIFICAÇÃO INDIVIDUAL", $mac_address);
    } 
    // 2. Se não tem individual, verifica universal
    elseif ($universal_notification !== null) {
        $notification_to_send = $universal_notification;
        logDebug("✓ USANDO NOTIFICAÇÃO UNIVERSAL", $mac_address);
    }
    else {
        logDebug("✗ NENHUMA notificação para enviar", $mac_address);
    }
    
    // Construir parte do JSON da notificação
    $notification_field = '';
    if ($notification_to_send !== null) {
        // Verifica se a notificação está realmente ativa e tem conteúdo
        if (isset($notification_to_send['enabled']) && $notification_to_send['enabled'] === true &&
            !empty($notification_to_send['title']) && !empty($notification_to_send['content'])) {
            
            $notification_json = json_encode($notification_to_send);
            logDebug("JSON da notificação: " . $notification_json, $mac_address);
            
            $notification_field = '"notification":' . $notification_json . ',';
            logDebug("Campo notification a ser enviado: " . $notification_field, $mac_address);
        } else {
            logDebug("✗ Notificação encontrada mas não está ativa ou tem conteúdo vazio", $mac_address);
        }
    }
    
    if($userData !== "[]"){
        $output_json = '{"android_version_code":"'.$ibo_data['android_version_code'].'","apk_url":"'.escapeUrl($ibo_data['apk_url']).'","device_key":"136115","expire_date":"'.$result['expire_date'].'","is_google_paid":true,"is_trial":0,' . $notification_field . '"urls":'.$userData.',"mac_registered":true,"themes":'.themes().',"trial_days":360,"plan_id":"03370629","mac_address":"'.$mac_address.'","pin":"0000","price":"0","app_version":"'.$ibo_data['android_version_code'].'","languages":[' . lang() . '],"apk_link":"'.escapeUrl($ibo_data['apk_url']).'"}'; 
        
        logDebug("JSON final para usuário registrado: " . $output_json, $mac_address);
        
        $output_json = '{"data":"'.getEncodedString($output_json).'"}';
    }else{
        $output_json = '{"android_version_code":"'.$ibo_data['android_version_code'].'","apk_url":"'.escapeUrl($ibo_data['apk_url']).'","device_key":"136115","expire_date":"2030-01-01","is_google_paid":false,"is_trial":1,' . $notification_field . '"urls":[],"mac_registered":false,"themes":'.themes().',"trial_days":7,"plan_id":"","mac_address":"'.$mac_address.'","pin":"0000","price":"0","app_version":"'.$ibo_data['android_version_code'].'","languages":[' . lang() . '],"apk_link":"'.escapeUrl($ibo_data['apk_url']).'"}'; 
        
        logDebug("JSON final para usuário NÃO registrado: " . $output_json, $mac_address);
        
        $output_json = '{"data":"'.getEncodedString($output_json).'"}';
    }
    
    logDebug("=== FIM DA REQUISIÇÃO ===", $mac_address);
    logDebug("==========================================");
    
    file_put_contents("last_mac.txt", $mac_address);
    http_response_code(200);
    header('HTTP/1.1 200 OK');
    header('Server: Apache');
    header('Cache-Control: no-cache, private');
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Max-Age: 86400');
    header('Access-Control-Allow-Headers: ');
    header('Access-Control-Allow-Method: ');
    header('Access-Control-Allow-Credentials: true');
    header('Connection: close');
    header('Content-Type: application/json');
    echo $output_json;
    exit;
}

echo "IBO API ONLINE - VERSÃO CONSOLIDADA (PRIMEIRA + SEGUNDA) COM PING FUNCIONANDO";
?>