<?php
/**
 * 🚗 SISTEMA COMPLETO DE CONFERÊNCIA DE QUILOMETRAGEM
 * 
 * Este sistema vai:
 * 1. Armazenar odômetro inicial e final
 * 2. Armazenar KM de estimativa da viagem
 * 3. Armazenar KM de estimativa dos clientes
 * 4. Calcular KM GPS real
 * 5. Fazer conferência entre todos os dados
 */

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

// Conectar ao banco
$pdo = new PDO(
    "mysql:host=localhost;dbname=pinheir3_controle_frotasV1.1;charset=utf8mb4",
    "pinheir3_admin",
    "080880Gelboy"
);

// Função Haversine para calcular distância GPS
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;
}

echo "<h1>🚗 SISTEMA DE CONFERÊNCIA DE QUILOMETRAGEM</h1>";

// 1. PRIMEIRO: Atualizar estrutura da tabela viagens
echo "<h2>🔧 1. Atualizando estrutura da tabela viagens</h2>";

try {
    // Adicionar novas colunas se não existirem
    $colunas_novas = [
        'odometro_inicial' => 'DECIMAL(10,2) DEFAULT NULL COMMENT "Odômetro inicial do veículo"',
        'odometro_final' => 'DECIMAL(10,2) DEFAULT NULL COMMENT "Odômetro final do veículo"',
        'km_estimativa_viagem' => 'DECIMAL(10,2) DEFAULT NULL COMMENT "KM estimado para a viagem"',
        'km_estimativa_clientes' => 'DECIMAL(10,2) DEFAULT NULL COMMENT "KM estimado dos clientes"',
        'km_gps_real' => 'DECIMAL(10,2) DEFAULT NULL COMMENT "KM real calculado via GPS"',
        'diferenca_odometro_gps' => 'DECIMAL(10,2) DEFAULT NULL COMMENT "Diferença entre odômetro e GPS"',
        'diferenca_estimativa_real' => 'DECIMAL(10,2) DEFAULT NULL COMMENT "Diferença entre estimativa e real"',
        'status_conferencia' => 'VARCHAR(20) DEFAULT "pendente" COMMENT "Status da conferência: pendente, aprovada, divergente"',
        'observacoes_conferencia' => 'TEXT DEFAULT NULL COMMENT "Observações sobre a conferência"'
    ];
    
    foreach ($colunas_novas as $coluna => $definicao) {
        try {
            $sql = "ALTER TABLE viagens ADD COLUMN $coluna $definicao";
            $pdo->exec($sql);
            echo "<p style='color: green;'>✅ Coluna <strong>$coluna</strong> adicionada com sucesso</p>";
        } catch (PDOException $e) {
            if (strpos($e->getMessage(), 'Duplicate column name') !== false) {
                echo "<p style='color: orange;'>⚠️ Coluna <strong>$coluna</strong> já existe</p>";
            } else {
                echo "<p style='color: red;'>❌ Erro ao adicionar coluna <strong>$coluna</strong>: " . $e->getMessage() . "</p>";
            }
        }
    }
    
} catch (Exception $e) {
    echo "<p style='color: red;'>❌ Erro geral: " . $e->getMessage() . "</p>";
}

// 2. CALCULAR KM GPS REAL para todas as viagens
echo "<h2>📍 2. Calculando KM GPS real para todas as viagens</h2>";

