<?php
header('Content-Type: text/html; charset=utf-8');

require_once 'conexao.php';

echo "<!DOCTYPE html>
<html>
<head>
    <title>Corrigir KM GPS das Rotas</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        .success { color: green; }
        .error { color: red; }
        .warning { color: orange; }
        .info { color: blue; }
        table { border-collapse: collapse; width: 100%; margin: 20px 0; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
        .btn { background-color: #4CAF50; color: white; padding: 10px 20px; text-decoration: none; border-radius: 4px; }
    </style>
</head>
<body>";

echo "<h1>🔧 Corrigir KM GPS das Rotas</h1>";

try {
    $pdo = conectarBanco();
    
    // Verificar se foi solicitada uma rota específica
    $rotaId = $_GET['rota_id'] ?? null;
    
    if ($rotaId) {
        // Corrigir KM GPS para uma rota específica
        echo "<h2>🎯 Corrigindo KM GPS para Rota ID: $rotaId</h2>";
        
        $sqlRota = "SELECT id, titulo, status, km_estimado, km_real, data_inicio_real, data_fim_real 
                    FROM solicitacoes_rotas WHERE id = ?";
        $stmtRota = $pdo->prepare($sqlRota);
        $stmtRota->execute([$rotaId]);
        $rota = $stmtRota->fetch(PDO::FETCH_ASSOC);
        
        if (!$rota) {
            echo "<p class='error'>❌ Rota ID $rotaId não encontrada!</p>";
            exit;
        }
        
        echo "<h3>📋 Dados da Rota</h3>";
        echo "<table>";
        echo "<tr><th>Campo</th><th>Valor</th></tr>";
        echo "<tr><td>ID</td><td>{$rota['id']}</td></tr>";
        echo "<tr><td>Título</td><td>{$rota['titulo']}</td></tr>";
        echo "<tr><td>Status</td><td>{$rota['status']}</td></tr>";
        echo "<tr><td>KM Estimado</td><td>{$rota['km_estimado']}</td></tr>";
        echo "<tr><td>KM Real</td><td>{$rota['km_real']}</td></tr>";
        echo "<tr><td>Data Início</td><td>{$rota['data_inicio_real']}</td></tr>";
        echo "<tr><td>Data Fim</td><td>{$rota['data_fim_real']}</td></tr>";
        echo "</table>";
        
        // Buscar viagens da rota
        $sqlViagens = "SELECT v.id, v.cliente, v.trajeto, v.km_inicial, v.km_final, v.km_gps_final 
                       FROM viagens v 
                       INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                       WHERE rv.solicitacao_rota_id = ?";
        $stmtViagens = $pdo->prepare($sqlViagens);
        $stmtViagens->execute([$rotaId]);
        $viagens = $stmtViagens->fetchAll(PDO::FETCH_ASSOC);
        
        echo "<h3>🚗 Viagens da Rota</h3>";
        echo "<table>";
        echo "<tr><th>ID</th><th>Cliente</th><th>KM Inicial</th><th>KM Final</th><th>KM GPS Atual</th><th>Pontos GPS</th></tr>";
        
        $kmGpsTotal = 0;
        $viagensComTrajeto = 0;
        
        foreach ($viagens as $viagem) {
            $pontosCount = 0;
            $kmGpsViagem = 0;
            
            if ($viagem['trajeto']) {
                $pontos = json_decode($viagem['trajeto'], true);
                $pontosCount = $pontos ? count($pontos) : 0;
                
                if ($pontos && count($pontos) >= 2) {
                    $distanciaViagem = 0;
                    for ($i = 1; $i < count($pontos); $i++) {
                        $pontoAnterior = $pontos[$i-1];
                        $pontoAtual = $pontos[$i];
                        
                        if (isset($pontoAnterior[0], $pontoAnterior[1], $pontoAtual[0], $pontoAtual[1])) {
                            // Calcular distância usando Haversine
                            $R = 6371; // Raio da Terra em km
                            $dLat = deg2rad($pontoAtual[0] - $pontoAnterior[0]);
                            $dLon = deg2rad($pontoAtual[1] - $pontoAnterior[1]);
                            $lat1 = deg2rad($pontoAnterior[0]);
                            $lat2 = deg2rad($pontoAtual[0]);
                            $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));
                            $distancia = $R * $c;
                            $distanciaViagem += $distancia;
                        }
                    }
                    $kmGpsViagem = $distanciaViagem;
                    $kmGpsTotal += $distanciaViagem;
                    $viagensComTrajeto++;
                }
            }
            
            echo "<tr>";
            echo "<td>{$viagem['id']}</td>";
            echo "<td>{$viagem['cliente']}</td>";
            echo "<td>{$viagem['km_inicial']}</td>";
            echo "<td>{$viagem['km_final']}</td>";
            echo "<td>" . ($viagem['km_gps_final'] ?: 'NULL') . "</td>";
            echo "<td>$pontosCount pontos</td>";
            echo "</tr>";
        }
        echo "</table>";
        
        echo "<h3>🧮 Cálculo do KM GPS Total</h3>";
        echo "<p><strong>Viagens com trajeto:</strong> $viagensComTrajeto</p>";
        echo "<p><strong>KM GPS Calculado:</strong> " . number_format($kmGpsTotal, 3) . " km</p>";
        
        if ($kmGpsTotal > 0) {
            // Atualizar todas as viagens da rota com o KM GPS calculado
            $sqlUpdate = "UPDATE viagens SET km_gps_final = ? 
                         WHERE id IN (SELECT viagem_id FROM rota_viagens WHERE solicitacao_rota_id = ?)";
            $stmtUpdate = $pdo->prepare($sqlUpdate);
            $success = $stmtUpdate->execute([$kmGpsTotal, $rotaId]);
            
            if ($success) {
                echo "<p class='success'>✅ KM GPS atualizado com sucesso para todas as viagens da rota!</p>";
                echo "<p>• KM GPS Total: " . number_format($kmGpsTotal, 3) . " km</p>";
                echo "<p>• Viagens atualizadas: " . count($viagens) . "</p>";
            } else {
                echo "<p class='error'>❌ Erro ao atualizar KM GPS!</p>";
            }
        } else {
            echo "<p class='warning'>⚠️ Não foi possível calcular KM GPS (sem pontos suficientes)</p>";
        }
        
    } else {
        // Listar rotas que precisam de correção
        echo "<h2>📊 Rotas que Precisam de Correção de KM GPS</h2>";
        
        $sql = "SELECT sr.id, sr.titulo, sr.status, sr.km_estimado, sr.km_real, sr.data_fim_real,
                       COUNT(rv.viagem_id) as total_viagens,
                       SUM(CASE WHEN v.trajeto IS NOT NULL AND v.trajeto != '[]' THEN 1 ELSE 0 END) as viagens_com_trajeto,
                       SUM(CASE WHEN v.km_gps_final IS NULL OR v.km_gps_final = 0 THEN 1 ELSE 0 END) as viagens_sem_km_gps
                FROM solicitacoes_rotas sr
                LEFT JOIN rota_viagens rv ON sr.id = rv.solicitacao_rota_id
                LEFT JOIN viagens v ON rv.viagem_id = v.id
                WHERE sr.status = 'concluida'
                GROUP BY sr.id
                HAVING viagens_sem_km_gps > 0
                ORDER BY sr.data_fim_real DESC 
                LIMIT 20";
        
        $stmt = $pdo->query($sql);
        $rotas = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        if (empty($rotas)) {
            echo "<p class='success'>✅ Todas as rotas já têm KM GPS calculado!</p>";
        } else {
            echo "<table>";
            echo "<tr><th>ID</th><th>Título</th><th>Status</th><th>KM Estimado</th><th>KM Real</th><th>Viagens</th><th>Com Trajeto</th><th>Sem KM GPS</th><th>Ação</th></tr>";
            
            foreach ($rotas as $rota) {
                echo "<tr>";
                echo "<td>{$rota['id']}</td>";
                echo "<td>{$rota['titulo']}</td>";
                echo "<td>{$rota['status']}</td>";
                echo "<td>{$rota['km_estimado']}</td>";
                echo "<td>{$rota['km_real']}</td>";
                echo "<td>{$rota['total_viagens']}</td>";
                echo "<td>{$rota['viagens_com_trajeto']}</td>";
                echo "<td>{$rota['viagens_sem_km_gps']}</td>";
                echo "<td><a href='?rota_id={$rota['id']}' class='btn'>Corrigir</a></td>";
                echo "</tr>";
            }
            echo "</table>";
            
            echo "<h3>🔧 Ações em Lote</h3>";
            echo "<form method='POST'>";
            echo "<input type='submit' name='corrigir_todas' value='Corrigir KM GPS para Todas as Rotas' class='btn'>";
            echo "</form>";
        }
        
        // Processar correção em lote
        if ($_POST && isset($_POST['corrigir_todas'])) {
            echo "<h3>🔄 Corrigindo KM GPS para Todas as Rotas...</h3>";
            
            $sqlTodas = "SELECT DISTINCT sr.id FROM solicitacoes_rotas sr
                        INNER JOIN rota_viagens rv ON sr.id = rv.solicitacao_rota_id
                        INNER JOIN viagens v ON rv.viagem_id = v.id
                        WHERE sr.status = 'concluida'
                        AND (v.km_gps_final IS NULL OR v.km_gps_final = 0)
                        AND v.trajeto IS NOT NULL 
                        AND v.trajeto != '[]'";
            
            $stmtTodas = $pdo->query($sqlTodas);
            $todasRotas = $stmtTodas->fetchAll(PDO::FETCH_ASSOC);
            
            $atualizadas = 0;
            $erros = 0;
            
            foreach ($todasRotas as $rota) {
                $rotaId = $rota['id'];
                
                // Buscar viagens da rota
                $sqlViagens = "SELECT v.id, v.trajeto FROM viagens v 
                              INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                              WHERE rv.solicitacao_rota_id = ?";
                $stmtViagens = $pdo->prepare($sqlViagens);
                $stmtViagens->execute([$rotaId]);
                $viagens = $stmtViagens->fetchAll(PDO::FETCH_ASSOC);
                
                $kmGpsTotal = 0;
                foreach ($viagens as $viagem) {
                    if ($viagem['trajeto']) {
                        $pontos = json_decode($viagem['trajeto'], true);
                        if ($pontos && count($pontos) >= 2) {
                            $distanciaViagem = 0;
                            for ($i = 1; $i < count($pontos); $i++) {
                                $pontoAnterior = $pontos[$i-1];
                                $pontoAtual = $pontos[$i];
                                
                                if (isset($pontoAnterior[0], $pontoAnterior[1], $pontoAtual[0], $pontoAtual[1])) {
                                    // Calcular distância usando Haversine
                                    $R = 6371;
                                    $dLat = deg2rad($pontoAtual[0] - $pontoAnterior[0]);
                                    $dLon = deg2rad($pontoAtual[1] - $pontoAnterior[1]);
                                    $lat1 = deg2rad($pontoAnterior[0]);
                                    $lat2 = deg2rad($pontoAtual[0]);
                                    $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));
                                    $distancia = $R * $c;
                                    $distanciaViagem += $distancia;
                                }
                            }
                            $kmGpsTotal += $distanciaViagem;
                        }
                    }
                }
                
                if ($kmGpsTotal > 0) {
                    $sqlUpdate = "UPDATE viagens SET km_gps_final = ? 
                                 WHERE id IN (SELECT viagem_id FROM rota_viagens WHERE solicitacao_rota_id = ?)";
                    $stmtUpdate = $pdo->prepare($sqlUpdate);
                    $success = $stmtUpdate->execute([$kmGpsTotal, $rotaId]);
                    
                    if ($success) {
                        $atualizadas++;
                    } else {
                        $erros++;
                    }
                }
            }
            
            echo "<p class='success'>✅ Processamento concluído!</p>";
            echo "<p>• Rotas atualizadas: $atualizadas</p>";
            echo "<p>• Erros: $erros</p>";
            
            // Recarregar página
            echo "<script>setTimeout(function(){ location.reload(); }, 2000);</script>";
        }
    }
    
} catch (Exception $e) {
    echo "<p class='error'>❌ Erro: " . $e->getMessage() . "</p>";
}

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