<?php
/**
 * CORRIGIR TODOS OS ENDEREÇOS - AUTOMÁTICO
 * Processar TODAS as viagens que têm GPS mas não têm endereços
 */

header('Content-Type: text/html; charset=utf-8');
set_time_limit(0); // Sem limite de tempo
ini_set('memory_limit', '512M');

// Conectar ao banco
$host = 'localhost';
$dbname = 'pinheir3_controle_frotasV1.1';
$username = 'pinheir3_admin';
$password = '080880Gelboy';

function geocodificar($lat, $lng) {
    $url = "https://nominatim.openstreetmap.org/reverse?format=json&lat=$lat&lon=$lng&zoom=16&addressdetails=1";
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_USERAGENT, 'ControleDeFretas/2.0');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($httpCode == 200 && $response) {
        $json = json_decode($response, true);
        if ($json && isset($json['display_name'])) {
            return $json['display_name'];
        }
    }
    
    return null;
}

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    echo "<h1>🔧 CORRIGINDO TODOS OS ENDEREÇOS AUTOMATICAMENTE</h1>";
    echo "<div style='background: #e8f5e8; padding: 15px; margin: 10px 0; border-radius: 5px;'>";
    echo "<p><strong>⚙️ PROCESSAMENTO AUTOMÁTICO INICIADO...</strong></p>";
    echo "<p>Este processo pode demorar alguns minutos dependendo da quantidade de viagens.</p>";
    echo "</div>";
    
    // Flush output inicial
    if (ob_get_level()) ob_flush();
    flush();
    
    $processados = 0;
    $sucessosIniciais = 0;
    $sucessosFinais = 0;
    $erros = 0;
    $totalParaProcessar = 0;
    
    // Contar total de viagens para processar
    $stmt = $pdo->query("
        SELECT COUNT(*) as total
        FROM viagens 
        WHERE (
            (endereco_inicial IS NULL OR endereco_inicial = '') AND 
            latitude_inicial IS NOT NULL AND longitude_inicial IS NOT NULL
        ) OR (
            (endereco_final IS NULL OR endereco_final = '') AND 
            latitude_final IS NOT NULL AND longitude_final IS NOT NULL
        )
    ");
    $totalParaProcessar = $stmt->fetch()['total'];
    
    echo "<h2>📊 ESTATÍSTICAS INICIAIS</h2>";
    echo "<p><strong>Total de viagens para processar:</strong> $totalParaProcessar</p>";
    
    if ($totalParaProcessar == 0) {
        echo "<div style='background: #e8f5e8; padding: 15px; border-radius: 5px;'>";
        echo "<h3>✅ TODAS AS VIAGENS JÁ TÊM ENDEREÇOS!</h3>";
        echo "<p>Não há nada para processar.</p>";
        echo "</div>";
        exit;
    }
    
    // Buscar viagens que precisam de endereços
    $stmt = $pdo->query("
        SELECT 
            id, cliente, data_inicio,
            latitude_inicial, longitude_inicial, endereco_inicial,
            latitude_final, longitude_final, endereco_final
        FROM viagens 
        WHERE (
            (endereco_inicial IS NULL OR endereco_inicial = '') AND 
            latitude_inicial IS NOT NULL AND longitude_inicial IS NOT NULL
        ) OR (
            (endereco_final IS NULL OR endereco_final = '') AND 
            latitude_final IS NOT NULL AND longitude_final IS NOT NULL
        )
        ORDER BY data_inicio DESC
    ");
    
    $viagens = $stmt->fetchAll();
    
    echo "<h2>⚙️ PROCESSANDO VIAGENS...</h2>";
    echo "<div style='max-height: 400px; overflow-y: auto; border: 1px solid #ccc; padding: 10px;'>";
    
    foreach ($viagens as $viagem) {
        $processados++;
        $viagemAtualizada = false;
        
        echo "<div style='border-bottom: 1px solid #eee; margin: 5px 0; padding: 5px;'>";
        echo "<strong>#{$viagem['id']} - {$viagem['cliente']}</strong> (" . date('d/m/Y', strtotime($viagem['data_inicio'])) . ")<br>";
        
        $enderecoInicial = $viagem['endereco_inicial'];
        $enderecoFinal = $viagem['endereco_final'];
        
        // Processar endereço inicial se necessário
        if (empty($enderecoInicial) && !empty($viagem['latitude_inicial']) && !empty($viagem['longitude_inicial'])) {
            echo "🔍 Buscando endereço inicial...";
            $enderecoInicial = geocodificar($viagem['latitude_inicial'], $viagem['longitude_inicial']);
            
            if ($enderecoInicial) {
                echo " ✅<br>";
                echo "<small>📍 " . substr($enderecoInicial, 0, 80) . "...</small><br>";
                $sucessosIniciais++;
                $viagemAtualizada = true;
            } else {
                echo " ❌<br>";
                $erros++;
            }
            
            // Pausa para não sobrecarregar a API
            sleep(1);
        }
        
        // Processar endereço final se necessário
        if (empty($enderecoFinal) && !empty($viagem['latitude_final']) && !empty($viagem['longitude_final'])) {
            echo "🔍 Buscando endereço final...";
            $enderecoFinal = geocodificar($viagem['latitude_final'], $viagem['longitude_final']);
            
            if ($enderecoFinal) {
                echo " ✅<br>";
                echo "<small>🏁 " . substr($enderecoFinal, 0, 80) . "...</small><br>";
                $sucessosFinais++;
                $viagemAtualizada = true;
            } else {
                echo " ❌<br>";
                $erros++;
            }
            
            sleep(1);
        }
        
        // Atualizar no banco se houve mudanças
        if ($viagemAtualizada) {
            try {
                $updateStmt = $pdo->prepare("
                    UPDATE viagens 
                    SET endereco_inicial = COALESCE(?, endereco_inicial),
                        endereco_final = COALESCE(?, endereco_final)
                    WHERE id = ?
                ");
                
                $updateStmt->execute([$enderecoInicial, $enderecoFinal, $viagem['id']]);
                echo "<span style='color: green;'>💾 Salvo!</span><br>";
            } catch (Exception $e) {
                echo "<span style='color: red;'>❌ Erro ao salvar: " . $e->getMessage() . "</span><br>";
                $erros++;
            }
        }
        
        echo "</div>";
        
        // Mostrar progresso a cada 10 viagens
        if ($processados % 10 == 0) {
            $percentual = round(($processados / $totalParaProcessar) * 100, 1);
            echo "<div style='background: #f0f0f0; padding: 5px; margin: 10px 0; text-align: center;'>";
            echo "<strong>📊 Progresso: $processados/$totalParaProcessar ($percentual%)</strong>";
            echo "</div>";
        }
        
        // Flush output periodicamente
        if ($processados % 5 == 0) {
            if (ob_get_level()) ob_flush();
            flush();
        }
    }
    
    echo "</div>";
    
    echo "<h2>🎉 PROCESSAMENTO CONCLUÍDO!</h2>";
    echo "<div style='background: #e8f5e8; padding: 15px; border-radius: 5px;'>";
    echo "<table border='1' style='width: 100%; border-collapse: collapse;'>";
    echo "<tr><th>Métrica</th><th>Quantidade</th></tr>";
    echo "<tr><td>Viagens processadas</td><td><strong>$processados</strong></td></tr>";
    echo "<tr><td>Endereços iniciais adicionados</td><td><strong style='color: green;'>$sucessosIniciais</strong></td></tr>";
    echo "<tr><td>Endereços finais adicionados</td><td><strong style='color: green;'>$sucessosFinais</strong></td></tr>";
    echo "<tr><td>Erros</td><td><strong style='color: red;'>$erros</strong></td></tr>";
    echo "<tr><td><strong>Total de endereços adicionados</strong></td><td><strong style='color: blue;'>" . ($sucessosIniciais + $sucessosFinais) . "</strong></td></tr>";
    echo "</table>";
    echo "</div>";
    
    echo "<h2>🔗 PRÓXIMOS PASSOS</h2>";
    echo "<div style='background: #fff3cd; padding: 15px; border-radius: 5px;'>";
    echo "<ol>";
    echo "<li><a href='enderecos-rapido.php' style='color: blue;'>🔍 Verificar resultado final</a></li>";
    echo "<li><a href='admin/rastreamento.html' style='color: blue;'>🗺️ Testar mapa de rastreamento</a></li>";
    echo "<li><strong>🚀 Agora todas as viagens futuras terão endereços automáticos!</strong></li>";
    echo "</ol>";
    echo "</div>";
    
    // Estatísticas finais do banco
    echo "<h2>📈 ESTATÍSTICAS FINAIS DO BANCO</h2>";
    $stmt = $pdo->query("
        SELECT 
            COUNT(*) as total,
            SUM(CASE WHEN endereco_inicial IS NOT NULL AND endereco_inicial != '' THEN 1 ELSE 0 END) as com_inicial,
            SUM(CASE WHEN endereco_final IS NOT NULL AND endereco_final != '' THEN 1 ELSE 0 END) as com_final
        FROM viagens
    ");
    $statsFinais = $stmt->fetch();
    
    echo "<table border='1' style='width: 100%; border-collapse: collapse;'>";
    echo "<tr><th>Métrica</th><th>Quantidade</th><th>Percentual</th></tr>";
    echo "<tr>";
    echo "<td>Total de viagens</td>";
    echo "<td>{$statsFinais['total']}</td>";
    echo "<td>100%</td>";
    echo "</tr>";
    echo "<tr>";
    echo "<td>Com endereço inicial</td>";
    echo "<td>{$statsFinais['com_inicial']}</td>";
    echo "<td>" . round(($statsFinais['com_inicial'] / $statsFinais['total']) * 100, 1) . "%</td>";
    echo "</tr>";
    echo "<tr>";
    echo "<td>Com endereço final</td>";
    echo "<td>{$statsFinais['com_final']}</td>";
    echo "<td>" . round(($statsFinais['com_final'] / $statsFinais['total']) * 100, 1) . "%</td>";
    echo "</tr>";
    echo "</table>";
    
} catch (Exception $e) {
    echo "<h1 style='color: red;'>ERRO: " . $e->getMessage() . "</h1>";
}
?> 