try {
    // Buscar viagens que não têm km_gps_real calculado
    $sql = "SELECT id, cliente, km_inicial, km_final, km_gps_final 
            FROM viagens 
            WHERE (km_gps_real IS NULL OR km_gps_real = 0)
            AND data_fim IS NOT NULL
            ORDER BY id DESC 
            LIMIT 20";
    
    $stmt = $pdo->query($sql);
    $viagens = $stmt->fetchAll();
    
    echo "<p><strong>Viagens para calcular KM GPS real:</strong> " . count($viagens) . "</p>";
    
    foreach ($viagens as $viagem) {
        // Buscar pontos GPS da viagem
        $sql_pontos = "SELECT latitude, longitude, timestamp 
                       FROM rastreamento_tempo_real 
                       WHERE viagem_id = ? 
                       ORDER BY timestamp ASC";
        $stmt_pontos = $pdo->prepare($sql_pontos);
        $stmt_pontos->execute([$viagem['id']]);
        $pontos = $stmt_pontos->fetchAll();
        
        if (count($pontos) > 1) {
            // Calcular distância total
            $distanciaTotal = 0;
            for ($i = 0; $i < count($pontos) - 1; $i++) {
                $lat1 = $pontos[$i]['latitude'];
                $lon1 = $pontos[$i]['longitude'];
                $lat2 = $pontos[$i + 1]['latitude'];
                $lon2 = $pontos[$i + 1]['longitude'];
                
                $distancia = haversine($lat1, $lon1, $lat2, $lon2);
                $distanciaTotal += $distancia;
            }
            
            // Atualizar km_gps_real
            $sql_update = "UPDATE viagens SET km_gps_real = ? WHERE id = ?";
            $stmt_update = $pdo->prepare($sql_update);
            $stmt_update->execute([$distanciaTotal, $viagem['id']]);
            
            echo "<p>✅ Viagem #{$viagem['id']}: KM GPS real = " . number_format($distanciaTotal, 2) . " km (baseado em " . count($pontos) . " pontos)</p>";
        } else {
            echo "<p style='color: orange;'>⚠️ Viagem #{$viagem['id']}: Poucos pontos GPS (" . count($pontos) . " pontos)</p>";
        }
    }
    
} catch (Exception $e) {
    echo "<p style='color: red;'>❌ Erro ao calcular KM GPS: " . $e->getMessage() . "</p>";
}

// 3. FUNÇÃO PARA ATUALIZAR ODÔMETRO
echo "<h2>🔢 3. Função para atualizar odômetro</h2>";

if (isset($_POST['atualizar_odometro'])) {
    $viagem_id = $_POST['viagem_id'];
    $odometro_inicial = $_POST['odometro_inicial'];
    $odometro_final = $_POST['odometro_final'];
    
    try {
        $sql = "UPDATE viagens SET 
                odometro_inicial = ?, 
                odometro_final = ?,
                updated_at = NOW()
                WHERE id = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$odometro_inicial, $odometro_final, $viagem_id]);
        
        echo "<p style='color: green;'>✅ Odômetro atualizado para viagem #$viagem_id</p>";
    } catch (Exception $e) {
        echo "<p style='color: red;'>❌ Erro ao atualizar odômetro: " . $e->getMessage() . "</p>";
    }
}

// 4. FUNÇÃO PARA ATUALIZAR ESTIMATIVAS
echo "<h2>📊 4. Função para atualizar estimativas</h2>";

if (isset($_POST['atualizar_estimativas'])) {
    $viagem_id = $_POST['viagem_id'];
    $km_estimativa_viagem = $_POST['km_estimativa_viagem'];
    $km_estimativa_clientes = $_POST['km_estimativa_clientes'];
    
    try {
        $sql = "UPDATE viagens SET 
                km_estimativa_viagem = ?, 
                km_estimativa_clientes = ?,
                updated_at = NOW()
                WHERE id = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$km_estimativa_viagem, $km_estimativa_clientes, $viagem_id]);
        
        echo "<p style='color: green;'>✅ Estimativas atualizadas para viagem #$viagem_id</p>";
    } catch (Exception $e) {
        echo "<p style='color: red;'>❌ Erro ao atualizar estimativas: " . $e->getMessage() . "</p>";
    }
}

// 5. CALCULAR DIFERENÇAS E STATUS
echo "<h2>🔍 5. Calculando diferenças e status de conferência</h2>";

