<?php
/**
 * Script de teste para o fluxo completo de aprovação de viagens
 */

require_once __DIR__ . '/config/bootstrap.php';

use ControleFrotas\Config\Database;
use ControleFrotas\Utils\Logger;

echo "=== TESTE DO FLUXO COMPLETO DE APROVAÇÃO ===\n\n";

try {
    $pdo = Database::getConnection();
    
    // 1. Verificar se as tabelas existem
    echo "1. Verificando tabelas necessárias...\n";
    $tabelas = ['solicitacoes_viagem', 'notificacoes_push', 'viagens', 'motoristas'];
    foreach ($tabelas as $tabela) {
        $stmt = $pdo->query("SHOW TABLES LIKE '$tabela'");
        if ($stmt->rowCount() > 0) {
            echo "   ✅ $tabela\n";
        } else {
            echo "   ❌ $tabela (NÃO EXISTE)\n";
        }
    }
    echo "\n";
    
    // 2. Verificar se há motoristas e gestores
    echo "2. Verificando usuários...\n";
    $stmt = $pdo->query("SELECT tipo, COUNT(*) as total FROM motoristas GROUP BY tipo");
    $usuarios = $stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($usuarios as $user) {
        echo "   - {$user['tipo']}: {$user['total']}\n";
    }
    echo "\n";
    
    // 3. Criar solicitação de teste
    echo "3. Criando solicitação de teste...\n";
    
    // Buscar um motorista
    $stmt = $pdo->query("SELECT id, nome FROM motoristas WHERE tipo = 'motorista' LIMIT 1");
    $motorista = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$motorista) {
        echo "   ❌ Nenhum motorista encontrado\n";
        exit;
    }
    
    // Buscar um veículo
    $stmt = $pdo->query("SELECT id, modelo, placa FROM veiculos WHERE status = 'ativo' LIMIT 1");
    $veiculo = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$veiculo) {
        echo "   ❌ Nenhum veículo encontrado\n";
        exit;
    }
    
    // Criar solicitação
    $sql = "INSERT INTO solicitacoes_viagem (
        tecnico_id, veiculo_id, cliente, motivo, km_inicial,
        latitude_inicial, longitude_inicial, endereco_inicial, cliente_id,
        observacoes, prioridade, gestor_id, status, data_criacao
    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'pendente', NOW())";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        $motorista['id'],
        $veiculo['id'],
        'Cliente Teste',
        'Teste de aprovação',
        100,
        -10.92654,
        -37.0731133,
        'Avenida Teste, 123 - Aracaju/SE',
        1,
        'Solicitação de teste para verificar fluxo',
        'normal',
        null
    ]);
    
    $solicitacaoId = $pdo->lastInsertId();
    echo "   ✅ Solicitação criada com ID: $solicitacaoId\n";
    echo "   - Motorista: {$motorista['nome']}\n";
    echo "   - Veículo: {$veiculo['modelo']} ({$veiculo['placa']})\n";
    echo "   - Cliente: Cliente Teste\n";
    echo "\n";
    
    // 4. Verificar se a solicitação foi criada
    echo "4. Verificando solicitação criada...\n";
    $stmt = $pdo->prepare("SELECT * FROM solicitacoes_viagem WHERE id = ?");
    $stmt->execute([$solicitacaoId]);
    $solicitacao = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($solicitacao) {
        echo "   ✅ Solicitação encontrada:\n";
        echo "   - Status: {$solicitacao['status']}\n";
        echo "   - Data: {$solicitacao['data_criacao']}\n";
    } else {
        echo "   ❌ Solicitação não encontrada\n";
    }
    echo "\n";
    
    // 5. Verificar notificações para gestores
    echo "5. Verificando notificações para gestores...\n";
    $stmt = $pdo->query("SELECT COUNT(*) as total FROM notificacoes_push WHERE solicitacao_id = $solicitacaoId");
    $notificacoes = $stmt->fetch(PDO::FETCH_ASSOC);
    echo "   - Notificações criadas: {$notificacoes['total']}\n";
    
    // 6. Simular aprovação por gestor
    echo "6. Simulando aprovação por gestor...\n";
    
    // Buscar um gestor
    $stmt = $pdo->query("SELECT id, nome FROM motoristas WHERE tipo = 'gestor' OR tipo = 'admin' LIMIT 1");
    $gestor = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($gestor) {
        // Atualizar status da solicitação
        $stmt = $pdo->prepare("UPDATE solicitacoes_viagem SET status = 'aprovada', gestor_aprovador = ?, data_aprovacao = NOW() WHERE id = ?");
        $stmt->execute([$gestor['id'], $solicitacaoId]);
        
        // Criar viagem
        $sql = "INSERT INTO viagens (
            tecnico_id, veiculo_id, cliente, motivo, km_inicial,
            data_inicio, latitude_inicial, longitude_inicial,
            endereco_inicial, cliente_id, observacoes, sincronizado
        ) VALUES (?, ?, ?, ?, ?, NOW(), ?, ?, ?, ?, ?, 1)";
        
        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            $solicitacao['tecnico_id'],
            $solicitacao['veiculo_id'],
            $solicitacao['cliente'],
            $solicitacao['motivo'],
            $solicitacao['km_inicial'],
            $solicitacao['latitude_inicial'],
            $solicitacao['longitude_inicial'],
            $solicitacao['endereco_inicial'],
            $solicitacao['cliente_id'],
            'Viagem criada após aprovação da solicitação #' . $solicitacaoId
        ]);
        
        $viagemId = $pdo->lastInsertId();
        echo "   ✅ Solicitação aprovada por {$gestor['nome']}\n";
        echo "   ✅ Viagem criada com ID: $viagemId\n";
        
        // Criar notificação para motorista
        $sql = "INSERT INTO notificacoes_push (user_id, tipo, titulo, mensagem, solicitacao_id, viagem_id, data_envio) VALUES (?, ?, ?, ?, ?, ?, NOW())";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            $solicitacao['tecnico_id'],
            'aprovacao_viagem',
            '✅ Solicitação Aprovada',
            'Sua solicitação foi aprovada! Você pode iniciar a viagem.',
            $solicitacaoId,
            $viagemId
        ]);
        
        echo "   ✅ Notificação enviada para motorista\n";
    } else {
        echo "   ❌ Nenhum gestor encontrado\n";
    }
    echo "\n";
    
    // 7. Verificar resultado final
    echo "7. Verificando resultado final...\n";
    
    // Verificar solicitação
    $stmt = $pdo->prepare("SELECT status, gestor_aprovador FROM solicitacoes_viagem WHERE id = ?");
    $stmt->execute([$solicitacaoId]);
    $solicitacaoFinal = $stmt->fetch(PDO::FETCH_ASSOC);
    
    echo "   - Status da solicitação: {$solicitacaoFinal['status']}\n";
    echo "   - Aprovada por: {$solicitacaoFinal['gestor_aprovador']}\n";
    
    // Verificar viagem criada
    $stmt = $pdo->prepare("SELECT id, tecnico_id, veiculo_id, cliente FROM viagens WHERE tecnico_id = ? AND veiculo_id = ? ORDER BY id DESC LIMIT 1");
    $stmt->execute([$solicitacao['tecnico_id'], $solicitacao['veiculo_id']]);
    $viagem = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($viagem) {
        echo "   - Viagem criada: ID {$viagem['id']}\n";
        echo "   - Cliente: {$viagem['cliente']}\n";
    }
    
    // Verificar notificações
    $stmt = $pdo->prepare("SELECT COUNT(*) as total FROM notificacoes_push WHERE solicitacao_id = ?");
    $stmt->execute([$solicitacaoId]);
    $totalNotificacoes = $stmt->fetch(PDO::FETCH_ASSOC);
    echo "   - Total de notificações: {$totalNotificacoes['total']}\n";
    
    echo "\n=== TESTE CONCLUÍDO ===\n";
    echo "✅ Fluxo de aprovação funcionando corretamente!\n";
    
} catch (Exception $e) {
    echo "❌ ERRO: " . $e->getMessage() . "\n";
    echo "Stack trace:\n" . $e->getTraceAsString() . "\n";
}
?> 
