<?php
require_once 'conexao.php';

// Configurar headers para evitar cache
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: no-cache, no-store, must-revalidate');

echo "<!DOCTYPE html>";
echo "<html>";
echo "<head>";
echo "<meta charset='utf-8'>";
echo "<title>Corrigir GPS Todas as Rotas</title>";
echo "<style>";
echo "body { font-family: Arial, sans-serif; margin: 20px; background-color: #f5f5f5; }";
echo ".container { max-width: 1000px; margin: 0 auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }";
echo ".success { color: #28a745; font-weight: bold; }";
echo ".error { color: #dc3545; font-weight: bold; }";
echo ".warning { color: #ffc107; font-weight: bold; }";
echo ".info { color: #17a2b8; font-weight: bold; }";
echo "h1 { color: #333; border-bottom: 2px solid #007bff; padding-bottom: 10px; }";
echo "h2 { color: #555; margin-top: 30px; }";
echo "ul { background: #f8f9fa; padding: 15px; border-radius: 5px; }";
echo "li { margin: 5px 0; }";
echo ".btn { background: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; text-decoration: none; display: inline-block; margin: 10px 5px; }";
echo ".btn:hover { background: #0056b3; }";
echo ".btn-danger { background: #dc3545; }";
echo ".btn-danger:hover { background: #c82333; }";
echo "table { width: 100%; border-collapse: collapse; margin: 20px 0; }";
echo "th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }";
echo "th { background-color: #f2f2f2; }";
echo "</style>";
echo "</head>";
echo "<body>";

echo "<div class='container'>";
echo "<h1>🔧 CORRIGINDO CÁLCULO GPS - TODAS AS ROTAS</h1>";