try {
    $sql = "UPDATE viagens SET 
            diferenca_odometro_gps = CASE 
                WHEN odometro_final IS NOT NULL AND odometro_inicial IS NOT NULL AND km_gps_real IS NOT NULL 
                THEN (odometro_final - odometro_inicial) - km_gps_real
                ELSE NULL 
            END,
            diferenca_estimativa_real = CASE 
                WHEN km_estimativa_viagem IS NOT NULL AND km_gps_real IS NOT NULL 
                THEN km_estimativa_viagem - km_gps_real
                ELSE NULL 
            END,
            status_conferencia = CASE 
                WHEN odometro_final IS NOT NULL AND odometro_inicial IS NOT NULL AND km_gps_real IS NOT NULL 
                THEN CASE 
                    WHEN ABS((odometro_final - odometro_inicial) - km_gps_real) <= 2 THEN 'aprovada'
                    WHEN ABS((odometro_final - odometro_inicial) - km_gps_real) <= 5 THEN 'divergente_pequena'
                    ELSE 'divergente_grande'
                END
                ELSE 'pendente'
            END,
            observacoes_conferencia = CASE 
                WHEN odometro_final IS NOT NULL AND odometro_inicial IS NOT NULL AND km_gps_real IS NOT NULL 
                THEN CONCAT('Odômetro: ', (odometro_final - odometro_inicial), ' km | GPS: ', km_gps_real, ' km | Diferença: ', 
                           ROUND(ABS((odometro_final - odometro_inicial) - km_gps_real), 2), ' km')
                ELSE 'Aguardando dados completos'
            END
            WHERE data_fim IS NOT NULL";
    
    $pdo->exec($sql);
    echo "<p style='color: green;'>✅ Conferências calculadas para todas as viagens</p>";
    
} catch (Exception $e) {
    echo "<p style='color: red;'>❌ Erro ao calcular conferências: " . $e->getMessage() . "</p>";
}

// 6. RELATÓRIO DE CONFERÊNCIA
echo "<h2>📋 6. Relatório de Conferência</h2>";

try {
    $sql = "SELECT 
                id, cliente, 
                odometro_inicial, odometro_final,
                (odometro_final - odometro_inicial) as km_odometro,
                km_estimativa_viagem, km_estimativa_clientes,
                km_gps_real, km_gps_final,
                diferenca_odometro_gps, diferenca_estimativa_real,
                status_conferencia, observacoes_conferencia,
                data_inicio, data_fim
            FROM viagens 
            WHERE data_fim IS NOT NULL
            ORDER BY id DESC 
            LIMIT 20";
    
    $stmt = $pdo->query($sql);
    $relatorio = $stmt->fetchAll();
    
    echo "<table border='1' style='border-collapse: collapse; width: 100%; font-size: 12px;'>";
    echo "<tr style='background: #f0f0f0;'>";
    echo "<th>ID</th><th>Cliente</th><th>Odômetro</th><th>KM Odômetro</th>";
    echo "<th>Est. Viagem</th><th>Est. Clientes</th><th>GPS Real</th><th>GPS Final</th>";
    echo "<th>Dif. Odômetro</th><th>Dif. Estimativa</th><th>Status</th>";
    echo "</tr>";
    
    foreach ($relatorio as $viagem) {
        $status_color = '';
        switch ($viagem['status_conferencia']) {
            case 'aprovada': $status_color = 'background: #ccffcc;'; break;
            case 'divergente_pequena': $status_color = 'background: #ffffcc;'; break;
            case 'divergente_grande': $status_color = 'background: #ffcccc;'; break;
            default: $status_color = 'background: #f0f0f0;'; break;
        }
        
        echo "<tr>";
        echo "<td>{$viagem['id']}</td>";
        echo "<td>{$viagem['cliente']}</td>";
        echo "<td>{$viagem['odometro_inicial']} → {$viagem['odometro_final']}</td>";
        echo "<td>" . ($viagem['km_odometro'] ? number_format($viagem['km_odometro'], 1) : '-') . "</td>";
        echo "<td>" . ($viagem['km_estimativa_viagem'] ? number_format($viagem['km_estimativa_viagem'], 1) : '-') . "</td>";
        echo "<td>" . ($viagem['km_estimativa_clientes'] ? number_format($viagem['km_estimativa_clientes'], 1) : '-') . "</td>";
        echo "<td>" . ($viagem['km_gps_real'] ? number_format($viagem['km_gps_real'], 2) : '-') . "</td>";
        echo "<td>" . ($viagem['km_gps_final'] ? number_format($viagem['km_gps_final'], 2) : '-') . "</td>";
        echo "<td>" . ($viagem['diferenca_odometro_gps'] ? number_format($viagem['diferenca_odometro_gps'], 2) : '-') . "</td>";
        echo "<td>" . ($viagem['diferenca_estimativa_real'] ? number_format($viagem['diferenca_estimativa_real'], 2) : '-') . "</td>";
        echo "<td style='$status_color'>{$viagem['status_conferencia']}</td>";
        echo "</tr>";
    }
    echo "</table>";
    
} catch (Exception $e) {
    echo "<p style='color: red;'>❌ Erro ao gerar relatório: " . $e->getMessage() . "</p>";
}

