<?php
$pageTitle = 'Diagnóstico Completo da Newsletter';
$pageHeader = 'Sistema de Diagnóstico da Newsletter';
$currentPage = 'newsletter-diagnostic';

if (!defined('BASE_PATH')) {
    define('BASE_PATH', dirname(dirname(__FILE__)));
}

require_once '../includes/config.php';
require_once '../includes/db.php';
require_once '../includes/functions.php';
require_once '../includes/auth.php';

if (!$auth->isLoggedIn()) {
    redirect('admin/login.php');
    exit;
}

$diagnosticResults = [];
$overallStatus = 'unknown';

function addResult($test, $status, $message, $details = '') {
    global $diagnosticResults;
    $diagnosticResults[] = [
        'test' => $test,
        'status' => $status, // 'success', 'error', 'warning'
        'message' => $message,
        'details' => $details
    ];
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['run_diagnostic'])) {
    
    // TESTE 1: Verificar estrutura de arquivos
    addResult('Estrutura de Arquivos', 'info', 'Verificando arquivos necessários...');
    
    $files = [
        '/newsletter/subscribe.php' => 'Endpoint principal da newsletter',
        '/includes/config.php' => 'Configurações do sistema',
        '/includes/db.php' => 'Classe de banco de dados',
        '/includes/functions.php' => 'Funções auxiliares',
        '/logs/' => 'Diretório de logs (deve ter permissão de escrita)'
    ];
    
    foreach ($files as $file => $desc) {
        $fullPath = BASE_PATH . $file;
        if (strpos($file, '/logs/') !== false) {
            $exists = is_dir($fullPath) && is_writable($fullPath);
            $type = 'diretório';
        } else {
            $exists = file_exists($fullPath);
            $type = 'arquivo';
        }
        
        if ($exists) {
            addResult('Arquivo', 'success', "$desc", "✅ $type existe: $file");
        } else {
            addResult('Arquivo', 'error', "$desc", "❌ $type não encontrado: $file");
        }
    }
    
    // TESTE 2: Verificar banco de dados
    addResult('Banco de Dados', 'info', 'Verificando conexão e estrutura...');
    
    try {
        // Testar conexão
        $db->query("SELECT 1");
        $db->execute();
        addResult('DB Conexão', 'success', 'Conexão com banco de dados OK');
        
        // Verificar tabela
        $db->query("SHOW TABLES LIKE 'newsletter_subscribers'");
        $tableExists = $db->single();
        
        if ($tableExists) {
            addResult('DB Tabela', 'success', 'Tabela newsletter_subscribers existe');
            
            // Verificar estrutura da tabela
            $db->query("DESCRIBE newsletter_subscribers");
            $columns = $db->resultSet();
            
            $requiredColumns = ['id', 'email', 'name', 'status', 'source', 'subscription_date'];
            $foundColumns = array_column($columns, 'Field');
            
            foreach ($requiredColumns as $col) {
                if (in_array($col, $foundColumns)) {
                    addResult('DB Coluna', 'success', "Coluna '$col' existe");
                } else {
                    addResult('DB Coluna', 'error', "Coluna '$col' não encontrada");
                }
            }
            
            // Contar registros
            $db->query("SELECT COUNT(*) as total FROM newsletter_subscribers");
            $count = $db->single();
            addResult('DB Dados', 'info', "Total de inscritos: " . $count['total']);
            
            // Últimas inscrições
            $db->query("SELECT email, subscription_date FROM newsletter_subscribers ORDER BY subscription_date DESC LIMIT 3");
            $recent = $db->resultSet();
            if ($recent) {
                $details = "Últimas inscrições:\n";
                foreach ($recent as $sub) {
                    $details .= "- " . $sub['email'] . " (" . $sub['subscription_date'] . ")\n";
                }
                addResult('DB Registros', 'info', 'Últimas inscrições encontradas', $details);
            } else {
                addResult('DB Registros', 'warning', 'Nenhuma inscrição encontrada');
            }
            
        } else {
            addResult('DB Tabela', 'error', 'Tabela newsletter_subscribers não existe', 
                     'Execute o SQL para criar a tabela');
        }
        
    } catch (Exception $e) {
        addResult('DB Erro', 'error', 'Erro no banco de dados: ' . $e->getMessage());
    }
    
    // TESTE 3: Teste HTTP do endpoint
    addResult('HTTP Test', 'info', 'Testando endpoint via HTTP...');
    
    $subscribeUrl = SITE_URL . '/newsletter/subscribe';
    $testEmail = 'teste_diagnostic_' . time() . '@exemplo.com';
    $testData = [
        'email' => $testEmail,
        'name' => 'Teste Diagnóstico',
        'source' => 'diagnostic_test'
    ];
    
    $ch = curl_init($subscribeUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($testData));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'User-Agent: DiagnosticTest/1.0',
        'X-Requested-With: XMLHttpRequest'
    ]);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    $error = curl_error($ch);
    curl_close($ch);
    
    addResult('HTTP Status', $httpCode === 200 ? 'success' : 'error', 
             "Status HTTP: $httpCode", 
             "URL testada: $subscribeUrl\nContent-Type: $contentType");
    
    if ($error) {
        addResult('HTTP Error', 'error', "Erro cURL: $error");
    }
    
    if ($response) {
        addResult('HTTP Response', 'info', 'Resposta recebida', 
                 "Tamanho: " . strlen($response) . " bytes\nPrimeiros 500 caracteres:\n" . substr($response, 0, 500));
        
        // Tentar decodificar JSON
        $jsonData = json_decode($response, true);
        if ($jsonData !== null) {
            addResult('JSON Parse', 'success', 'Resposta é JSON válido', json_encode($jsonData, JSON_PRETTY_PRINT));
            
            if (isset($jsonData['success'])) {
                if ($jsonData['success']) {
                    addResult('API Response', 'success', 'API retornou sucesso: ' . ($jsonData['message'] ?? 'sem mensagem'));
                    
                    // Tentar remover o registro de teste
                    try {
                        $db->query("DELETE FROM newsletter_subscribers WHERE email = :email");
                        $db->bind(':email', $testEmail);
                        $db->execute();
                        addResult('Cleanup', 'success', 'Registro de teste removido');
                    } catch (Exception $e) {
                        addResult('Cleanup', 'warning', 'Não foi possível remover registro de teste');
                    }
                } else {
                    addResult('API Response', 'error', 'API retornou erro: ' . ($jsonData['message'] ?? 'sem mensagem'));
                }
            }
        } else {
            addResult('JSON Parse', 'error', 'Resposta não é JSON válido', 
                     "JSON Error: " . json_last_error_msg() . "\nResposta: " . substr($response, 0, 200));
        }
    } else {
        addResult('HTTP Response', 'error', 'Nenhuma resposta recebida');
    }
    
    // TESTE 4: Verificar logs
    addResult('Logs', 'info', 'Verificando logs do sistema...');
    
    $logFiles = [
        '/logs/newsletter_emergency.log' => 'Log de emergência',
        '/logs/newsletter_debug.log' => 'Log de debug',
        '/logs/error.log' => 'Log de erros PHP'
    ];
    
    foreach ($logFiles as $logFile => $desc) {
        $fullPath = BASE_PATH . $logFile;
        if (file_exists($fullPath)) {
            $size = filesize($fullPath);
            $content = file_get_contents($fullPath);
            $lines = explode("\n", $content);
            $recentLines = array_slice($lines, -10);
            
            addResult('Log File', 'success', "$desc existe (${size} bytes)", 
                     "Últimas 10 linhas:\n" . implode("\n", $recentLines));
        } else {
            addResult('Log File', 'warning', "$desc não existe: $logFile");
        }
    }
    
    // TESTE 5: Verificar permissões
    addResult('Permissões', 'info', 'Verificando permissões de arquivos...');
    
    $paths = [
        BASE_PATH . '/logs/' => 'Diretório de logs',
        BASE_PATH . '/newsletter/' => 'Diretório newsletter',
        BASE_PATH . '/newsletter/subscribe.php' => 'Script subscribe.php'
    ];
    
    foreach ($paths as $path => $desc) {
        if (file_exists($path)) {
            $perms = fileperms($path);
            $readable = is_readable($path);
            $writable = is_writable($path);
            $executable = is_executable($path);
            
            $permStr = sprintf('%o', $perms & 0777);
            $status = ($readable && (is_dir($path) ? $writable : true)) ? 'success' : 'warning';
            
            addResult('Permissões', $status, "$desc", 
                     "Permissões: $permStr\nLegível: " . ($readable ? 'Sim' : 'Não') . 
                     "\nGravável: " . ($writable ? 'Sim' : 'Não'));
        }
    }
    
    // TESTE 6: Simular JavaScript
    addResult('JavaScript Simulation', 'info', 'Simulando requisição JavaScript...');
    
    // Simular exatamente como o JavaScript faria
    $jsData = [
        'email' => 'teste_js_' . time() . '@exemplo.com',
        'source' => 'footer_form',
        'timestamp' => date('c'),
        'user_agent' => 'Diagnostic Test - JavaScript Simulation',
        'page_url' => SITE_URL
    ];
    
    $ch = curl_init($subscribeUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($jsData));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'X-Requested-With: XMLHttpRequest',
        'Accept: application/json',
        'Cache-Control: no-cache',
        'User-Agent: Mozilla/5.0 (Diagnostic Test)'
    ]);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    $jsResponse = curl_exec($ch);
    $jsHttpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $jsError = curl_error($ch);
    curl_close($ch);
    
    if ($jsHttpCode === 200 && $jsResponse) {
        $jsJson = json_decode($jsResponse, true);
        if ($jsJson && isset($jsJson['success']) && $jsJson['success']) {
            addResult('JS Simulation', 'success', 'Simulação JavaScript funcionou!', 
                     "Email: " . $jsData['email'] . "\nResposta: " . $jsResponse);
            
            // Cleanup
            try {
                $db->query("DELETE FROM newsletter_subscribers WHERE email = :email");
                $db->bind(':email', $jsData['email']);
                $db->execute();
            } catch (Exception $e) {
                // Ignore cleanup errors
            }
        } else {
            addResult('JS Simulation', 'error', 'Simulação JavaScript falhou', 
                     "Resposta: " . $jsResponse);
        }
    } else {
        addResult('JS Simulation', 'error', "Simulação JavaScript falhou (HTTP $jsHttpCode)", 
                 "Erro: " . $jsError);
    }
    
    // TESTE 7: Verificar configurações PHP
    addResult('PHP Config', 'info', 'Verificando configurações PHP...');
    
    $phpConfigs = [
        'display_errors' => ini_get('display_errors'),
        'error_reporting' => ini_get('error_reporting'),
        'max_execution_time' => ini_get('max_execution_time'),
        'memory_limit' => ini_get('memory_limit'),
        'post_max_size' => ini_get('post_max_size'),
        'upload_max_filesize' => ini_get('upload_max_filesize')
    ];
    
    $details = '';
    foreach ($phpConfigs as $key => $value) {
        $details .= "$key: $value\n";
    }
    
    addResult('PHP Settings', 'info', 'Configurações PHP coletadas', $details);
    
    // Determinar status geral
    $errorCount = 0;
    $warningCount = 0;
    $successCount = 0;
    
    foreach ($diagnosticResults as $result) {
        if ($result['status'] === 'error') $errorCount++;
        elseif ($result['status'] === 'warning') $warningCount++;
        elseif ($result['status'] === 'success') $successCount++;
    }
    
    if ($errorCount > 0) {
        $overallStatus = 'error';
    } elseif ($warningCount > 0) {
        $overallStatus = 'warning';
    } else {
        $overallStatus = 'success';
    }
}

