<?php
/**
 * API para Detalhes Completos da Viagem/Rota
 * Inclui informações de gestor, operador GPS, clientes da rota e outras informações pertinentes
 */

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET');
header('Access-Control-Allow-Headers: Content-Type');

// Configuração básica de conexão
$host = 'localhost';
$dbname = 'pinheir3_controle_frotasV1.1';
$username = 'pinheir3_admin';
$password = '080880Gelboy';

try {
    // Conectar ao banco
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // Pegar ID da viagem do parâmetro
    $viagemId = $_GET['id'] ?? 0;
    
    if (!$viagemId) {
        sendError('ID da viagem é obrigatório', 400);
        exit;
    }
    
    error_log("🔍 Buscando detalhes completos da viagem ID: $viagemId");
    
    // Query principal para buscar viagem com todas as informações relacionadas
    $sql = "
        SELECT 
            v.id,
            v.cliente,
            v.motivo,
            v.tecnico_id,
            v.veiculo_id,
            v.km_inicial,
            v.km_final,
            v.km_gps_final,
            v.data_inicio,
            v.data_fim,
            v.latitude_inicial,
            v.longitude_inicial,
            v.latitude_final,
            v.longitude_final,
            v.endereco_inicial,
            v.endereco_final,
            v.observacoes,
            v.trajeto,
            v.sincronizado,
            v.created_at,
            v.updated_at,
            
            -- Informações do técnico/motorista
            COALESCE(m.nome, 'Técnico não identificado') as tecnico_nome,
            COALESCE(m.matricula, 'N/A') as tecnico_matricula,
            COALESCE(m.telefone, 'N/A') as tecnico_telefone,
            
            -- Informações do veículo
            COALESCE(ve.modelo, 'Veículo não identificado') as veiculo_nome,
            COALESCE(ve.placa, 'N/A') as veiculo_placa,
            COALESCE(ve.ano, 'N/A') as veiculo_ano,
            COALESCE(ve.cor, 'N/A') as veiculo_cor,
            CONCAT(COALESCE(ve.modelo, 'Veículo não identificado'), ' - ', COALESCE(ve.placa, 'N/A')) as veiculo_completo,
            
                         -- Informações de solicitação (rota ou viagem)
             COALESCE(sr.id, sv.id) as solicitacao_id,
             COALESCE(sr.status, sv.status) as status_solicitacao,
             COALESCE(sr.prioridade, sv.prioridade) as prioridade,
             COALESCE(sr.created_at, sv.created_at) as data_solicitacao,
             COALESCE(sr.updated_at, sv.updated_at) as data_resposta,
             COALESCE(sr.observacoes, sv.observacoes) as justificativa_gestor,
             
             -- Informações do gestor que aprovou
             COALESCE(g.nome, 'Não informado') as gestor_nome,
             COALESCE(g.telefone, 'N/A') as gestor_telefone,
             COALESCE(g.matricula, 'N/A') as gestor_email,
            
            -- Informações de rota (se for uma rota)
            sr.id as rota_id,
            sr.titulo as titulo_rota,
            sr.descricao as descricao_rota,
            sr.data_prevista,
            sr.hora_inicio_prevista,
            sr.duracao_estimada,
            sr.km_estimado,
            sr.status as status_rota,
            sr.data_inicio_real,
            sr.data_fim_real,
            sr.km_real,
            sr.diferenca_km_calculada,
            sr.justificativa_km,
            sr.observacoes_finais,
            
            -- Informações do operador GPS
            COALESCE(og.nome, 'Não informado') as operador_gps_nome,
            COALESCE(og.telefone, 'N/A') as operador_gps_telefone,
            COALESCE(og.usuario, 'N/A') as operador_gps_email,
            
            -- Logs de liberação
            llp.created_at as data_liberacao,
            llp.observacoes as observacoes_operador,
            
            -- Contadores
            (SELECT COUNT(*) FROM rastreamento_tempo_real WHERE viagem_id = v.id) as total_pontos_gps,
            (SELECT COUNT(*) FROM rota_clientes WHERE solicitacao_rota_id = sr.id) as total_clientes_rota
            
                 FROM viagens v
         LEFT JOIN motoristas m ON v.tecnico_id = m.id
         LEFT JOIN veiculos ve ON v.veiculo_id = ve.id
         
         -- Left join com solicitações de rota (se for uma rota)
         LEFT JOIN solicitacoes_rotas sr ON v.id = (SELECT viagem_id FROM rota_viagens WHERE solicitacao_rota_id = sr.id LIMIT 1)
         
         -- Left join com gestor da rota
         LEFT JOIN motoristas g ON sr.gestor_id = g.id
         
         -- Left join com solicitações de viagem (se for viagem simples)
         LEFT JOIN solicitacoes_viagem sv ON v.tecnico_id = sv.tecnico_id 
             AND v.cliente = sv.cliente 
             AND v.motivo = sv.motivo
             AND sv.status = 'aprovada'
             AND sr.id IS NULL -- só se não for rota
         

        
        -- Left join com operador GPS
        LEFT JOIN operadores_gps og ON sr.operador_gps_id = og.id
        
        -- Left join com logs de liberação
        LEFT JOIN logs_liberacao_partida llp ON sr.id = llp.registro_id AND llp.tipo_liberacao = 'rota'
        
        WHERE v.id = ?
        ORDER BY v.id DESC
        LIMIT 1
    ";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$viagemId]);
    $viagem = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$viagem) {
        sendError("Viagem com ID $viagemId não encontrada", 404);
        exit;
    }
    
    error_log("✅ Viagem encontrada: " . json_encode($viagem));
    
    // Buscar pontos GPS se existirem
    $pontosGPS = [];
    if ($viagem['total_pontos_gps'] > 0) {
        $sqlGPS = "
            SELECT 
                latitude,
                longitude,
                timestamp_gps as timestamp,
                velocidade,
                precisao,
                altitude,
                battery_level
            FROM rastreamento_tempo_real 
            WHERE viagem_id = ? 
            ORDER BY timestamp_gps ASC
        ";
        $stmtGPS = $pdo->prepare($sqlGPS);
        $stmtGPS->execute([$viagemId]);
        $pontosGPS = $stmtGPS->fetchAll(PDO::FETCH_ASSOC);
        
        error_log("📍 Pontos GPS encontrados: " . count($pontosGPS));
    }
    
    // Buscar clientes da rota se for uma rota
    $clientesRota = [];
    if ($viagem['rota_id'] && $viagem['total_clientes_rota'] > 0) {
        $sqlClientes = "
            SELECT 
                id,
                nome_cliente as nome,
                endereco,
                telefone,
                motivo_atendimento,
                ordem_sequencia as ordem,
                tempo_estimado,
                observacoes,
                latitude,
                longitude
            FROM rota_clientes 
            WHERE solicitacao_rota_id = ? 
            ORDER BY ordem_sequencia ASC, id ASC
        ";
        $stmtClientes = $pdo->prepare($sqlClientes);
        $stmtClientes->execute([$viagem['rota_id']]);
        $clientesRota = $stmtClientes->fetchAll(PDO::FETCH_ASSOC);
        
        error_log("👥 Clientes da rota encontrados: " . count($clientesRota));
    }
    
    // Buscar viagens relacionadas à rota
    $viagensRota = [];
    if ($viagem['rota_id']) {
        $sqlViagensRota = "
            SELECT 
                rv.id,
                rv.ordem_execucao,
                v.cliente,
                v.motivo,
                v.data_inicio,
                v.data_fim,
                v.km_inicial,
                v.km_final,
                v.km_gps_final,
                CASE 
                    WHEN v.data_fim IS NULL THEN 'em_andamento'
                    ELSE 'finalizada'
                END as status
            FROM rota_viagens rv
            LEFT JOIN viagens v ON rv.viagem_id = v.id
            WHERE rv.solicitacao_rota_id = ?
            ORDER BY rv.ordem_execucao ASC
        ";
        $stmtViagensRota = $pdo->prepare($sqlViagensRota);
        $stmtViagensRota->execute([$viagem['rota_id']]);
        $viagensRota = $stmtViagensRota->fetchAll(PDO::FETCH_ASSOC);
        
        error_log("🛣️ Viagens da rota encontradas: " . count($viagensRota));
    }
    
    // Decodificar trajeto JSON se existir
    if ($viagem['trajeto']) {
        $trajetoDecoded = json_decode($viagem['trajeto'], true);
        if (is_array($trajetoDecoded)) {
            $viagem['trajeto_gps'] = $trajetoDecoded;
            error_log("🗺️ Trajeto GPS decodificado: " . count($trajetoDecoded) . " pontos");
        } else {
            $viagem['trajeto_gps'] = [];
            error_log("⚠️ Trajeto GPS não pôde ser decodificado");
        }
    } else {
        $viagem['trajeto_gps'] = [];
    }
    
    // Calcular estatísticas
    $estatisticas = calcularEstatisticas($viagem, $pontosGPS);
    
    // Montar resposta completa
    $resposta = [
        'sucesso' => true,
        'dados' => [
            // Dados básicos da viagem
            'viagem' => $viagem,
            
            // Pontos GPS
            'pontos_gps' => $pontosGPS,
            'total_pontos_gps' => count($pontosGPS),
            
            // Clientes da rota (se aplicável)
            'clientes_rota' => $clientesRota,
            'total_clientes_rota' => count($clientesRota),
            
            // Viagens da rota (se aplicável)
            'viagens_rota' => $viagensRota,
            'total_viagens_rota' => count($viagensRota),
            
            // Estatísticas calculadas
            'estatisticas' => $estatisticas,
            
            // Informações de contexto
            'tipo_viagem' => $viagem['rota_id'] ? 'rota' : 'viagem_simples',
            'tem_solicitacao' => !empty($viagem['solicitacao_id']),
            'tem_operador_gps' => !empty($viagem['operador_gps_nome']),
            'tem_gestor' => !empty($viagem['gestor_nome']),
            'tem_pontos_gps' => count($pontosGPS) > 0
        ],
        'mensagem' => 'Detalhes completos da viagem carregados com sucesso'
    ];
    
    error_log("✅ Resposta completa preparada");
    echo json_encode($resposta, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    
} catch (Exception $e) {
    error_log("❌ Erro ao buscar detalhes da viagem: " . $e->getMessage());
    sendError('Erro interno: ' . $e->getMessage(), 500);
}