// 7. FORMULÁRIOS PARA ATUALIZAÇÃO
echo "<h2>📝 7. Formulários para atualização</h2>";

echo "<h3>🔢 Atualizar Odômetro</h3>";
echo "<form method='POST' style='margin: 10px 0; padding: 10px; border: 1px solid #ccc;'>";
echo "<label>Viagem ID: <input type='number' name='viagem_id' required></label><br>";
echo "<label>Odômetro Inicial: <input type='number' step='0.1' name='odometro_inicial' required></label><br>";
echo "<label>Odômetro Final: <input type='number' step='0.1' name='odometro_final' required></label><br>";
echo "<input type='submit' name='atualizar_odometro' value='Atualizar Odômetro'>";
echo "</form>";

echo "<h3>📊 Atualizar Estimativas</h3>";
echo "<form method='POST' style='margin: 10px 0; padding: 10px; border: 1px solid #ccc;'>";
echo "<label>Viagem ID: <input type='number' name='viagem_id' required></label><br>";
echo "<label>KM Estimativa Viagem: <input type='number' step='0.1' name='km_estimativa_viagem' required></label><br>";
echo "<label>KM Estimativa Clientes: <input type='number' step='0.1' name='km_estimativa_clientes' required></label><br>";
echo "<input type='submit' name='atualizar_estimativas' value='Atualizar Estimativas'>";
echo "</form>";

// 8. ESTATÍSTICAS
echo "<h2>📈 8. Estatísticas do Sistema</h2>";

try {
    $sql = "SELECT 
                COUNT(*) as total_viagens,
                COUNT(CASE WHEN status_conferencia = 'aprovada' THEN 1 END) as aprovadas,
                COUNT(CASE WHEN status_conferencia = 'divergente_pequena' THEN 1 END) as divergentes_pequenas,
                COUNT(CASE WHEN status_conferencia = 'divergente_grande' THEN 1 END) as divergentes_grandes,
                COUNT(CASE WHEN status_conferencia = 'pendente' THEN 1 END) as pendentes,
                AVG(CASE WHEN diferenca_odometro_gps IS NOT NULL THEN ABS(diferenca_odometro_gps) END) as media_diferenca_odometro,
                AVG(CASE WHEN diferenca_estimativa_real IS NOT NULL THEN ABS(diferenca_estimativa_real) END) as media_diferenca_estimativa
            FROM viagens 
            WHERE data_fim IS NOT NULL";
    
    $stmt = $pdo->query($sql);
    $stats = $stmt->fetch();
    
    echo "<div style='background: #f9f9f9; padding: 15px; border-radius: 5px;'>";
    echo "<h3>📊 Resumo Geral:</h3>";
    echo "<ul>";
    echo "<li><strong>Total de viagens:</strong> {$stats['total_viagens']}</li>";
    echo "<li><strong>Aprovadas:</strong> {$stats['aprovadas']} (" . round(($stats['aprovadas']/$stats['total_viagens'])*100, 1) . "%)</li>";
    echo "<li><strong>Divergentes pequenas:</strong> {$stats['divergentes_pequenas']} (" . round(($stats['divergentes_pequenas']/$stats['total_viagens'])*100, 1) . "%)</li>";
    echo "<li><strong>Divergentes grandes:</strong> {$stats['divergentes_grandes']} (" . round(($stats['divergentes_grandes']/$stats['total_viagens'])*100, 1) . "%)</li>";
    echo "<li><strong>Pendentes:</strong> {$stats['pendentes']} (" . round(($stats['pendentes']/$stats['total_viagens'])*100, 1) . "%)</li>";
    echo "<li><strong>Média diferença odômetro-GPS:</strong> " . number_format($stats['media_diferenca_odometro'], 2) . " km</li>";
    echo "<li><strong>Média diferença estimativa-real:</strong> " . number_format($stats['media_diferenca_estimativa'], 2) . " km</li>";
    echo "</ul>";
    echo "</div>";
    
} catch (Exception $e) {
    echo "<p style='color: red;'>❌ Erro ao calcular estatísticas: " . $e->getMessage() . "</p>";
}

echo "<hr>";
echo "<p><em>Sistema de conferência gerado em: " . date('Y-m-d H:i:s') . "</em></p>";
?>
