<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

require_once 'config/database.php';

function resposta($sucesso, $dados = null, $mensagem = '') {
    echo json_encode([
        'sucesso' => $sucesso,
        'dados' => $dados,
        'mensagem' => $mensagem,
        'timestamp' => date('Y-m-d H:i:s')
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

$metodo = $_SERVER['REQUEST_METHOD'];
$viagemId = isset($_GET['viagem_id']) ? intval($_GET['viagem_id']) : 0;

if ($viagemId <= 0) {
    resposta(false, null, 'ID da viagem é obrigatório');
}

try {
    $pdo = conectarBanco();
    
    if ($metodo === 'GET') {
        // Buscar pontos GPS da viagem
        $stmt = $pdo->prepare("
            SELECT 
                latitude, 
                longitude, 
                velocidade, 
                timestamp_gps,
                precisao
            FROM rastreamento_tempo_real 
            WHERE viagem_id = ? 
            ORDER BY timestamp_gps ASC
        ");
        $stmt->execute([$viagemId]);
        $pontos = $stmt->fetchAll();
        
        if (count($pontos) == 0) {
            resposta(false, null, 'Nenhum ponto GPS encontrado para esta viagem');
        }
        
        // Aplicar filtros de qualidade em tempo real
        $pontosLimpos = [];
        $distanciaMaxima = 0.002; // ~200 metros
        
        if (count($pontos) > 0) {
            // Primeiro ponto sempre inclui
            $pontosLimpos[] = [
                'lat' => floatval($pontos[0]['latitude']),
                'lng' => floatval($pontos[0]['longitude']),
                'velocidade' => intval($pontos[0]['velocidade']),
                'timestamp' => $pontos[0]['timestamp_gps'],
                'precisao' => floatval($pontos[0]['precisao'])
            ];
            
            $ultimoPonto = $pontos[0];
            
            for ($i = 1; $i < count($pontos); $i++) {
                $pontoAtual = $pontos[$i];
                
                // Calcular distância
                $deltaLat = abs($pontoAtual['latitude'] - $ultimoPonto['latitude']);
                $deltaLng = abs($pontoAtual['longitude'] - $ultimoPonto['longitude']);
                $distancia = sqrt($deltaLat * $deltaLat + $deltaLng * $deltaLng);
                
                // Aplicar filtros
                $pontoValido = true;
                
                // Filtro teleporte
                if ($distancia > $distanciaMaxima) {
                    $pontoValido = false;
                }
                
                // Filtro coordenadas inválidas
                if ($pontoAtual['latitude'] == 0 || $pontoAtual['longitude'] == 0) {
                    $pontoValido = false;
                }
                
                // Filtro duplicados
                if ($distancia < 0.00001) {
                    $pontoValido = false;
                }
                
                if ($pontoValido) {
                    $pontosLimpos[] = [
                        'lat' => floatval($pontoAtual['latitude']),
                        'lng' => floatval($pontoAtual['longitude']),
                        'velocidade' => intval($pontoAtual['velocidade']),
                        'timestamp' => $pontoAtual['timestamp_gps'],
                        'precisao' => floatval($pontoAtual['precisao'])
                    ];
                    $ultimoPonto = $pontoAtual;
                }
            }
        }
        
        // Calcular estatísticas
        $distanciaTotal = 0;
        $velocidadeMax = 0;
        $velocidadeMedia = 0;
        $somaVelocidades = 0;
        
        for ($i = 0; $i < count($pontosLimpos) - 1; $i++) {
            $p1 = $pontosLimpos[$i];
            $p2 = $pontosLimpos[$i + 1];
            
            // Distância
            $deltaLat = $p2['lat'] - $p1['lat'];
            $deltaLng = $p2['lng'] - $p1['lng'];
            $distanciaTotal += sqrt($deltaLat * $deltaLat + $deltaLng * $deltaLng);
            
            // Velocidades
            $velocidadeMax = max($velocidadeMax, $p2['velocidade']);
            $somaVelocidades += $p2['velocidade'];
        }
        
        $velocidadeMedia = count($pontosLimpos) > 1 ? round($somaVelocidades / (count($pontosLimpos) - 1)) : 0;
        $distanciaKm = round($distanciaTotal * 111, 2); // Conversão para km
        
        // Resposta otimizada para mapas
        resposta(true, [
            'pontos' => $pontosLimpos,
            'estatisticas' => [
                'total_pontos_originais' => count($pontos),
                'total_pontos_filtrados' => count($pontosLimpos),
                'pontos_removidos' => count($pontos) - count($pontosLimpos),
                'distancia_km' => $distanciaKm,
                'velocidade_maxima' => $velocidadeMax,
                'velocidade_media' => $velocidadeMedia,
                'inicio' => [
                    'lat' => $pontosLimpos[0]['lat'],
                    'lng' => $pontosLimpos[0]['lng'],
                    'timestamp' => $pontosLimpos[0]['timestamp']
                ],
                'fim' => [
                    'lat' => $pontosLimpos[count($pontosLimpos)-1]['lat'],
                    'lng' => $pontosLimpos[count($pontosLimpos)-1]['lng'],
                    'timestamp' => $pontosLimpos[count($pontosLimpos)-1]['timestamp']
                ]
            ]
        ], 'Trajeto carregado com sucesso');
        
    } else {
        resposta(false, null, 'Método não suportado');
    }
    
} catch (Exception $e) {
    resposta(false, null, 'Erro interno: ' . $e->getMessage());
}
?> 