try {
    $pdo = conectarBanco();
    
    // 1. Buscar todas as rotas com viagens
    echo "<h2>1. Buscando Rotas com Viagens</h2>";
    $sql = "SELECT DISTINCT sr.id, sr.titulo, sr.status, sr.km_estimado, sr.km_real, 
                   COUNT(rv.viagem_id) as total_viagens
            FROM solicitacoes_rotas sr
            INNER JOIN rota_viagens rv ON sr.id = rv.solicitacao_rota_id
            WHERE sr.status IN ('concluida', 'em_execucao')
            GROUP BY sr.id
            ORDER BY sr.id DESC";
    $stmt = $pdo->query($sql);
    $rotas = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (!$rotas) {
        echo "<p class='error'>❌ Nenhuma rota encontrada!</p>";
        echo "<p><a href='javascript:history.back()' class='btn'>Voltar</a></p>";
        echo "</div></body></html>";
        exit;
    }
    
    echo "<p class='success'>✅ Encontradas " . count($rotas) . " rotas</p>";
    
    // 2. Processar cada rota
    echo "<h2>2. Processando Rotas</h2>";
    
    $rotasProcessadas = 0;
    $viagensCorrigidas = 0;
    $totalDistanciaCorrigida = 0;
    $resultados = [];
    
    foreach ($rotas as $rota) {
        echo "<h3>Rota #{$rota['id']} - {$rota['titulo']}</h3>";
        
        // Buscar viagens desta rota
        $sqlViagens = "SELECT rv.*, v.* FROM rota_viagens rv 
                       INNER JOIN viagens v ON rv.viagem_id = v.id 
                       WHERE rv.solicitacao_rota_id = ? 
                       ORDER BY rv.ordem_execucao";
        $stmtViagens = $pdo->prepare($sqlViagens);
        $stmtViagens->execute([$rota['id']]);
        $viagens = $stmtViagens->fetchAll(PDO::FETCH_ASSOC);
        
        $distanciaRealRota = 0;
        $viagensCorrigidasRota = 0;
        
        foreach ($viagens as $viagem) {
            if ($viagem['trajeto']) {
                $trajeto = json_decode($viagem['trajeto'], true);
                
                if (is_array($trajeto) && count($trajeto) > 1) {
                    // Calcular distância real usando Haversine
                    $distanciaReal = 0;
                    for ($i = 0; $i < count($trajeto) - 1; $i++) {
                        $ponto1 = $trajeto[$i];
                        $ponto2 = $trajeto[$i + 1];
                        
                        $lat1 = $ponto1['latitude'];
                        $lon1 = $ponto1['longitude'];
                        $lat2 = $ponto2['latitude'];
                        $lon2 = $ponto2['longitude'];
                        
                        // Fórmula de Haversine
                        $R = 6371; // Raio da Terra em km
                        $dLat = deg2rad($lat2 - $lat1);
                        $dLon = deg2rad($lon2 - $lon1);
                        $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon/2) * sin($dLon/2);
                        $c = 2 * atan2(sqrt($a), sqrt(1-$a));
                        $distancia = $R * $c;
                        
                        $distanciaReal += $distancia;
                    }
                    
                    $distanciaRealMetros = $distanciaReal * 1000; // Converter para metros
                    $distanciaRealRota += $distanciaRealMetros;
                    
                    // Verificar se precisa corrigir
                    $kmGpsAtual = $viagem['km_gps_final'] ?? 0;
                    $diferenca = abs($distanciaRealMetros - $kmGpsAtual);
                    
                    if ($diferenca > 100) { // Se diferença > 100 metros
                        // Atualizar km_gps_final
                        $sqlUpdate = "UPDATE viagens SET km_gps_final = ? WHERE id = ?";
                        $stmtUpdate = $pdo->prepare($sqlUpdate);
                        $resultado = $stmtUpdate->execute([$distanciaRealMetros, $viagem['viagem_id']]);
                        
                        if ($resultado) {
                            $viagensCorrigidasRota++;
                            $viagensCorrigidas++;
                            $totalDistanciaCorrigida += $diferenca;
                        }
                    }
                }
            }
        }
        
        // Atualizar KM real da rota se necessário
        if ($distanciaRealRota > 0) {
            $kmRealRota = $distanciaRealRota / 1000; // Converter para km
            $kmRealAtual = $rota['km_real'] ?? 0;
            
            if (abs($kmRealRota - $kmRealAtual) > 0.1) { // Se diferença > 100 metros
                $sqlUpdateRota = "UPDATE solicitacoes_rotas SET km_real = ? WHERE id = ?";
                $stmtUpdateRota = $pdo->prepare($sqlUpdateRota);
                $stmtUpdateRota->execute([$kmRealRota, $rota['id']]);
            }
        }
        
        $resultados[] = [
            'rota_id' => $rota['id'],
            'titulo' => $rota['titulo'],
            'viagens_total' => count($viagens),
            'viagens_corrigidas' => $viagensCorrigidasRota,
            'distancia_real' => $distanciaRealRota / 1000,
            'km_estimado' => $rota['km_estimado'],
            'km_real_anterior' => $rota['km_real'] ?? 0
        ];
        
        $rotasProcessadas++;
        
        if ($viagensCorrigidasRota > 0) {
            echo "<p class='success'>✅ Rota corrigida: $viagensCorrigidasRota viagens</p>";
        } else {
            echo "<p class='info'>ℹ️ Rota OK: nenhuma correção necessária</p>";
        }
    }
    
    // 3. Resumo final
    echo "<h2>3. 📊 RESUMO GERAL</h2>";
    echo "<ul>";
    echo "<li><strong>Rotas processadas:</strong> $rotasProcessadas</li>";
    echo "<li><strong>Viagens corrigidas:</strong> $viagensCorrigidas</li>";
    echo "<li><strong>Distância total corrigida:</strong> " . number_format($totalDistanciaCorrigida / 1000, 3) . " km</li>";
    echo "</ul>";
    
    if ($viagensCorrigidas > 0) {
        echo "<h3>📋 Detalhes por Rota:</h3>";
        echo "<table>";
        echo "<tr><th>Rota ID</th><th>Título</th><th>Viagens</th><th>Corrigidas</th><th>Distância Real</th><th>KM Estimado</th><th>KM Real Anterior</th></tr>";
        
        foreach ($resultados as $resultado) {
            $statusClass = $resultado['viagens_corrigidas'] > 0 ? 'success' : 'info';
            echo "<tr class='$statusClass'>";
            echo "<td>{$resultado['rota_id']}</td>";
            echo "<td>{$resultado['titulo']}</td>";
            echo "<td>{$resultado['viagens_total']}</td>";
            echo "<td>{$resultado['viagens_corrigidas']}</td>";
            echo "<td>" . number_format($resultado['distancia_real'], 3) . " km</td>";
            echo "<td>{$resultado['km_estimado']} km</td>";
            echo "<td>" . number_format($resultado['km_real_anterior'], 3) . " km</td>";
            echo "</tr>";
        }
        echo "</table>";
        
        echo "<p class='success'>🎉 CORREÇÃO GERAL CONCLUÍDA COM SUCESSO!</p>";
        echo "<p>Agora todas as rotas devem mostrar a distância GPS correta.</p>";
    } else {
        echo "<p class='info'>ℹ️ Nenhuma correção necessária em nenhuma rota.</p>";
    }
    
    echo "<p><a href='javascript:history.back()' class='btn'>Voltar</a></p>";
    
} catch (Exception $e) {
    echo "<p class='error'>❌ Erro: " . htmlspecialchars($e->getMessage()) . "</p>";
    echo "<p><a href='javascript:history.back()' class='btn'>Voltar</a></p>";
}

echo "</div>";
echo "</body>";
echo "</html>";
?>