require_once 'inc/header.php';
?>

<div class="container-fluid px-4">
    <h1 class="mt-4"><?php echo $pageHeader; ?></h1>
    
    <div class="row mb-4">
        <div class="col-md-8">
            <div class="card border-0 shadow-sm">
                <div class="card-header bg-primary text-white">
                    <h5 class="mb-0">🔍 Diagnóstico Completo da Newsletter</h5>
                </div>
                <div class="card-body">
                    <p>Este diagnóstico vai testar todos os componentes da newsletter para identificar exatamente onde está o problema.</p>
                    
                    <form method="POST">
                        <button type="submit" name="run_diagnostic" class="btn btn-primary btn-lg">
                            🚀 Executar Diagnóstico Completo
                        </button>
                    </form>
                    
                    <?php if (!empty($diagnosticResults)): ?>
                    <hr>
                    
                    <div class="alert alert-<?php 
                        echo $overallStatus === 'success' ? 'success' : 
                             ($overallStatus === 'warning' ? 'warning' : 'danger'); 
                    ?>">
                        <h5>
                            <?php if ($overallStatus === 'success'): ?>
                                ✅ Sistema Funcionando
                            <?php elseif ($overallStatus === 'warning'): ?>
                                ⚠️ Sistema com Problemas Menores
                            <?php else: ?>
                                ❌ Sistema com Problemas Críticos
                            <?php endif; ?>
                        </h5>
                        <p class="mb-0">
                            Erros: <?php echo $errorCount; ?> | 
                            Avisos: <?php echo $warningCount; ?> | 
                            Sucessos: <?php echo $successCount; ?>
                        </p>
                    </div>
                    
                    <div class="accordion" id="diagnosticAccordion">
                        <?php 
                        $index = 0;
                        $currentCategory = '';
                        foreach ($diagnosticResults as $result): 
                            $index++;
                            $statusIcon = $result['status'] === 'success' ? '✅' : 
                                         ($result['status'] === 'warning' ? '⚠️' : 
                                         ($result['status'] === 'error' ? '❌' : 'ℹ️'));
                            $statusClass = $result['status'] === 'success' ? 'success' : 
                                          ($result['status'] === 'warning' ? 'warning' : 
                                          ($result['status'] === 'error' ? 'danger' : 'info'));
                        ?>
                        <div class="accordion-item">
                            <h2 class="accordion-header" id="heading<?php echo $index; ?>">
                                <button class="accordion-button collapsed" type="button" 
                                        data-bs-toggle="collapse" data-bs-target="#collapse<?php echo $index; ?>">
                                    <span class="badge bg-<?php echo $statusClass; ?> me-2"><?php echo $statusIcon; ?></span>
                                    <strong><?php echo htmlspecialchars($result['test']); ?>:</strong>
                                    &nbsp;<?php echo htmlspecialchars($result['message']); ?>
                                </button>
                            </h2>
                            <div id="collapse<?php echo $index; ?>" class="accordion-collapse collapse" 
                                 data-bs-parent="#diagnosticAccordion">
                                <div class="accordion-body">
                                    <?php if ($result['details']): ?>
                                    <pre class="bg-light p-3 rounded" style="font-size: 12px; white-space: pre-wrap;"><?php echo htmlspecialchars($result['details']); ?></pre>
                                    <?php endif; ?>
                                </div>
                            </div>
                        </div>
                        <?php endforeach; ?>
                    </div>
                    <?php endif; ?>
                </div>
            </div>
        </div>
        
        <div class="col-md-4">
            <div class="card border-0 shadow-sm mb-4">
                <div class="card-header">
                    <h5>🛠️ Ações Rápidas</h5>
                </div>
                <div class="card-body">
                    <div class="d-grid gap-2">
                        <a href="../newsletter/test-direct.php" target="_blank" class="btn btn-outline-primary">
                            🧪 Teste Direto
                        </a>
                        <a href="newsletter-subscribers.php" class="btn btn-outline-info">
                            👥 Ver Inscritos
                        </a>
                        <button onclick="testFromBrowser()" class="btn btn-outline-success">
                            🌐 Testar do Navegador
                        </button>
                        <button onclick="clearAllLogs()" class="btn btn-outline-warning">
                            🗑️ Limpar Logs
                        </button>
                    </div>
                </div>
            </div>
            
            <div class="card border-0 shadow-sm">
                <div class="card-header">
                    <h5>📋 Problemas Comuns</h5>
                </div>
                <div class="card-body">
                    <ul class="list-unstyled">
                        <li><strong>Erro 500:</strong> Problema no PHP ou configuração</li>
                        <li><strong>Erro 404:</strong> Arquivo subscribe.php não encontrado</li>
                        <li><strong>JSON inválido:</strong> Erro no código PHP gerando HTML</li>
                        <li><strong>Tabela não existe:</strong> SQL não foi executado</li>
                        <li><strong>Permissões:</strong> Diretório logs sem escrita</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>
</div>

<script>
function testFromBrowser() {
    console.log('🧪 Testando newsletter do navegador...');
    
    const testEmail = 'teste_browser_' + Date.now() + '@exemplo.com';
    
    fetch('/newsletter/subscribe', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'X-Requested-With': 'XMLHttpRequest'
        },
        body: JSON.stringify({
            email: testEmail,
            source: 'browser_test',
            timestamp: new Date().toISOString()
        })
    })
    .then(response => {
        console.log('📡 Status:', response.status);
        return response.text();
    })
    .then(text => {
        console.log('📄 Resposta:', text);
        try {
            const json = JSON.parse(text);
            if (json.success) {
                alert('✅ Teste bem-sucedido! Newsletter funcionando.');
            } else {
                alert('❌ Teste falhou: ' + json.message);
            }
        } catch (e) {
            alert('❌ Resposta não é JSON válido. Verifique o console.');
        }
    })
    .catch(error => {
        console.error('❌ Erro:', error);
        alert('❌ Erro na requisição: ' + error.message);
    });
}

function clearAllLogs() {
    if (confirm('Limpar todos os logs?')) {
        // Implementar se necessário
        alert('Funcionalidade ainda não implementada');
    }
}
</script>

<?php require_once 'inc/footer.php'; ?>