<?php
// Script para verificar e corrigir checklists com viagem_id incorreto

require_once 'config/database.php';

function verificarChecklistsIncorretos($pdo) {
    echo "=== VERIFICAÇÃO DE CHECKLISTS COM IDS INCORRETOS ===\n\n";
    
    // 1. Buscar checklists com viagem_id que não existe na tabela viagens
    $sql = "SELECT c.id, c.viagem_id, c.veiculo_id, c.data_hora, c.sincronizado,
                   'Viagem não existe' as problema
            FROM checklist_veiculo c
            LEFT JOIN viagens v ON c.viagem_id = v.id
            WHERE v.id IS NULL
            ORDER BY c.data_hora DESC";
    
    $stmt = $pdo->query($sql);
    $checklistsIncorretos = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (empty($checklistsIncorretos)) {
        echo "✅ Nenhum checklist com ID incorreto encontrado!\n";
        return [];
    }
    
    echo "❌ Encontrados " . count($checklistsIncorretos) . " checklists com viagem_id incorreto:\n\n";
    
    foreach ($checklistsIncorretos as $checklist) {
        echo "📋 Checklist ID: {$checklist['id']}\n";
        echo "   - viagem_id (incorreto): {$checklist['viagem_id']}\n";
        echo "   - veiculo_id: {$checklist['veiculo_id']}\n";
        echo "   - data_hora: {$checklist['data_hora']}\n";
        echo "   - sincronizado: " . ($checklist['sincronizado'] ? 'Sim' : 'Não') . "\n";
        echo "\n";
    }
    
    return $checklistsIncorretos;
}

function corrigirChecklistsAutomaticamente($pdo, $checklistsIncorretos) {
    echo "\n=== CORREÇÃO AUTOMÁTICA DE IDS ===\n\n";
    
    $corrigidos = 0;
    $naoCorrigidos = 0;
    
    foreach ($checklistsIncorretos as $checklist) {
        echo "🔧 Corrigindo checklist ID: {$checklist['id']}\n";
        
        $viagemCorreta = buscarViagemCorreta($pdo, $checklist);
        
        if ($viagemCorreta) {
            // Atualizar o checklist com o ID correto
            $sql = "UPDATE checklist_veiculo 
                    SET viagem_id = ? 
                    WHERE id = ?";
            
            $stmt = $pdo->prepare($sql);
            $resultado = $stmt->execute([$viagemCorreta['id'], $checklist['id']]);
            
            if ($resultado) {
                echo "   ✅ CORRIGIDO: viagem_id alterado de {$checklist['viagem_id']} para {$viagemCorreta['id']}\n";
                echo "   📄 Viagem: {$viagemCorreta['cliente']} - {$viagemCorreta['data_inicio']}\n";
                $corrigidos++;
            } else {
                echo "   ❌ ERRO ao atualizar checklist no banco\n";
                $naoCorrigidos++;
            }
        } else {
            echo "   ❌ Não foi possível encontrar viagem correta\n";
            $naoCorrigidos++;
        }
        
        echo "\n";
    }
    
    echo "📊 RESULTADO:\n";
    echo "   - Corrigidos: $corrigidos\n";
    echo "   - Não corrigidos: $naoCorrigidos\n";
    echo "   - Total: " . ($corrigidos + $naoCorrigidos) . "\n\n";
}

