<?php
header('Content-Type: text/html; charset=utf-8');
echo "<h2>🎯 Calcular Distância Real (Filtrada)</h2>";

try {
    require_once 'config/database.php';
    $pdo = Database::getConnection();
    
    // Função Haversine
    function haversine($lat1, $lon1, $lat2, $lon2) {
        $R = 6371.0; // Raio da Terra em km
        $dLat = deg2rad($lat2 - $lat1);
        $dLon = deg2rad($lon2 - $lon1);
        $lat1 = deg2rad($lat1);
        $lat2 = deg2rad($lat2);
        
        $a = sin($dLat/2) * sin($dLat/2) + cos($lat1) * cos($lat2) * sin($dLon/2) * sin($dLon/2);
        $c = 2 * atan2(sqrt($a), sqrt(1-$a));
        return $R * $c;
    }
    
    // Função para filtrar pontos próximos
    function filtrarPontos($pontos, $distanciaMinima = 0.001) { // 1 metro = 0.001 km
        if (count($pontos) <= 1) return $pontos;
        
        $pontosFiltrados = [$pontos[0]]; // Primeiro ponto sempre incluído
        $ultimoPonto = $pontos[0];
        
        for ($i = 1; $i < count($pontos); $i++) {
            $pontoAtual = $pontos[$i];
            
            // Calcular distância do último ponto filtrado
            $distancia = haversine(
                $ultimoPonto['latitude'], $ultimoPonto['longitude'],
                $pontoAtual['latitude'], $pontoAtual['longitude']
            );
            
            // Se a distância for maior que o mínimo, incluir o ponto
            if ($distancia >= $distanciaMinima) {
                $pontosFiltrados[] = $pontoAtual;
                $ultimoPonto = $pontoAtual;
            }
        }
        
        return $pontosFiltrados;
    }
    
    // 1. Buscar pontos GPS da viagem 1
    echo "<h3>1. Pontos GPS Originais</h3>";
    
    $stmt = $pdo->prepare("
        SELECT latitude, longitude, timestamp 
        FROM rastreamento_tempo_real 
        WHERE viagem_id = 1 
        ORDER BY timestamp ASC
    ");
    $stmt->execute();
    $pontosOriginais = $stmt->fetchAll();
    
    echo "<p><strong>📊 Total de pontos originais:</strong> " . count($pontosOriginais) . "</p>";
    
    // 2. Filtrar pontos duplicados e muito próximos
    echo "<h3>2. Filtragem de Pontos</h3>";
    
    $pontosFiltrados = filtrarPontos($pontosOriginais, 0.001); // 1 metro mínimo
    
    echo "<p><strong>📊 Pontos após filtragem:</strong> " . count($pontosFiltrados) . "</p>";
    echo "<p><strong>📉 Redução:</strong> " . (count($pontosOriginais) - count($pontosFiltrados)) . " pontos removidos</p>";
    
    // 3. Mostrar pontos filtrados
    if (count($pontosFiltrados) > 0) {
        echo "<div style='background: #f8f9fa; padding: 15px; border: 1px solid #ddd; border-radius: 5px;'>";
        echo "<h4>📍 Pontos Filtrados (Significativos):</h4>";
        echo "<table border='1' style='border-collapse: collapse; width: 100%;'>";
        echo "<tr style='background: #e3f2fd;'>";
        echo "<th>#</th><th>Latitude</th><th>Longitude</th><th>Timestamp</th>";
        echo "</tr>";
        
        foreach ($pontosFiltrados as $i => $ponto) {
            echo "<tr>";
            echo "<td>" . ($i + 1) . "</td>";
            echo "<td>{$ponto['latitude']}</td>";
            echo "<td>{$ponto['longitude']}</td>";
            echo "<td>{$ponto['timestamp']}</td>";
            echo "</tr>";
        }
        echo "</table>";
        echo "</div>";
    }
    
    // 4. Calcular distância real
    echo "<h3>3. Cálculo de Distância Real</h3>";
    
    if (count($pontosFiltrados) > 1) {
        $distanciaTotal = 0;
        $segmentos = [];
        
        for ($i = 0; $i < count($pontosFiltrados) - 1; $i++) {
            $lat1 = $pontosFiltrados[$i]['latitude'];
            $lon1 = $pontosFiltrados[$i]['longitude'];
            $lat2 = $pontosFiltrados[$i + 1]['latitude'];
            $lon2 = $pontosFiltrados[$i + 1]['longitude'];
            
            $distancia = haversine($lat1, $lon1, $lat2, $lon2);
            $distanciaTotal += $distancia;
            
            $segmentos[] = [
                'de' => ($i + 1),
                'para' => ($i + 2),
                'distancia' => $distancia,
                'metros' => $distancia * 1000
            ];
        }
        
        echo "<div style='background: #e8f5e8; padding: 15px; border: 1px solid #ddd; border-radius: 5px;'>";
        echo "<h4>✅ Distância Real Calculada:</h4>";
        echo "<p><strong>Distância Total:</strong> " . number_format($distanciaTotal, 6) . " km</p>";
        echo "<p><strong>Distância em Metros:</strong> " . number_format($distanciaTotal * 1000, 2) . " metros</p>";
        echo "<p><strong>Total de Segmentos:</strong> " . count($segmentos) . "</p>";
        echo "</div>";
        
        // 5. Comparação
        echo "<h3>4. Comparação</h3>";
        echo "<div style='background: #fff3e0; padding: 15px; border: 1px solid #ddd; border-radius: 5px;'>";
        echo "<h4>📊 Comparação de Resultados:</h4>";
        echo "<p><strong>Distância Original (com ruído):</strong> 258.32 metros</p>";
        echo "<p><strong>Distância Filtrada (real):</strong> " . number_format($distanciaTotal * 1000, 2) . " metros</p>";
        echo "<p><strong>Distância Esperada:</strong> 25 metros</p>";
        echo "<p><strong>Diferença:</strong> " . number_format(abs($distanciaTotal * 1000 - 25), 2) . " metros</p>";
        echo "</div>";
        
        // 6. Atualizar km_gps_final com valor filtrado
        if ($distanciaTotal > 0) {
            echo "<h3>5. Atualizar km_gps_final</h3>";
            
            $stmt = $pdo->prepare("UPDATE viagens SET km_gps_final = ? WHERE id = 1");
            $resultado = $stmt->execute([$distanciaTotal]);
            
            if ($resultado) {
                echo "<div style='background: #e8f5e8; padding: 15px; border: 1px solid #ddd; border-radius: 5px;'>";
                echo "<h4>✅ km_gps_final atualizado com valor real!</h4>";
                echo "<p><strong>Novo valor:</strong> " . number_format($distanciaTotal, 6) . " km</p>";
                echo "<p><strong>Em metros:</strong> " . number_format($distanciaTotal * 1000, 2) . " metros</p>";
                echo "</div>";
            } else {
                echo "<div style='background: #ffebee; padding: 15px; border: 1px solid #ddd; border-radius: 5px;'>";
                echo "<h4>❌ Erro ao atualizar</h4>";
                echo "</div>";
            }
        }
        
        // 7. Mostrar segmentos significativos
        if (count($segmentos) > 0) {
            echo "<h3>6. Segmentos Significativos</h3>";
            echo "<div style='background: #f8f9fa; padding: 15px; border: 1px solid #ddd; border-radius: 5px;'>";
            echo "<table border='1' style='border-collapse: collapse; width: 100%;'>";
            echo "<tr style='background: #e3f2fd;'>";
            echo "<th>Segmento</th><th>Distância (km)</th><th>Distância (m)</th>";
            echo "</tr>";
            
            foreach ($segmentos as $seg) {
                echo "<tr>";
                echo "<td>{$seg['de']} → {$seg['para']}</td>";
                echo "<td>" . number_format($seg['distancia'], 6) . "</td>";
                echo "<td>" . number_format($seg['metros'], 2) . "</td>";
                echo "</tr>";
            }
            echo "</table>";
            echo "</div>";
        }
        
    } else {
        echo "<div style='background: #ffebee; padding: 15px; border: 1px solid #ddd; border-radius: 5px;'>";
        echo "<h4>❌ Poucos pontos após filtragem</h4>";
        echo "<p>É necessário pelo menos 2 pontos para calcular distância.</p>";
        echo "</div>";
    }
    
} catch (Exception $e) {
    echo "❌ Erro: " . $e->getMessage() . "<br>";
}

echo "<h3>🔧 Explicação da Solução</h3>";
echo "<div style='background: #e3f2fd; padding: 15px; border: 1px solid #ddd; border-radius: 5px;'>";
echo "<p><strong>Problema:</strong> O GPS estava registrando muitos pontos duplicados e micro-movimentos.</p>";
echo "<p><strong>Solução:</strong> Filtramos pontos que estão a menos de 1 metro de distância.</p>";
echo "<p><strong>Resultado:</strong> Distância mais precisa e próxima do valor real.</p>";
echo "</div>";
?>