function calcularEstatisticas($viagem, $pontosGPS) {
    $estatisticas = [
        'distancia_total' => 0,
        'tempo_total' => 0,
        'velocidade_media' => 0,
        'combustivel_estimado' => 0,
        'pontos_gps' => count($pontosGPS),
        'tempo_parado' => 0,
        'tempo_movimento' => 0
    ];
    
    // Calcular distância
    if ($viagem['km_final'] && $viagem['km_inicial']) {
        $estatisticas['distancia_total'] = $viagem['km_final'] - $viagem['km_inicial'];
    } elseif ($viagem['km_gps_final']) {
        $estatisticas['distancia_total'] = $viagem['km_gps_final'];
    }
    
         // Calcular tempo total
     if ($viagem['data_inicio'] && $viagem['data_fim']) {
         $inicio = new DateTime($viagem['data_inicio']);
         $fim = new DateTime($viagem['data_fim']);
         
         // Verificar se a data fim é válida (não pode ser antes do início)
         if ($fim > $inicio) {
             $diff = $inicio->diff($fim);
             $estatisticas['tempo_total'] = ($diff->h * 60) + $diff->i; // em minutos
         } else {
             // Se data fim é inválida, calcular baseado nos pontos GPS
             $estatisticas['tempo_total'] = 0;
         }
     }
     
     // Se não conseguiu calcular tempo pelas datas da viagem, usar pontos GPS
     if ($estatisticas['tempo_total'] == 0 && count($pontosGPS) > 1) {
         $primeiro_ponto = strtotime($pontosGPS[0]['timestamp']);
         $ultimo_ponto = strtotime($pontosGPS[count($pontosGPS) - 1]['timestamp']);
         $diferenca_segundos = $ultimo_ponto - $primeiro_ponto;
         $estatisticas['tempo_total'] = round($diferenca_segundos / 60); // converter para minutos
     }
    
    // Calcular velocidade média
    if ($estatisticas['distancia_total'] > 0 && $estatisticas['tempo_total'] > 0) {
        $tempoHoras = $estatisticas['tempo_total'] / 60;
        $estatisticas['velocidade_media'] = round($estatisticas['distancia_total'] / $tempoHoras, 1);
    }
    
    // Calcular combustível estimado (12 km/l)
    if ($estatisticas['distancia_total'] > 0) {
        $estatisticas['combustivel_estimado'] = round($estatisticas['distancia_total'] / 12, 1);
    }
    
    // Calcular tempo parado vs movimento baseado nos pontos GPS
    if (count($pontosGPS) > 1) {
        $tempoParado = 0;
        $tempoMovimento = 0;
        
        for ($i = 1; $i < count($pontosGPS); $i++) {
            $timestamp1 = strtotime($pontosGPS[$i-1]['timestamp']);
            $timestamp2 = strtotime($pontosGPS[$i]['timestamp']);
            $diferenca = $timestamp2 - $timestamp1;
            
            // Se a velocidade for muito baixa (< 5 km/h), considerar parado
            if (isset($pontosGPS[$i]['velocidade']) && $pontosGPS[$i]['velocidade'] < 5) {
                $tempoParado += $diferenca;
            } else {
                $tempoMovimento += $diferenca;
            }
        }
        
        $estatisticas['tempo_parado'] = round($tempoParado / 60, 1); // em minutos
        $estatisticas['tempo_movimento'] = round($tempoMovimento / 60, 1); // em minutos
    }
    
    return $estatisticas;
}

function sendError($message, $code = 400) {
    http_response_code($code);
    echo json_encode([
        'sucesso' => false,
        'dados' => null,
        'mensagem' => $message
    ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
?>