function buscarViagemCorreta($pdo, $checklist) {
    $veiculoId = $checklist['veiculo_id'];
    $dataChecklist = date('Y-m-d', strtotime($checklist['data_hora']));
    
    echo "   🔍 Buscando viagem para veículo $veiculoId na data $dataChecklist\n";
    
    // Critério 1: Mesmo veículo, mesmo dia
    $sql = "SELECT id, data_inicio, cliente, motivo 
            FROM viagens 
            WHERE veiculo_id = ? 
            AND DATE(data_inicio) = ?
            ORDER BY data_inicio DESC 
            LIMIT 1";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$veiculoId, $dataChecklist]);
    $viagem = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($viagem) {
        echo "   ✅ Encontrada pelo critério 1 (mesmo dia): ID {$viagem['id']}\n";
        return $viagem;
    }
    
    // Critério 2: Mesmo veículo, ±1 dia
    $sql = "SELECT id, data_inicio, cliente, motivo 
            FROM viagens 
            WHERE veiculo_id = ? 
            AND DATE(data_inicio) BETWEEN DATE(?) - INTERVAL 1 DAY AND DATE(?) + INTERVAL 1 DAY
            ORDER BY ABS(DATEDIFF(DATE(data_inicio), ?)) ASC, data_inicio DESC
            LIMIT 1";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$veiculoId, $dataChecklist, $dataChecklist, $dataChecklist]);
    $viagem = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($viagem) {
        echo "   ✅ Encontrada pelo critério 2 (±1 dia): ID {$viagem['id']}\n";
        return $viagem;
    }
    
    // Critério 3: Mesmo veículo, últimas 48h da data do checklist
    $sql = "SELECT id, data_inicio, cliente, motivo 
            FROM viagens 
            WHERE veiculo_id = ? 
            AND data_inicio >= DATE(?) - INTERVAL 48 HOUR
            AND data_inicio <= DATE(?) + INTERVAL 24 HOUR
            ORDER BY data_inicio DESC
            LIMIT 1";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$veiculoId, $dataChecklist, $dataChecklist]);
    $viagem = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($viagem) {
        echo "   ✅ Encontrada pelo critério 3 (±48h): ID {$viagem['id']}\n";
        return $viagem;
    }
    
    echo "   ❌ Nenhuma viagem encontrada por todos os critérios\n";
    return null;
}

function verificarResultadoFinal($pdo) {
    echo "\n=== VERIFICAÇÃO FINAL ===\n\n";
    
    $sql = "SELECT COUNT(*) as total
            FROM checklist_veiculo c
            LEFT JOIN viagens v ON c.viagem_id = v.id
            WHERE v.id IS NULL";
    
    $stmt = $pdo->query($sql);
    $resultado = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($resultado['total'] == 0) {
        echo "✅ Todos os checklists agora têm viagem_id correto!\n";
    } else {
        echo "⚠️  Ainda existem {$resultado['total']} checklists com problemas\n";
    }
    
    // Mostrar estatísticas gerais
    $sql = "SELECT 
                COUNT(*) as total_checklists,
                COUNT(DISTINCT viagem_id) as viagens_distintas,
                COUNT(DISTINCT veiculo_id) as veiculos_distintos
            FROM checklist_veiculo";
    
    $stmt = $pdo->query($sql);
    $stats = $stmt->fetch(PDO::FETCH_ASSOC);
    
    echo "\n📊 ESTATÍSTICAS GERAIS:\n";
    echo "   - Total de checklists: {$stats['total_checklists']}\n";
    echo "   - Viagens distintas: {$stats['viagens_distintas']}\n";
    echo "   - Veículos distintos: {$stats['veiculos_distintos']}\n";
}

// Execução principal
try {
    $pdo = conectarBanco();
    
    echo "🚀 INICIANDO VERIFICAÇÃO DE CHECKLISTS...\n\n";
    
    // Verificar checklists com problemas
    $checklistsIncorretos = verificarChecklistsIncorretos($pdo);
    
    if (!empty($checklistsIncorretos)) {
        // Perguntar se deseja corrigir (simulação - em produção seria um parâmetro)
        echo "❓ Deseja corrigir automaticamente os IDs incorretos? (y/n)\n";
        echo "   (Para execução, altere a variável \$executarCorrecao abaixo)\n\n";
        
        $executarCorrecao = false; // Altere para true para executar correção
        
        if ($executarCorrecao) {
            corrigirChecklistsAutomaticamente($pdo, $checklistsIncorretos);
        } else {
            echo "ℹ️  Correção não executada. Para executar, altere \$executarCorrecao = true\n";
        }
    }
    
    // Verificação final
    verificarResultadoFinal($pdo);
    
    echo "\n✅ VERIFICAÇÃO CONCLUÍDA!\n";
    
} catch (Exception $e) {
    echo "❌ ERRO: " . $e->getMessage() . "\n";
}
?> 
