<?php
/**
 * API Simples v2 - Compatível com PHP 7.2+
 */

// Configurar UTF-8 e CORS
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

// Responder OPTIONS para CORS
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

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

// Conectar ao banco com credenciais diretas
function conectarBanco() {
    $host = 'localhost';
    $dbname = 'pinheir3_controle_frotasV1.1';
    $username = 'pinheir3_admin';
    $password = '080880Gelboy';
    
    try {
        $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]);
        return $pdo;
    } catch (PDOException $e) {
        throw new Exception('Erro de conexão: ' . $e->getMessage());
    }
}

// Função para geocodificar coordenadas GPS em endereços
function geocodificar($lat, $lng) {
    if (empty($lat) || empty($lng)) {
        return null;
    }
    
    $url = "https://nominatim.openstreetmap.org/reverse?format=json&lat=$lat&lon=$lng&zoom=16&addressdetails=1";
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 8);
    curl_setopt($ch, CURLOPT_USERAGENT, 'ControleDeFretas/2.0');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($httpCode == 200 && $response) {
        $json = json_decode($response, true);
        if ($json && isset($json['display_name'])) {
            return $json['display_name'];
        }
    }
    
    return null;
}

// JWT simples
function criarTokenSimples($dados) {
    $header = base64_encode(json_encode(['typ' => 'JWT', 'alg' => 'HS256']));
    $payload = base64_encode(json_encode($dados));
    $signature = base64_encode(hash_hmac('sha256', "$header.$payload", 'secret_key', true));
    return "$header.$payload.$signature";
}

// Resposta padronizada
function resposta($sucesso, $dados = null, $mensagem = '', $codigo = 200) {
    http_response_code($codigo);
    echo json_encode([
        'sucesso' => $sucesso,
        'dados' => $dados,
        'mensagem' => $mensagem,
        'timestamp' => date('c')
    ], JSON_UNESCAPED_UNICODE);
    exit();
}

// Roteamento simples
$metodo = $_SERVER['REQUEST_METHOD'];
$caminho = isset($_GET['acao']) ? $_GET['acao'] : 'status';

// DEBUG: Log da requisição
error_log("========== API DEBUG ==========");
error_log("Método: " . $metodo);
error_log("Caminho/Ação inicial: " . $caminho);
error_log("URL completa: " . $_SERVER['REQUEST_URI']);
error_log("Query string: " . $_SERVER['QUERY_STRING']);

if ($metodo === 'POST') {
    $body = file_get_contents('php://input');
    error_log("Body da requisição: " . $body);
    if ($body) {
        $json = json_decode($body, true);
        error_log("JSON decodificado: " . json_encode($json));
        
        // CORREÇÃO: Se é POST com email/senha e não tem ação específica, é login!
        if ($caminho === 'status' && $json && (isset($json['email']) || isset($json['usuario']))) {
            $caminho = 'login';
            error_log("🔧 CORREÇÃO: Detectado login automático via POST");
        }
        
        // CORREÇÃO: Se tem 'acao' no JSON body, usar essa ação
        if (isset($json['acao']) && !empty($json['acao'])) {
            $caminho = $json['acao'];
            error_log("🔧 CORREÇÃO: Ação definida via JSON body: " . $caminho);
        }
    }
}
error_log("Caminho final: " . $caminho);
error_log("===============================");

try {
    switch ($caminho) {
        case 'teste':
            resposta(true, ['mensagem' => 'API funcionando corretamente'], 'Teste OK');
            break;
            
        case 'status':
            resposta(true, [
                'sistema' => 'Controle de Frotas',
                'versao' => '2.0.0',
                'php' => phpversion(),
                'banco_conectado' => true
            ], 'Sistema funcionando');
            break;
            
        case 'login':
            if ($metodo !== 'POST') {
                resposta(false, null, 'Método não permitido', 405);
            }
            
            $input = json_decode(file_get_contents('php://input'), true);
            $email = isset($input['email']) ? $input['email'] : '';
            $senha = isset($input['senha']) ? $input['senha'] : '';
            
            // Verificar se é admin (aceitar ambas as formas)
            if (($email === 'admin@controledefrotas.com' && $senha === 'admin123') || 
                ($email === 'admin' && $senha === '123456')) {
                $token = criarTokenSimples([
                    'id' => 1,
                    'email' => $email,
                    'tipo' => 'admin',
                    'exp' => time() + 3600
                ]);
                
                resposta(true, [
                    'token' => $token,
                    'usuario' => [
                        'id' => 1,
                        'email' => $email,
                        'nome' => 'Administrador',
                        'tipo' => 'admin'
                    ]
                ], 'Login realizado com sucesso');
            } else {
                // Verificar se é motorista
                $pdo = conectarBanco();
                
                try {
                    error_log("=========== DEBUG LOGIN MOTORISTA ===========");
                    error_log("Email/usuário informado: '$email'");
                    error_log("Senha informada: '$senha'");
                    
                    // CORREÇÃO AUTOMÁTICA: Verificar e corrigir dados dos motoristas se necessário
                    $stmtCheck = $pdo->query("SELECT id, nome, usuario, senha, status FROM motoristas");
                    $todosMotoristas = $stmtCheck->fetchAll();
                    
                    $correcoes = [
                        1 => ['usuario' => 'joao.silva', 'senha' => '123456', 'status' => 'ativo'],
                        2 => ['usuario' => 'maria.santos', 'senha' => '123456', 'status' => 'ativo'],
                        3 => ['usuario' => 'pedro.silva', 'senha' => '123456', 'status' => 'ativo']
                    ];
                    
                    foreach ($todosMotoristas as $m) {
                        if (isset($correcoes[$m['id']])) {
                            $precisaCorrigir = false;
                            $dadosCorrecao = $correcoes[$m['id']];
                            
                            if (empty($m['usuario']) || empty($m['senha']) || $m['status'] !== 'ativo') {
                                $precisaCorrigir = true;
                            }
                            
                            if ($precisaCorrigir) {
                                $stmtUpdate = $pdo->prepare("UPDATE motoristas SET usuario = ?, senha = ?, status = ? WHERE id = ?");
                                $stmtUpdate->execute([$dadosCorrecao['usuario'], $dadosCorrecao['senha'], $dadosCorrecao['status'], $m['id']]);
                                error_log("✅ Motorista {$m['nome']} corrigido automaticamente: usuario={$dadosCorrecao['usuario']}, senha={$dadosCorrecao['senha']}");
                            }
                        }
                    }
                    
                    // Buscar por usuário ou email na tabela motoristas
                    $stmt = $pdo->prepare("
                        SELECT id, nome, matricula, usuario, senha, status, telefone, cpf 
                        FROM motoristas 
                        WHERE (usuario = ? OR cpf = ? OR matricula = ?) AND status = 'ativo'
                    ");
                    $stmt->execute([$email, $email, $email]);
                    $motorista = $stmt->fetch();
                    
                    if ($motorista) {
                        error_log("Motorista encontrado:");
                        error_log("  ID: {$motorista['id']}");
                        error_log("  Nome: {$motorista['nome']}");
                        error_log("  Usuário: {$motorista['usuario']}");
                        error_log("  Senha no banco: '{$motorista['senha']}'");
                        error_log("  Status: {$motorista['status']}");
                        error_log("Comparação senhas: informada='$senha' vs banco='{$motorista['senha']}'");
                    } else {
                        error_log("Nenhum motorista encontrado com: '$email'");
                        // Listar todos os motoristas ativos para debug
                        $stmt_all = $pdo->query("SELECT id, nome, usuario, matricula, cpf, status FROM motoristas WHERE status = 'ativo'");
                        $todosMotoristas = $stmt_all->fetchAll();
                        error_log("Motoristas ativos disponíveis: " . json_encode($todosMotoristas));
                    }
                    
                    if ($motorista && (password_verify($senha, $motorista['senha']) || $motorista['senha'] === $senha)) {
                        error_log("✅ Login bem-sucedido para motorista: {$motorista['nome']}");
                        error_log("=========== FIM DEBUG LOGIN ===========");
                        $token = criarTokenSimples([
                            'id' => $motorista['id'],
                            'usuario' => $motorista['usuario'],
                            'tipo' => 'motorista',
                            'exp' => time() + 3600
                        ]);
                        
                        resposta(true, [
                            'token' => $token,
                            'usuario' => [
                                'id' => $motorista['id'],
                                'nome' => $motorista['nome'],
                                'matricula' => $motorista['matricula'],
                                'usuario' => $motorista['usuario'],
                                'telefone' => $motorista['telefone'],
                                'tipo' => 'motorista'
                            ]
                        ], 'Login realizado com sucesso');
                    } else {
                        error_log("❌ Login falhou - credenciais inválidas");
                        error_log("=========== FIM DEBUG LOGIN ===========");
                        resposta(false, null, 'Credenciais inválidas. Verifique usuário/matrícula/CPF e senha.', 401);
                    }
                } catch (Exception $e) {
                    error_log("Erro no login: " . $e->getMessage());
                    resposta(false, null, 'Erro interno do servidor', 500);
                }
            }
            break;
            
        // REMOVIDO: Implementação duplicada - usando apenas a implementação mais completa na linha 2347
            
        case 'rotas-ativas':
            // ✅ NOVO: Buscar rotas ativas com rastreamento em tempo real
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    $sql = "
                        SELECT 
                            sr.id as rota_id,
                            sr.titulo as rota_titulo,
                            sr.descricao,
                            sr.status,
                            sr.data_prevista,
                            sr.data_inicio_real,
                            sr.data_fim_real,
                            sr.km_estimado,
                            sr.duracao_estimada,
                            
                            -- Dados do motorista
                            m.id as motorista_id,
                            m.nome as motorista_nome,
                            
                            -- Dados do veículo
                            v.id as veiculo_id,
                            v.marca,
                            v.modelo,
                            v.placa,
                            
                            -- Localização atual (última viagem da rota)
                            vi_atual.latitude_inicial as latitude,
                            vi_atual.longitude_inicial as longitude,
                            vi_atual.data_inicio as ultima_atualizacao,
                            
                            -- Estatísticas da rota
                            (SELECT COUNT(*) FROM rota_viagens rv WHERE rv.solicitacao_rota_id = sr.id) as total_viagens,
                            (SELECT COUNT(*) FROM rota_viagens rv 
                             JOIN viagens vi ON rv.viagem_id = vi.id 
                             WHERE rv.solicitacao_rota_id = sr.id AND vi.data_fim IS NOT NULL) as viagens_concluidas,
                            
                            -- Distância total percorrida
                            (SELECT SUM(vi.distancia_gps) 
                             FROM rota_viagens rv 
                             JOIN viagens vi ON rv.viagem_id = vi.id 
                             WHERE rv.solicitacao_rota_id = sr.id 
                             AND vi.distancia_gps IS NOT NULL 
                             AND vi.distancia_gps > 0) as distancia_percorrida,
                            
                            -- Tempo decorrido
                            CASE 
                                WHEN sr.data_fim_real IS NOT NULL THEN 
                                    TIMESTAMPDIFF(MINUTE, sr.data_inicio_real, sr.data_fim_real)
                                WHEN sr.data_inicio_real IS NOT NULL THEN 
                                    TIMESTAMPDIFF(MINUTE, sr.data_inicio_real, NOW())
                                ELSE 0
                            END as tempo_decorrido_minutos,
                            
                            -- Status da rota
                            CASE 
                                WHEN sr.data_fim_real IS NOT NULL THEN 'concluida'
                                WHEN sr.data_inicio_real IS NOT NULL THEN 'em_execucao'
                                WHEN sr.status = 'aprovada' THEN 'aguardando_inicio'
                                ELSE sr.status
                            END as status_atual
                            
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                        LEFT JOIN (
                            -- Buscar a viagem mais recente de cada rota para localização atual
                            SELECT 
                                rv.solicitacao_rota_id,
                                vi.latitude_inicial,
                                vi.longitude_inicial,
                                vi.data_inicio,
                                ROW_NUMBER() OVER (PARTITION BY rv.solicitacao_rota_id ORDER BY vi.data_inicio DESC) as rn
                            FROM rota_viagens rv
                            JOIN viagens vi ON rv.viagem_id = vi.id
                            WHERE vi.latitude_inicial IS NOT NULL 
                            AND vi.longitude_inicial IS NOT NULL
                        ) vi_atual ON sr.id = vi_atual.solicitacao_rota_id AND vi_atual.rn = 1
                        
                        WHERE sr.status IN ('aprovada', 'em_execucao', 'concluida')
                        AND sr.data_prevista >= DATE_SUB(NOW(), INTERVAL 7 DAY) -- Últimos 7 dias
                        
                        ORDER BY 
                            CASE 
                                WHEN sr.data_fim_real IS NULL AND sr.data_inicio_real IS NOT NULL THEN 1 -- Em execução primeiro
                                WHEN sr.data_fim_real IS NULL AND sr.data_inicio_real IS NULL THEN 2 -- Aguardando início
                                ELSE 3 -- Concluídas por último
                            END,
                            sr.data_prevista DESC
                    ";
                    
                    $stmt = $pdo->query($sql);
                    $rotas = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    resposta(true, $rotas, 'Rotas ativas encontradas');
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao buscar rotas ativas: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'ultima-rota-veiculo':
            // ✅ NOVO: Buscar última rota de um veículo específico
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                $veiculo_id = isset($_GET['veiculo_id']) ? intval($_GET['veiculo_id']) : 0;
                
                if ($veiculo_id <= 0) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                    break;
                }
                
                try {
                    $sql = "
                        SELECT 
                            sr.id as rota_id,
                            sr.titulo as rota_titulo,
                            sr.descricao,
                            sr.status,
                            sr.data_prevista,
                            sr.data_inicio_real,
                            sr.data_fim_real,
                            sr.km_estimado,
                            sr.duracao_estimada,
                            
                            -- Dados do motorista
                            m.id as motorista_id,
                            m.nome as motorista_nome,
                            
                            -- Dados do veículo
                            v.id as veiculo_id,
                            v.marca,
                            v.modelo,
                            v.placa,
                            
                            -- Localização atual (última viagem da rota)
                            vi_atual.latitude_inicial as latitude,
                            vi_atual.longitude_inicial as longitude,
                            vi_atual.data_inicio as ultima_atualizacao,
                            
                            -- Estatísticas da rota
                            (SELECT COUNT(*) FROM rota_viagens rv WHERE rv.solicitacao_rota_id = sr.id) as total_viagens,
                            (SELECT COUNT(*) FROM rota_viagens rv 
                             JOIN viagens vi ON rv.viagem_id = vi.id 
                             WHERE rv.solicitacao_rota_id = sr.id AND vi.data_fim IS NOT NULL) as viagens_concluidas,
                            
                            -- Distância total percorrida
                            (SELECT SUM(vi.distancia_gps) 
                             FROM rota_viagens rv 
                             JOIN viagens vi ON rv.viagem_id = vi.id 
                             WHERE rv.solicitacao_rota_id = sr.id 
                             AND vi.distancia_gps IS NOT NULL 
                             AND vi.distancia_gps > 0) as distancia_percorrida,
                            
                            -- Tempo decorrido
                            CASE 
                                WHEN sr.data_fim_real IS NOT NULL THEN 
                                    TIMESTAMPDIFF(MINUTE, sr.data_inicio_real, sr.data_fim_real)
                                WHEN sr.data_inicio_real IS NOT NULL THEN 
                                    TIMESTAMPDIFF(MINUTE, sr.data_inicio_real, NOW())
                                ELSE 0
                            END as tempo_decorrido_minutos,
                            
                            -- Status da rota
                            CASE 
                                WHEN sr.data_fim_real IS NOT NULL THEN 'concluida'
                                WHEN sr.data_inicio_real IS NOT NULL THEN 'em_execucao'
                                WHEN sr.status = 'aprovada' THEN 'aguardando_inicio'
                                ELSE sr.status
                            END as status_atual
                            
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                        LEFT JOIN (
                            -- Buscar a viagem mais recente de cada rota para localização atual
                            SELECT 
                                rv.solicitacao_rota_id,
                                vi.latitude_inicial,
                                vi.longitude_inicial,
                                vi.data_inicio,
                                ROW_NUMBER() OVER (PARTITION BY rv.solicitacao_rota_id ORDER BY vi.data_inicio DESC) as rn
                            FROM rota_viagens rv
                            JOIN viagens vi ON rv.viagem_id = vi.id
                            WHERE vi.latitude_inicial IS NOT NULL 
                            AND vi.longitude_inicial IS NOT NULL
                        ) vi_atual ON sr.id = vi_atual.solicitacao_rota_id AND vi_atual.rn = 1
                        
                        WHERE sr.veiculo_id = ?
                        AND sr.status IN ('aprovada', 'em_execucao', 'concluida')
                        
                        ORDER BY sr.data_prevista DESC
                        LIMIT 1
                    ";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([$veiculo_id]);
                    $rota = $stmt->fetch(PDO::FETCH_ASSOC);
                    
                    if ($rota) {
                        resposta(true, $rota, 'Última rota do veículo encontrada');
                    } else {
                        resposta(false, null, 'Nenhuma rota encontrada para este veículo', 404);
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao buscar última rota: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'veiculos-ativos':
            // ✅ NOVO: Buscar veículos ativos com localização GPS
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    $sql = "
                        SELECT DISTINCT
                            v.id as veiculo_id,
                            v.modelo,
                            v.placa,
                            v.marca,
                            u.nome as motorista,
                            vi.cliente,
                            vi.latitude_inicial as latitude,
                            vi.longitude_inicial as longitude,
                            vi.data_inicio,
                            vi.data_fim,
                            CASE 
                                WHEN vi.data_fim IS NULL THEN 'em_andamento'
                                ELSE 'concluida'
                            END as status_viagem,
                            TIMESTAMPDIFF(MINUTE, vi.data_inicio, COALESCE(vi.data_fim, NOW())) as duracao_minutos
                        FROM viagens vi
                        LEFT JOIN veiculos v ON vi.veiculo_id = v.id
                        LEFT JOIN usuarios u ON vi.tecnico_id = u.id
                        WHERE vi.data_fim IS NULL 
                        AND vi.latitude_inicial IS NOT NULL 
                        AND vi.longitude_inicial IS NOT NULL
                        AND vi.data_inicio >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
                        ORDER BY vi.data_inicio DESC
                    ";
                    
                    $stmt = $pdo->query($sql);
                    $veiculos = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    resposta(true, $veiculos, 'Veículos ativos encontrados');
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao buscar veículos ativos: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'viagem':
            // Buscar detalhes de uma viagem específica
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                $id = isset($_GET['id']) ? intval($_GET['id']) : 0;
                
                if ($id <= 0) {
                    resposta(false, null, 'ID da viagem é obrigatório', 400);
                }
                
                try {
                    $stmt = $pdo->prepare("
                        SELECT 
                            v.id,
                            v.cliente,
                            v.motivo,
                            v.tecnico_id,
                            v.veiculo_id,
                            v.odometro_inicial,
                            v.odometro_final,
                            v.distancia_gps,
                            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,
                            COALESCE(m.nome, 'Técnico não identificado') as tecnico_nome,
                            COALESCE(m.matricula, 'N/A') as tecnico_matricula,
                            COALESCE(ve.modelo, 'Veículo não identificado') as veiculo_nome,
                            COALESCE(ve.placa, 'N/A') as veiculo_placa,
                            CONCAT(COALESCE(ve.modelo, 'Veículo não identificado'), ' - ', COALESCE(ve.placa, 'N/A')) as veiculo_completo,
                            v.trajeto,
                            v.sincronizado,
                            v.created_at,
                            v.updated_at
                        FROM viagens v
                        LEFT JOIN motoristas m ON v.tecnico_id = m.nome
                        LEFT JOIN veiculos ve ON v.veiculo_id = ve.id
                        WHERE v.id = ?
                    ");
                    $stmt->execute([$id]);
                    $viagem = $stmt->fetch();
                    
                    if ($viagem) {
                        // Buscar trajeto GPS completo se existir
                        try {
                            $stmtTrajeto = $pdo->prepare("
                                SELECT 
                                    latitude, 
                                    longitude, 
                                    velocidade, 
                                    timestamp,
                                    precisao
                                FROM rastreamento_tempo_real 
                                WHERE viagem_id = ? 
                                ORDER BY timestamp ASC
                            ");
                            $stmtTrajeto->execute([$id]);
                            $trajeto = $stmtTrajeto->fetchAll();
                            
                            $viagem['trajeto_gps'] = $trajeto;
                            $viagem['total_pontos_gps'] = count($trajeto);
                        } catch (Exception $e) {
                            // Se a tabela não existe, ignora
                            $viagem['trajeto_gps'] = [];
                            $viagem['total_pontos_gps'] = 0;
                        }
                        
                        // DECODIFICAR TRAJETO JSON DO CAMPO 'trajeto'
                        if ($viagem['trajeto']) {
                            $trajetoDecoded = json_decode($viagem['trajeto'], true);
                            if (is_array($trajetoDecoded) && !empty($trajetoDecoded)) {
                                $viagem['trajeto'] = $trajetoDecoded;
                                error_log("Trajeto JSON decodificado: " . count($trajetoDecoded) . " pontos");
                            } else {
                                $viagem['trajeto'] = [];
                                error_log("Erro ao decodificar trajeto JSON ou trajeto vazio");
                            }
                        } else {
                            $viagem['trajeto'] = [];
                        }
                        
                        resposta(true, $viagem, 'Viagem encontrada');
                    } else {
                        resposta(false, null, 'Viagem não encontrada', 404);
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao buscar viagem: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'viagens':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // 🔧 TESTE: Query simplificada para debug
                    $stmt = $pdo->query("
                        SELECT 
                            sr.id as id,
                            sr.titulo as cliente,
                            sr.descricao as motivo,
                            sr.motorista_id as tecnico_id,
                            sr.veiculo_id,
                            -- 🔧 TESTE: Buscar odômetros de forma mais específica
                            (SELECT v.odometro_inicial FROM viagens v 
                             INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                             WHERE rv.solicitacao_rota_id = sr.id 
                             AND v.odometro_inicial IS NOT NULL 
                             ORDER BY v.data_inicio ASC LIMIT 1) as odometro_inicial,
                            (SELECT v.odometro_final FROM viagens v 
                             INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                             WHERE rv.solicitacao_rota_id = sr.id 
                             AND v.odometro_final IS NOT NULL 
                             ORDER BY v.data_fim DESC LIMIT 1) as odometro_final,
                            -- 🔧 TESTE: Distância GPS simplificada
                            (SELECT SUM(v.distancia_gps) 
                                    FROM viagens v 
                                    INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                                    WHERE rv.solicitacao_rota_id = sr.id 
                             AND v.distancia_gps > 0) as distancia_gps,
                            sr.data_inicio_real as data_inicio,
                            sr.data_fim_real as data_fim,
                            NULL as latitude_inicial,
                            NULL as longitude_inicial,
                            NULL as latitude_final,
                            NULL as longitude_final,
                            'Múltiplos endereços' as endereco_inicial,
                            'Múltiplos endereços' as endereco_final,
                            sr.observacoes_finais as observacoes,
                            sr.justificativa_km as justificativa_divergencia,
                            sr.km_estimado as km_planejado,
                            sr.diferenca_km_calculada,
                            COALESCE(m.nome, 'Motorista não identificado') as tecnico_nome,
                            COALESCE(m.matricula, 'N/A') as tecnico_matricula,
                            COALESCE(ve.modelo, 'Veículo não identificado') as veiculo_nome,
                            COALESCE(ve.placa, 'N/A') as veiculo_placa,
                            CONCAT(COALESCE(ve.modelo, 'Veículo não identificado'), ' - ', COALESCE(ve.placa, 'N/A')) as veiculo_completo,
                            'rota' as tipo,
                            sr.id as rota_id,
                            (SELECT SUM(v.distancia_gps) 
                                    FROM viagens v 
                                    INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                                    WHERE rv.solicitacao_rota_id = sr.id 
                             AND v.distancia_gps > 0) as distancia_total,
                            (SELECT SUM(COALESCE(v.km_gps_real, v.distancia_gps)) 
                                    FROM viagens v 
                                    INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                                    WHERE rv.solicitacao_rota_id = sr.id 
                             AND (v.km_gps_real > 0 OR v.distancia_gps > 0)) as km_gps_real,
                            CASE 
                                WHEN sr.data_fim_real IS NOT NULL THEN 'concluida'
                                WHEN sr.data_inicio_real IS NOT NULL THEN 'em_andamento'
                                ELSE sr.status
                            END as rota_status
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos ve ON sr.veiculo_id = ve.id
                        WHERE sr.status IN ('aprovada', 'em_andamento', 'em_execucao', 'concluida')
                        ORDER BY sr.id DESC
                        LIMIT 10
                    ");
                    $viagens = $stmt->fetchAll();
                    
                    // 🔧 DEBUG: Log detalhado dos dados
                    error_log("🔍 DEBUG API - Viagens encontradas: " . count($viagens));
                    foreach ($viagens as $index => $viagem) {
                        error_log("🔍 DEBUG API - Rota {$index}: ID={$viagem['id']}, Cliente={$viagem['cliente']}, OdometroInicial={$viagem['odometro_inicial']}, OdometroFinal={$viagem['odometro_final']}");
                    }
                    
                    resposta(true, $viagens, 'Viagens listadas');
                } catch (Exception $e) {
                    // Log do erro para debug
                    error_log("Erro ao buscar viagens: " . $e->getMessage());
                    
                    // Tentar query ainda mais simples
                    try {
                        $stmt = $pdo->query("
                            SELECT 
                                v.*,
                                'Técnico não identificado' as tecnico_nome,
                                'N/A' as veiculo_placa,
                                'Veículo não identificado' as veiculo_completo,
                                0 as distancia_total
                            FROM viagens v
                            ORDER BY v.data_inicio DESC 
                            LIMIT 10
                        ");
                        $viagens = $stmt->fetchAll();
                        resposta(true, $viagens, 'Viagens listadas (modo simplificado)');
                    } catch (Exception $e2) {
                        resposta(false, null, 'Erro ao carregar viagens: ' . $e2->getMessage(), 500);
                    }
                }
            } elseif ($metodo === 'POST') {
                // Receber viagem do app Android
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados da viagem são obrigatórios', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['tecnicoId', 'veiculoId', 'cliente', 'motivo', 'kmInicial', 'dataInicio'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo]) || empty($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                // LOG para debug
                error_log("Recebendo viagem do Android: " . json_encode($input));
                
                try {
                    // VERIFICAR SE A VIAGEM JÁ EXISTE (evitar duplicatas)
                    $verificarExistente = null;
                    
                    // Verificar por ID se fornecido e > 0
                    if (isset($input['id']) && $input['id'] > 0) {
                        $stmt = $pdo->prepare("SELECT id FROM viagens WHERE id = ?");
                        $stmt->execute([$input['id']]);
                        $verificarExistente = $stmt->fetch();
                    }
                    
                    // Se não encontrou por ID, verificar por combinação única
                    if (!$verificarExistente) {
                        $stmt = $pdo->prepare("
                            SELECT id FROM viagens 
                            WHERE tecnico_id = ? 
                            AND veiculo_id = ? 
                            AND cliente = ? 
                            AND DATE(data_inicio) = DATE(?) 
                            AND odometro_inicial = ?
                        ");
                        $stmt->execute([
                            $input['tecnicoId'],
                            $input['veiculoId'],
                            $input['cliente'],
                            $input['dataInicio'],
                            $input['odometroInicial']
                        ]);
                        $verificarExistente = $stmt->fetch();
                    }
                    
                    if ($verificarExistente) {
                        // VIAGEM JÁ EXISTE - Atualizar ao invés de inserir
                        $viagemId = $verificarExistente['id'];
                        error_log("Viagem já existe (ID: $viagemId) - atualizando ao invés de inserir");
                        
                        // CORREÇÃO: Preservar endereços existentes se novos não forem fornecidos
                        $sql = "UPDATE viagens SET 
                            tecnico_id = ?, veiculo_id = ?, cliente = ?, motivo = ?, 
                            odometro_inicial = ?, odometro_final = ?, distancia_gps = ?,
                            data_inicio = ?, data_fim = ?, latitude_inicial = ?, longitude_inicial = ?, 
                            latitude_final = ?, longitude_final = ?, observacoes = ?, 
                            trajeto = ?, 
                            endereco_inicial = COALESCE(?, endereco_inicial), 
                            endereco_final = COALESCE(?, endereco_final), 
                            cliente_id = COALESCE(?, cliente_id),
                            sincronizado = 1
                            WHERE id = ?";
                        
                        $trajeto = isset($input['trajeto']) ? json_encode($input['trajeto']) : null;
                        
                        // Preparar endereços: só atualizar se fornecidos e não vazios
                        $enderecoInicial = null;
                        $enderecoFinal = null;
                        
                        if (isset($input['enderecoInicial']) && !empty(trim($input['enderecoInicial']))) {
                            $enderecoInicial = trim($input['enderecoInicial']);
                        }
                        
                        if (isset($input['enderecoFinal']) && !empty(trim($input['enderecoFinal']))) {
                            $enderecoFinal = trim($input['enderecoFinal']);
                        }
                        
                        // Preparar cliente_id: só atualizar se fornecido e válido
                        $clienteId = null;
                        if (isset($input['clienteId']) && !empty($input['clienteId']) && $input['clienteId'] > 0) {
                            $clienteId = $input['clienteId'];
                        }
                        
                        $stmt = $pdo->prepare($sql);
                        $stmt->execute([
                            $input['tecnicoId'],
                            $input['veiculoId'],
                            $input['cliente'],
                            $input['motivo'],
                            $input['odometroInicial'],
                            isset($input['odometroFinal']) ? $input['odometroFinal'] : null,
                            isset($input['distanciaGps']) ? $input['distanciaGps'] : null,
                            $input['dataInicio'],
                            isset($input['dataFim']) ? $input['dataFim'] : null,
                            isset($input['latitudeInicial']) ? $input['latitudeInicial'] : null,
                            isset($input['longitudeInicial']) ? $input['longitudeInicial'] : null,
                            isset($input['latitudeFinal']) ? $input['latitudeFinal'] : null,
                            isset($input['longitudeFinal']) ? $input['longitudeFinal'] : null,
                            isset($input['observacoes']) ? $input['observacoes'] : null,
                            $trajeto,
                            $enderecoInicial, // Só atualiza se fornecido
                            $enderecoFinal,   // Só atualiza se fornecido
                            $clienteId,       // Só atualiza se fornecido e válido
                            $viagemId
                        ]);
                        
                        resposta(true, ['id' => $viagemId, 'acao' => 'atualizada'], 'Viagem atualizada com sucesso');
                        
                    } else {
                        // VIAGEM NOVA - Inserir normalmente
                        error_log("Viagem nova - inserindo no banco");
                        
                $sql = "INSERT INTO viagens (
                    tecnico_id, veiculo_id, cliente, motivo, odometro_inicial, odometro_final, distancia_gps,
                    data_inicio, data_fim, latitude_inicial, longitude_inicial, latitude_final,
                    longitude_final, observacoes, sincronizado, trajeto, endereco_inicial, endereco_final, cliente_id
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?)";
                
                $trajeto = isset($input['trajeto']) ? json_encode($input['trajeto']) : null;
                
                $stmt = $pdo->prepare($sql);
                $stmt->execute([
                    $input['tecnicoId'],
                    $input['veiculoId'],
                    $input['cliente'],
                    $input['motivo'],
                    $input['odometroInicial'],
                    isset($input['odometroFinal']) ? $input['odometroFinal'] : null,
                    isset($input['distanciaGps']) ? $input['distanciaGps'] : null,
                    $input['dataInicio'],
                    isset($input['dataFim']) ? $input['dataFim'] : null,
                    isset($input['latitudeInicial']) ? $input['latitudeInicial'] : null,
                    isset($input['longitudeInicial']) ? $input['longitudeInicial'] : null,
                    isset($input['latitudeFinal']) ? $input['latitudeFinal'] : null,
                    isset($input['longitudeFinal']) ? $input['longitudeFinal'] : null,
                    isset($input['observacoes']) ? $input['observacoes'] : null,
                    $trajeto,
                    isset($input['enderecoInicial']) ? $input['enderecoInicial'] : null,
                    isset($input['enderecoFinal']) ? $input['enderecoFinal'] : null,
                    isset($input['clienteId']) ? $input['clienteId'] : null
                ]);
                
                $viagemId = $pdo->lastInsertId();
                        resposta(true, ['id' => $viagemId, 'acao' => 'inserida'], 'Viagem salva com sucesso');
                    }
                    
                } catch (Exception $e) {
                    error_log("Erro ao processar viagem: " . $e->getMessage());
                    resposta(false, null, 'Erro ao salvar viagem: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'buscar_viagem_por_veiculo_data':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                $veiculoId = isset($_GET['veiculoId']) ? intval($_GET['veiculoId']) : 0;
                $data = isset($_GET['data']) ? $_GET['data'] : '';
                
                error_log("🔍 BUSCAR VIAGEM POR VEICULO/DATA:");
                error_log("   - Veículo ID: $veiculoId");
                error_log("   - Data: $data");
                
                if ($veiculoId <= 0 || empty($data)) {
                    resposta(false, null, 'Veículo ID e data são obrigatórios', 400);
                }
                
                try {
                    // Buscar viagem do veículo na data especificada
                    $stmt = $pdo->prepare("
                        SELECT 
                            v.id,
                            v.cliente,
                            v.motivo,
                            v.tecnico_id,
                            v.veiculo_id,
                            v.data_inicio,
                            v.data_fim,
                            v.observacoes,
                            v.sincronizado,
                            v.created_at,
                            COALESCE(m.nome, 'Técnico não identificado') as tecnico_nome,
                            COALESCE(ve.modelo, 'Veículo não identificado') as veiculo_nome,
                            COALESCE(ve.placa, 'N/A') as veiculo_placa
                        FROM viagens v
                        LEFT JOIN motoristas m ON v.tecnico_id = m.nome
                        LEFT JOIN veiculos ve ON v.veiculo_id = ve.id
                        WHERE v.veiculo_id = ? 
                        AND DATE(v.data_inicio) = ?
                        ORDER BY v.data_inicio DESC 
                        LIMIT 1
                    ");
                    $stmt->execute([$veiculoId, $data]);
                    $viagem = $stmt->fetch();
                    
                    if ($viagem) {
                        error_log("✅ VIAGEM ENCONTRADA: ID={$viagem['id']}, Cliente={$viagem['cliente']}");
                        resposta(true, [$viagem], 'Viagem encontrada para o veículo na data especificada');
                    } else {
                        error_log("❌ NENHUMA VIAGEM ENCONTRADA para veículo $veiculoId na data $data");
                        
                        // Log adicional para debug - buscar viagens próximas
                        $stmtDebug = $pdo->prepare("
                            SELECT id, cliente, data_inicio, veiculo_id
                            FROM viagens 
                            WHERE veiculo_id = ? 
                            AND DATE(data_inicio) BETWEEN DATE(?) - INTERVAL 2 DAY AND DATE(?) + INTERVAL 2 DAY
                            ORDER BY data_inicio DESC 
                            LIMIT 5
                        ");
                        $stmtDebug->execute([$veiculoId, $data, $data]);
                        $viagensProximas = $stmtDebug->fetchAll();
                        
                        error_log("📊 VIAGENS PRÓXIMAS (±2 dias): " . json_encode($viagensProximas));
                        
                        resposta(false, [
                            'debug' => [
                                'veiculoId' => $veiculoId,
                                'data' => $data,
                                'viagensProximas' => $viagensProximas
                            ]
                        ], 'Nenhuma viagem encontrada para o veículo na data especificada', 404);
                    }
                } catch (Exception $e) {
                    error_log("❌ ERRO ao buscar viagem: " . $e->getMessage());
                    resposta(false, null, 'Erro ao buscar viagem: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado para esta ação', 405);
            }
            break;
            
        case 'dashboard':
            $pdo = conectarBanco();
            
            // Estatísticas básicas
            $stats = [];
            
            try {
                $stmt = $pdo->query("SELECT COUNT(*) as total FROM viagens");
                $result = $stmt->fetch();
                $stats['total_viagens'] = isset($result['total']) ? $result['total'] : 0;
            } catch (Exception $e) {
                $stats['total_viagens'] = 0;
            }
            
            try {
                $stmt = $pdo->query("SELECT COUNT(*) as total FROM motoristas WHERE status = 'ativo'");
                $result = $stmt->fetch();
                $stats['total_tecnicos'] = isset($result['total']) ? $result['total'] : 0;
            } catch (Exception $e) {
                $stats['total_tecnicos'] = 0;
            }
            
            try {
                $stmt = $pdo->query("SELECT COUNT(*) as total FROM veiculos WHERE status = 'ativo'");
                $result = $stmt->fetch();
                $stats['total_veiculos'] = isset($result['total']) ? $result['total'] : 0;
            } catch (Exception $e) {
                $stats['total_veiculos'] = 0;
            }
            
            try {
                $stmt = $pdo->query("SELECT COUNT(*) as total FROM viagens WHERE data_fim IS NULL");
                $result = $stmt->fetch();
                $stats['viagens_andamento'] = isset($result['total']) ? $result['total'] : 0;
            } catch (Exception $e) {
                $stats['viagens_andamento'] = 0;
            }
            
            resposta(true, $stats, 'Dashboard carregado');
            break;
            
        case 'motoristas':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                // Listar motoristas
                try {
                    $stmt = $pdo->query("SELECT * FROM motoristas ORDER BY nome");
                    $motoristas = $stmt->fetchAll();
                    resposta(true, $motoristas, 'Motoristas listados');
                } catch (Exception $e) {
                    resposta(false, [], 'Erro ao buscar motoristas: ' . $e->getMessage());
                }
            } elseif ($metodo === 'POST') {
                // Cadastrar motorista
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados do motorista são obrigatórios', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['nome'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo]) || empty($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                // Inserir motorista no banco
                $sql = "INSERT INTO motoristas (
                    nome, matricula, cpf, telefone, data_nascimento, cnh_numero, cnh_categoria,
                    usuario, senha, status
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
                
                try {
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $input['nome'],
                        isset($input['matricula']) ? $input['matricula'] : null,
                        isset($input['cpf']) ? $input['cpf'] : null,
                        isset($input['telefone']) ? $input['telefone'] : null,
                        isset($input['dataNascimento']) ? $input['dataNascimento'] : null,
                        isset($input['cnhNumero']) ? $input['cnhNumero'] : null,
                        isset($input['cnhCategoria']) ? $input['cnhCategoria'] : null,
                        isset($input['usuario']) ? $input['usuario'] : null,
                        isset($input['senha']) ? $input['senha'] : '123456',
                        isset($input['status']) ? $input['status'] : 'ativo'
                    ]);
                    
                    $motoristaId = $pdo->lastInsertId();
                    resposta(true, ['id' => $motoristaId], 'Motorista cadastrado com sucesso');
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao cadastrar motorista: ' . $e->getMessage(), 500);
                }
            } elseif ($metodo === 'PUT') {
                // Editar motorista
                // Extrair ID do parâmetro acao (formato: motoristas/123)
                $acaoParts = explode('/', $caminho);
                $id = end($acaoParts);
                
                // Se não conseguir do acao, tentar da URL
                if (!is_numeric($id)) {
                    $pathParts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
                    $id = end($pathParts);
                }
                
                if (!is_numeric($id)) {
                    resposta(false, null, 'ID do motorista inválido', 400);
                }
                
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados do motorista são obrigatórios', 400);
                }
                
                // Antes do UPDATE, verificar duplicidade de matrícula
                $matricula = isset($input['matricula']) ? trim($input['matricula']) : null;
                error_log('DEBUG DUPLICIDADE: ID=' . $id . ' | Matricula=' . $matricula);
                if ($matricula) {
                    $stmtCheck = $pdo->prepare('SELECT id FROM motoristas WHERE matricula = ? AND id != ?');
                    $stmtCheck->execute([$matricula, $id]);
                    if ($stmtCheck->fetch()) {
                        resposta(false, null, 'Já existe outro motorista cadastrado com essa matrícula. Por favor, escolha outra matrícula.', 400);
                    }
                }
                
                // Atualizar motorista
                $sql = "UPDATE motoristas SET 
                    nome = ?, matricula = ?, cpf = ?, telefone = ?, 
                    data_nascimento = ?, cnh_numero = ?, cnh_categoria = ?,
                    usuario = ?, senha = ?, status = ?
                    WHERE id = ?";
                
                try {
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $input['nome'],
                        $matricula,
                        isset($input['cpf']) ? $input['cpf'] : null,
                        isset($input['telefone']) ? $input['telefone'] : null,
                        isset($input['dataNascimento']) ? $input['dataNascimento'] : null,
                        isset($input['cnhNumero']) ? $input['cnhNumero'] : null,
                        isset($input['cnhCategoria']) ? $input['cnhCategoria'] : null,
                        isset($input['usuario']) ? $input['usuario'] : null,
                        isset($input['senha']) ? $input['senha'] : '123456',
                        isset($input['status']) ? $input['status'] : 'ativo',
                        $id
                    ]);
                    // DEBUG: Log dos dados recebidos e ID
                    error_log('DEBUG PUT MOTORISTA: ID=' . $id . ' | Dados=' . json_encode($input));
                    if ($stmt->rowCount() === 0) {
                        resposta(false, null, 'Nada foi alterado. Verifique se o ID existe e se os dados enviados são diferentes.', 400);
                    }
                    resposta(true, ['id' => $id], 'Motorista atualizado com sucesso');
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao atualizar motorista: ' . $e->getMessage(), 500);
                }
            } elseif ($metodo === 'DELETE') {
                // Excluir motorista
                $pathParts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
                $id = end($pathParts);
                
                if (!is_numeric($id)) {
                    resposta(false, null, 'ID do motorista inválido', 400);
                }
                
                try {
                    $stmt = $pdo->prepare("DELETE FROM motoristas WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, 'Motorista excluído com sucesso');
                    } else {
                        resposta(false, null, 'Motorista não encontrado', 404);
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir motorista: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'motorista':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                // Buscar motorista individual
                $id = isset($_GET['id']) ? $_GET['id'] : null;
                
                if (!$id || !is_numeric($id)) {
                    resposta(false, null, 'ID do motorista é obrigatório e deve ser numérico', 400);
                }
                
                try {
                    $stmt = $pdo->prepare("SELECT * FROM motoristas WHERE id = ?");
                    $stmt->execute([$id]);
                    $motorista = $stmt->fetch();
                    
                    if ($motorista) {
                        resposta(true, $motorista, 'Motorista encontrado');
                    } else {
                        resposta(false, null, 'Motorista não encontrado', 404);
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao buscar motorista: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'veiculos':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                // Listar veículos
                try {
                    $stmt = $pdo->query("
                        SELECT 
                            v.id, v.modelo, v.marca, v.placa, v.ano_fabricacao, v.tipo, v.cor, v.odometro_atual,
                            v.cliente_contrato_id, v.km_mensal_contrato, v.km_diario_contrato,
                            c.nome as cliente_contrato_nome,
                            CASE 
                                WHEN v.status IS NULL OR v.status = '' THEN 'ativo'
                                ELSE v.status 
                            END as status
                        FROM veiculos v 
                        LEFT JOIN clientes c ON v.cliente_contrato_id = c.id
                        ORDER BY v.modelo
                    ");
                    $veiculos = $stmt->fetchAll();
                    resposta(true, $veiculos, 'Veículos listados');
                } catch (Exception $e) {
                    resposta(false, [], 'Erro ao buscar veículos: ' . $e->getMessage());
                }
            } elseif ($metodo === 'POST') {
                // Cadastrar veículo
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados do veículo são obrigatórios', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['modelo', 'placa'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo]) || empty($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                // Inserir veículo no banco
                $sql = "INSERT INTO veiculos (
                    modelo, marca, placa, ano_fabricacao, tipo, cor, odometro_atual, 
                    cliente_contrato_id, km_mensal_contrato, km_diario_contrato, status
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'ativo')";
                
                try {
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $input['modelo'],
                        isset($input['marca']) ? $input['marca'] : null,
                        $input['placa'],
                        isset($input['anoFabricacao']) ? $input['anoFabricacao'] : null,
                        isset($input['tipo']) ? $input['tipo'] : 'carro',
                        isset($input['cor']) ? $input['cor'] : null,
                        isset($input['odometroAtual']) ? intval($input['odometroAtual']) : 0,
                        isset($input['clienteContrato']) && !empty($input['clienteContrato']) ? intval($input['clienteContrato']) : null,
                        isset($input['kmMensal']) && !empty($input['kmMensal']) ? intval($input['kmMensal']) : null,
                        isset($input['kmDiario']) && !empty($input['kmDiario']) ? intval($input['kmDiario']) : null
                    ]);
                    
                    $veiculoId = $pdo->lastInsertId();
                    resposta(true, ['id' => $veiculoId], 'Veículo cadastrado com sucesso');
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao cadastrar veículo: ' . $e->getMessage(), 500);
                }
            } elseif ($metodo === 'PUT') {
                // Editar veículo
                // Extrair ID do parâmetro acao (formato: veiculos/123)
                $acaoParts = explode('/', $caminho);
                $id = end($acaoParts);
                
                // Se não conseguir do acao, tentar da URL
                if (!is_numeric($id)) {
                    $pathParts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
                    $id = end($pathParts);
                }
                
                if (!is_numeric($id)) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados do veículo são obrigatórios', 400);
                }
                
                // Atualizar veículo
                $sql = "UPDATE veiculos SET 
                    modelo = ?, marca = ?, placa = ?, ano_fabricacao = ?, tipo = ?, cor = ?, 
                    odometro_atual = ?, cliente_contrato_id = ?, km_mensal_contrato = ?, 
                    km_diario_contrato = ?, status = ?
                    WHERE id = ?";
                
                try {
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $input['modelo'],
                        isset($input['marca']) ? $input['marca'] : null,
                        $input['placa'],
                        isset($input['anoFabricacao']) ? $input['anoFabricacao'] : null,
                        isset($input['tipo']) ? $input['tipo'] : 'carro',
                        isset($input['cor']) ? $input['cor'] : null,
                        isset($input['odometroAtual']) ? intval($input['odometroAtual']) : 0,
                        isset($input['clienteContrato']) && !empty($input['clienteContrato']) ? intval($input['clienteContrato']) : null,
                        isset($input['kmMensal']) && !empty($input['kmMensal']) ? intval($input['kmMensal']) : null,
                        isset($input['kmDiario']) && !empty($input['kmDiario']) ? intval($input['kmDiario']) : null,
                        isset($input['status']) ? $input['status'] : 'ativo',
                        $id
                    ]);
                    
                    resposta(true, ['id' => $id], 'Veículo atualizado com sucesso');
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao atualizar veículo: ' . $e->getMessage(), 500);
                }
            } elseif ($metodo === 'DELETE') {
                // Excluir veículo
                $pathParts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
                $id = end($pathParts);
                
                if (!is_numeric($id)) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    $stmt = $pdo->prepare("DELETE FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, 'Veículo excluído com sucesso');
                    } else {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'clientes':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                // Listar clientes
                try {
                    $stmt = $pdo->query("SELECT * FROM clientes ORDER BY nome");
                    $clientes = $stmt->fetchAll();
                    resposta(true, $clientes, 'Clientes listados');
                } catch (Exception $e) {
                    resposta(false, [], 'Erro ao buscar clientes: ' . $e->getMessage());
                }
            } elseif ($metodo === 'POST') {
                // Cadastrar cliente
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados do cliente são obrigatórios', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['nome', 'cpf_cnpj', 'telefone'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo]) || empty($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                // Inserir cliente no banco
                $sql = "INSERT INTO clientes (
                    nome, cpf_cnpj, telefone, email, endereco, cidade, estado, cep, observacoes, status
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'ativo')";
                
                try {
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $input['nome'],
                        $input['cpf_cnpj'],
                        $input['telefone'],
                        isset($input['email']) ? $input['email'] : null,
                        isset($input['endereco']) ? $input['endereco'] : null,
                        isset($input['cidade']) ? $input['cidade'] : null,
                        isset($input['estado']) ? $input['estado'] : null,
                        isset($input['cep']) ? $input['cep'] : null,
                        isset($input['observacoes']) ? $input['observacoes'] : null
                    ]);
                    
                    $clienteId = $pdo->lastInsertId();
                    resposta(true, ['id' => $clienteId], 'Cliente cadastrado com sucesso');
                } catch (PDOException $e) {
                    if ($e->getCode() == 23000) { // Duplicate entry
                        resposta(false, null, 'CPF/CNPJ já cadastrado', 400);
                    } else {
                        resposta(false, null, 'Erro ao cadastrar cliente: ' . $e->getMessage(), 500);
                    }
                }
            } elseif ($metodo === 'PUT') {
                // Editar cliente
                // Extrair ID do parâmetro acao (formato: clientes/123)
                $acaoParts = explode('/', $caminho);
                $id = end($acaoParts);
                
                // Se não conseguir do acao, tentar da URL
                if (!is_numeric($id)) {
                    $pathParts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
                    $id = end($pathParts);
                }
                
                if (!is_numeric($id)) {
                    resposta(false, null, 'ID do cliente inválido', 400);
                }
                
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados do cliente são obrigatórios', 400);
                }
                
                // Atualizar cliente
                $sql = "UPDATE clientes SET 
                    nome = ?, cpf_cnpj = ?, telefone = ?, email = ?, endereco = ?, 
                    cidade = ?, estado = ?, cep = ?, observacoes = ?, status = ?
                    WHERE id = ?";
                
                try {
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $input['nome'],
                        $input['cpf_cnpj'],
                        $input['telefone'],
                        isset($input['email']) ? $input['email'] : null,
                        isset($input['endereco']) ? $input['endereco'] : null,
                        isset($input['cidade']) ? $input['cidade'] : null,
                        isset($input['estado']) ? $input['estado'] : null,
                        isset($input['cep']) ? $input['cep'] : null,
                        isset($input['observacoes']) ? $input['observacoes'] : null,
                        isset($input['status']) ? $input['status'] : 'ativo',
                        $id
                    ]);
                    
                    resposta(true, ['id' => $id], 'Cliente atualizado com sucesso');
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao atualizar cliente: ' . $e->getMessage(), 500);
                }
            } elseif ($metodo === 'DELETE') {
                // Excluir cliente
                $pathParts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
                $id = end($pathParts);
                
                if (!is_numeric($id)) {
                    resposta(false, null, 'ID do cliente inválido', 400);
                }
                
                try {
                    $stmt = $pdo->prepare("DELETE FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, 'Cliente excluído com sucesso');
                    } else {
                        resposta(false, null, 'Cliente não encontrado', 404);
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir cliente: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'cliente':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                // Buscar cliente individual
                $id = isset($_GET['id']) ? $_GET['id'] : null;
                
                if (!$id || !is_numeric($id)) {
                    resposta(false, null, 'ID do cliente é obrigatório e deve ser numérico', 400);
                }
                
                try {
                    $stmt = $pdo->prepare("SELECT * FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    $cliente = $stmt->fetch();
                    
                    if ($cliente) {
                        resposta(true, $cliente, 'Cliente encontrado');
                    } else {
                        resposta(false, null, 'Cliente não encontrado', 404);
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao buscar cliente: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'veiculo':
            // Buscar veículo específico por ID
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                $id = isset($_GET['id']) ? intval($_GET['id']) : 0;
                
                error_log("========== DEBUG BUSCAR VEÍCULO ==========");
                error_log("ID recebido: " . ($_GET['id'] ?? 'NULL'));
                error_log("ID convertido: " . $id);
                
                if ($id <= 0) {
                    error_log("ID inválido: " . $id);
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    // Primeiro, vamos verificar se existem veículos na tabela
                    $stmtCount = $pdo->query("SELECT COUNT(*) as total FROM veiculos");
                    $total = $stmtCount->fetch()['total'];
                    error_log("Total de veículos na tabela: " . $total);
                    
                    // Verificar se existe com campos básicos primeiro
                    $stmtSimple = $pdo->prepare("SELECT id, modelo, placa FROM veiculos WHERE id = ?");
                    $stmtSimple->execute([$id]);
                    $veiculoBasico = $stmtSimple->fetch();
                    error_log("Veículo básico encontrado: " . ($veiculoBasico ? "SIM" : "NÃO"));
                    
                    if (!$veiculoBasico) {
                        error_log("Veículo com ID $id não existe");
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Agora buscar com todos os campos, tratando NULLs e incluindo dados de contrato
                    $stmt = $pdo->prepare("
                        SELECT 
                            v.id, 
                            v.modelo, 
                            IFNULL(v.marca, '') as marca, 
                            v.placa, 
                            IFNULL(v.ano_fabricacao, '') as ano_fabricacao, 
                            IFNULL(v.tipo, 'carro') as tipo, 
                            IFNULL(v.cor, '') as cor, 
                            IFNULL(v.odometro_atual, 0) as odometro_atual,
                            IFNULL(v.observacoes, '') as observacoes,
                            v.cliente_contrato_id,
                            v.km_mensal_contrato,
                            v.km_diario_contrato,
                            c.nome as cliente_contrato_nome,
                            CASE 
                                WHEN v.status IS NULL OR v.status = '' THEN 'ativo'
                                ELSE v.status 
                            END as status
                        FROM veiculos v
                        LEFT JOIN clientes c ON v.cliente_contrato_id = c.id
                        WHERE v.id = ?
                    ");
                    $stmt->execute([$id]);
                    $veiculo = $stmt->fetch();
                    
                    error_log("Veículo completo encontrado: " . ($veiculo ? "SIM" : "NÃO"));
                    if ($veiculo) {
                        error_log("Dados do veículo: " . json_encode($veiculo));
                    }
                    
                    if ($veiculo) {
                        resposta(true, $veiculo, 'Veículo encontrado');
                    } else {
                        resposta(false, null, 'Erro ao buscar dados completos do veículo', 500);
                    }
                } catch (Exception $e) {
                    error_log("Erro na consulta: " . $e->getMessage());
                    resposta(false, null, 'Erro ao buscar veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'liberar_veiculo':
            // Liberar veículo (mudar status de "em_uso" para "ativo")
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    // Verificar se o veículo existe
                    $stmt = $pdo->prepare("SELECT id, placa, status FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    $veiculo = $stmt->fetch();
                    
                    if (!$veiculo) {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Atualizar status para ativo
                    $stmt = $pdo->prepare("UPDATE veiculos SET status = 'ativo' WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    // Também finalizar viagens em andamento deste veículo, se houver
                    $stmt = $pdo->prepare("
                        UPDATE viagens 
                        SET data_fim = NOW() 
                        WHERE veiculo_id = ? AND data_fim IS NULL
                    ");
                    $stmt->execute([$id]);
                    
                    resposta(true, ['id' => $id], "Veículo {$veiculo['placa']} liberado com sucesso");
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao liberar veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'atualizar-veiculo':
            // Atualizar dados do veículo
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['modelo', 'placa'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo]) || empty($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                try {
                    // Verificar se o veículo existe
                    $stmt = $pdo->prepare("SELECT id FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if (!$stmt->fetch()) {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Atualizar veículo incluindo campos de contrato
                    $sql = "UPDATE veiculos SET 
                        modelo = ?, 
                        marca = ?, 
                        placa = ?, 
                        ano_fabricacao = ?, 
                        tipo = ?, 
                        cor = ?, 
                        odometro_atual = ?,
                        cliente_contrato_id = ?,
                        km_mensal_contrato = ?,
                        km_diario_contrato = ?
                        WHERE id = ?";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $input['modelo'],
                        isset($input['marca']) ? $input['marca'] : null,
                        $input['placa'],
                        isset($input['anoFabricacao']) ? $input['anoFabricacao'] : null,
                        isset($input['tipo']) ? $input['tipo'] : 'carro',
                        isset($input['cor']) ? $input['cor'] : null,
                        isset($input['odometroAtual']) ? intval($input['odometroAtual']) : 0,
                        isset($input['clienteContrato']) && !empty($input['clienteContrato']) ? intval($input['clienteContrato']) : null,
                        isset($input['kmMensal']) && !empty($input['kmMensal']) ? intval($input['kmMensal']) : null,
                        isset($input['kmDiario']) && !empty($input['kmDiario']) ? intval($input['kmDiario']) : null,
                        $id
                    ]);
                    
                    resposta(true, ['id' => $id], 'Veículo atualizado com sucesso');
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao atualizar veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'checklist_veiculo':
            // API para checklist de veículo
            try {
                $pdo = conectarBanco();
                error_log("API-SIMPLES CHECKLIST: Conexão com banco estabelecida");
            } catch (Exception $e) {
                error_log("API-SIMPLES CHECKLIST ERROR: Erro de conexão: " . $e->getMessage());
                resposta(false, null, 'Erro de conexão com banco: ' . $e->getMessage(), 500);
                return;
            }
            
            if ($metodo === 'POST') {
                // Salvar checklist
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados do checklist são obrigatórios', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['viagemId', 'veiculoId', 'itens'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                try {
                    error_log("API-SIMPLES CHECKLIST: Iniciando processamento...");
                    
                    // CORREÇÃO AUTOMÁTICA DE IDs - BUSCAR VIAGEM REAL
                    $viagemIdLocal = intval($input['viagemId']);
                    $veiculoId = intval($input['veiculoId']);
                    $dataHoraChecklist = isset($input['dataHora']) ? $input['dataHora'] : date('Y-m-d H:i:s');
                    
                    // Log dos dados recebidos para debug
                    error_log("API-SIMPLES CHECKLIST DEBUG: App enviou viagemId=$viagemIdLocal, veiculoId=$veiculoId, dataHora=$dataHoraChecklist");
                    error_log("API-SIMPLES CHECKLIST DEBUG: Dados completos recebidos: " . json_encode($input));
                    
                    // Buscar a viagem real no servidor usando múltiplos critérios
                    $viagemReal = null;
                    
                    // Buscar viagem pelo veículo na data específica
                    $dataChecklist = date('Y-m-d', strtotime($dataHoraChecklist));
                    $sqlViagem = "SELECT id, data_inicio, cliente 
                                FROM viagens 
                                WHERE veiculo_id = ? 
                                AND DATE(data_inicio) = ? 
                                ORDER BY id DESC 
                                LIMIT 1";
                    
                    $stmtViagem = $pdo->prepare($sqlViagem);
                    $stmtViagem->execute([$veiculoId, $dataChecklist]);
                    $viagemReal = $stmtViagem->fetch();
                    
                    if (!$viagemReal) {
                        error_log("API-SIMPLES WARN: Nenhuma viagem encontrada para hoje! Usando viagemId do app. ViagemIdLocal=$viagemIdLocal, VeiculoId=$veiculoId, Data=$dataChecklist");
                        // Para rotas ou viagens não encontradas, usar o ID enviado pelo app
                        $viagemIdCorreto = $viagemIdLocal;
                        $clienteInfo = "ROTA/VIAGEM LOCAL";
                    } else {
                        $viagemIdCorreto = $viagemReal['id']; // ID real da viagem no servidor
                        $clienteInfo = $viagemReal['cliente'];
                        
                        // Log da correção para debug
                        error_log("API-SIMPLES SUCCESS: Conversão de ID - App enviou: $viagemIdLocal, Usando: $viagemIdCorreto (Cliente: $clienteInfo)");
                    }
                    
                    // Verificar se já existe checklist para esta viagem
                    $stmt = $pdo->prepare("SELECT id FROM checklist_veiculo WHERE viagem_id = ? AND veiculo_id = ?");
                    $stmt->execute([$viagemIdCorreto, $veiculoId]);
                    if ($stmt->fetch()) {
                        error_log("API-SIMPLES WARN: Checklist já existe para esta viagem/veículo");
                        // Permitir múltiplos checklists por enquanto
                        // resposta(false, null, 'Já existe um checklist para esta viagem', 400);
                        // return;
                    }
                    
                    // ==========================================
                    // 🔧 BUSCAR TIPO CORRETO DO VEÍCULO
                    // ==========================================
                    // IGNORAR o tipo enviado pelo app e buscar o correto do banco
                    $stmt_veiculo = $pdo->prepare("SELECT tipo FROM veiculos WHERE id = ?");
                    $stmt_veiculo->execute([$veiculoId]);
                    $veiculo_info = $stmt_veiculo->fetch(PDO::FETCH_ASSOC);
                    
                    if (!$veiculo_info) {
                        error_log("API-SIMPLES ERROR: Veículo ID $veiculoId não encontrado na tabela veiculos");
                        resposta(false, null, "Veículo não encontrado", 400);
                        return;
                    }
                    
                    // Usar o tipo CORRETO do banco, não o enviado pelo app
                    $tipoVeiculoCorreto = strtoupper($veiculo_info['tipo']);
                    
                    // Log da correção se houve diferença
                    $tipoEnviado = isset($input['tipoVeiculo']) ? strtoupper($input['tipoVeiculo']) : 'NAO_ENVIADO';
                    if ($tipoEnviado !== $tipoVeiculoCorreto) {
                        error_log("🔧 API-SIMPLES CORREÇÃO: App enviou '$tipoEnviado' mas veículo $veiculoId é '$tipoVeiculoCorreto'");
                    }
                    
                    error_log("API-SIMPLES CHECKLIST: Preparando inserção no banco...");
                    
                    // Inserir checklist COM O ID CORRETO E TIPO CORRETO
                    $sql = "INSERT INTO checklist_veiculo (
                        viagem_id, veiculo_id, tipo_veiculo, data_hora, itens_json, observacoes_gerais
                    ) VALUES (?, ?, ?, ?, ?, ?)";
                    
                    $dadosInserir = [
                        $viagemIdCorreto,      // USANDO O ID CORRETO!
                        $veiculoId,
                        $tipoVeiculoCorreto,   // USANDO O TIPO CORRETO DO BANCO!
                        $dataHoraChecklist,
                        json_encode($input['itens'], JSON_UNESCAPED_UNICODE),
                        isset($input['observacoesGerais']) ? $input['observacoesGerais'] : null
                    ];
                    
                    error_log("API-SIMPLES INSERT DEBUG: SQL: $sql");
                    error_log("API-SIMPLES INSERT DEBUG: Dados para inserir: " . json_encode($dadosInserir));
                    
                    $stmt = $pdo->prepare($sql);
                    $resultado = $stmt->execute($dadosInserir);
                    
                    if (!$resultado) {
                        $erros = $stmt->errorInfo();
                        error_log("API-SIMPLES INSERT ERROR: Falha na inserção: " . json_encode($erros));
                        throw new Exception("Erro na inserção: " . $erros[2]);
                    }
                    
                    $checklistId = $pdo->lastInsertId();
                    error_log("API-SIMPLES INSERT SUCCESS: Checklist inserido com ID: $checklistId");
                    
                    // ==========================================
                    // 📸 PROCESSAR FOTOS DO CHECKLIST
                    // ==========================================
                    $fotosProcessadas = 0;
                    if (isset($input['fotos']) && is_array($input['fotos']) && !empty($input['fotos'])) {
                        error_log("API-SIMPLES FOTOS: Processando " . count($input['fotos']) . " fotos para checklist ID=$checklistId");
                        
                        // Verificar se a tabela checklist_fotos existe
                        $stmt = $pdo->query("SHOW TABLES LIKE 'checklist_fotos'");
                        if ($stmt->rowCount() > 0) {
                            // Criar diretório para fotos se não existir
                            $diretorioFotos = 'uploads/checklist-fotos';
                            if (!is_dir($diretorioFotos)) {
                                mkdir($diretorioFotos, 0755, true);
                                error_log("API-SIMPLES FOTOS: Diretório criado: $diretorioFotos");
                            }
                            
                            foreach ($input['fotos'] as $foto) {
                                try {
                                    if (isset($foto['itemId']) && isset($foto['base64']) && !empty($foto['base64'])) {
                                        // Extrair dados base64 (remover prefixo se existir)
                                        $base64Data = $foto['base64'];
                                        if (strpos($base64Data, 'data:') === 0) {
                                            $base64Data = substr($base64Data, strpos($base64Data, ',') + 1);
                                        }
                                        
                                        // Decodificar base64
                                        $imagemData = base64_decode($base64Data);
                                        if ($imagemData === false) {
                                            error_log("API-SIMPLES FOTOS ERROR: Base64 inválido para item {$foto['itemId']}");
                                            continue;
                                        }
                                        
                                        // Gerar nome do arquivo
                                        $extensao = 'jpg'; // Padrão
                                        if (isset($foto['tipoMime'])) {
                                            if (strpos($foto['tipoMime'], 'png') !== false) $extensao = 'png';
                                            elseif (strpos($foto['tipoMime'], 'gif') !== false) $extensao = 'gif';
                                        }
                                        
                                        $nomeArquivo = "checklist_{$checklistId}_item_{$foto['itemId']}_" . time() . ".$extensao";
                                        $caminhoArquivo = $diretorioFotos . '/' . $nomeArquivo;
                                        
                                        // Salvar arquivo
                                        if (file_put_contents($caminhoArquivo, $imagemData)) {
                                            // Salvar no banco
                                            $sqlFoto = "INSERT INTO checklist_fotos (
                                                checklist_id, item_id, nome_arquivo, caminho_arquivo, 
                                                descricao_problema, base64_data, tamanho_arquivo, 
                                                tipo_mime, enviado_servidor, created_at
                                            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
                                            
                                            $stmtFoto = $pdo->prepare($sqlFoto);
                                            $stmtFoto->execute([
                                                $checklistId,
                                                $foto['itemId'],
                                                $nomeArquivo,
                                                $caminhoArquivo,
                                                isset($foto['descricao']) ? $foto['descricao'] : '',
                                                $base64Data, // Salvar base64 original
                                                strlen($imagemData),
                                                isset($foto['tipoMime']) ? $foto['tipoMime'] : 'image/jpeg',
                                                1, // Já enviado para servidor
                                                date('Y-m-d H:i:s')
                                            ]);
                                            
                                            $fotosProcessadas++;
                                            error_log("API-SIMPLES FOTOS SUCCESS: Foto salva - ID={$pdo->lastInsertId()}, Arquivo=$nomeArquivo, Item={$foto['itemId']}");
                                        } else {
                                            error_log("API-SIMPLES FOTOS ERROR: Falha ao salvar arquivo: $caminhoArquivo");
                                        }
                                    } else {
                                        error_log("API-SIMPLES FOTOS WARN: Foto sem dados obrigatórios: " . json_encode($foto));
                                    }
                                } catch (Exception $e) {
                                    error_log("API-SIMPLES FOTOS ERROR: Erro ao processar foto: " . $e->getMessage());
                                }
                            }
                        } else {
                            error_log("API-SIMPLES FOTOS WARN: Tabela checklist_fotos não existe - fotos não processadas");
                        }
                    } else {
                        error_log("API-SIMPLES FOTOS: Nenhuma foto enviada para checklist ID=$checklistId");
                    }
                    
                    // Log para auditoria COM CORREÇÃO
                    error_log("API-SIMPLES INSERT SUCCESS: Checklist ID=$checklistId, ViagemOriginal=$viagemIdLocal, ViagemCorrigida=$viagemIdCorreto, Veículo=$veiculoId, TipoCorreto=$tipoVeiculoCorreto, Fotos=$fotosProcessadas");
                    
                    resposta(true, [
                        'id' => $checklistId,
                        'viagemIdOriginal' => $viagemIdLocal,
                        'viagemIdCorrigido' => $viagemIdCorreto,
                        'tipoVeiculoCorreto' => $tipoVeiculoCorreto,
                        'clienteInfo' => $clienteInfo,
                        'fotosProcessadas' => $fotosProcessadas,
                        'message' => 'Checklist salvo com sucesso - ' . ($viagemReal ? 'Viagem encontrada e corrigida' : 'Rota/viagem local') . " - $fotosProcessadas fotos processadas"
                    ], 'Checklist salvo com sucesso');
                    
                } catch (Exception $e) {
                    error_log("API-SIMPLES CHECKLIST ERROR: Erro ao salvar checklist: " . $e->getMessage());
                    error_log("API-SIMPLES CHECKLIST ERROR: Stack trace: " . $e->getTraceAsString());
                    resposta(false, null, 'Erro ao salvar checklist: ' . $e->getMessage(), 500);
                }
                
            } elseif ($metodo === 'GET') {
                // Buscar checklists
                try {
                    $viagemId = isset($_GET['viagemId']) ? intval($_GET['viagemId']) : null;
                    $veiculoId = isset($_GET['veiculoId']) ? intval($_GET['veiculoId']) : null;
                    
                    if ($viagemId) {
                        // Buscar checklist específico por viagem
                        $stmt = $pdo->prepare("
                            SELECT c.*, v.modelo as veiculo_modelo, v.placa as veiculo_placa
                            FROM checklist_veiculo c
                            LEFT JOIN veiculos v ON c.veiculo_id = v.id
                            WHERE c.viagem_id = ?
                        ");
                        $stmt->execute([$viagemId]);
                        $checklist = $stmt->fetch();
                        
                        if ($checklist) {
                            $checklist['itens'] = json_decode($checklist['itens_json'], true);
                            unset($checklist['itens_json']);
                            resposta(true, $checklist, 'Checklist encontrado');
                        } else {
                            resposta(false, null, 'Checklist não encontrado', 404);
                        }
                        
                    } elseif ($veiculoId) {
                        // Buscar histórico de checklists por veículo
                        $stmt = $pdo->prepare("
                            SELECT c.*, v.modelo as veiculo_modelo, v.placa as veiculo_placa
                            FROM checklist_veiculo c
                            LEFT JOIN veiculos v ON c.veiculo_id = v.id
                            WHERE c.veiculo_id = ?
                            ORDER BY c.data_hora DESC
                            LIMIT 10
                        ");
                        $stmt->execute([$veiculoId]);
                        $checklists = $stmt->fetchAll();
                        
                        // Decodificar JSON dos itens
                        foreach ($checklists as &$checklist) {
                            $checklist['itens'] = json_decode($checklist['itens_json'], true);
                            unset($checklist['itens_json']);
                        }
                        
                        resposta(true, $checklists, 'Histórico de checklists');
                        
                    } else {
                        // Listar todos os checklists de forma simples
                        $stmt = $pdo->query("
                            SELECT 
                                id, viagem_id, veiculo_id, data_hora, 
                                observacoes_gerais, sincronizado,
                                JSON_LENGTH(itens_json) as total_itens
                            FROM checklist_veiculo 
                            ORDER BY data_hora DESC 
                            LIMIT 20
                        ");
                        $checklists = $stmt->fetchAll();
                        
                        // Processamento simples dos checklists
                        // (total_itens já vem da query usando JSON_LENGTH)
                        
                        resposta(true, $checklists, 'Lista de checklists disponíveis');
                    }
                    
                } catch (Exception $e) {
                    error_log("Erro ao buscar checklists: " . $e->getMessage());
                    resposta(false, [], 'Erro ao buscar checklists: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'verificar_colunas_veiculos':
            // Verificar se as colunas de contrato existem na tabela veículos
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Verificar colunas existentes
                    $stmt = $pdo->query("SHOW COLUMNS FROM veiculos");
                    $colunas = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    $output = "Colunas encontradas:\n";
                    foreach ($colunas as $coluna) {
                        $output .= "- {$coluna['Field']} ({$coluna['Type']})";
                        if ($coluna['Null'] === 'NO') $output .= " NOT NULL";
                        if (!empty($coluna['Default'])) $output .= " DEFAULT '{$coluna['Default']}'";
                        $output .= "\n";
                    }
                    
                    // Verificar colunas de contrato específicas
                    $colunasContrato = ['cliente_contrato_id', 'km_mensal_contrato', 'km_diario_contrato'];
                    $statusContrato = "";
                    
                    foreach ($colunasContrato as $coluna) {
                        $existe = false;
                        foreach ($colunas as $col) {
                            if ($col['Field'] === $coluna) {
                                $existe = true;
                                $statusContrato .= "✅ $coluna - EXISTS ({$col['Type']})\n";
                                break;
                            }
                        }
                        if (!$existe) {
                            $statusContrato .= "❌ $coluna - NOT EXISTS\n";
                        }
                    }
                    
                    // Buscar alguns dados de exemplo
                    $stmt = $pdo->query("SELECT id, modelo, placa, cliente_contrato_id, km_mensal_contrato, km_diario_contrato FROM veiculos LIMIT 3");
                    $veiculos = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    $dados = "";
                    if (empty($veiculos)) {
                        $dados = "Nenhum veículo encontrado.\n";
                    } else {
                        foreach ($veiculos as $veiculo) {
                            $dados .= "ID: {$veiculo['id']} | Modelo: {$veiculo['modelo']} | Placa: {$veiculo['placa']}\n";
                            $dados .= "  Cliente Contrato: " . ($veiculo['cliente_contrato_id'] ?? 'NULL') . "\n";
                            $dados .= "  KM Mensal: " . ($veiculo['km_mensal_contrato'] ?? 'NULL') . "\n";
                            $dados .= "  KM Diário: " . ($veiculo['km_diario_contrato'] ?? 'NULL') . "\n\n";
                        }
                    }
                    
                    resposta(true, [
                        'colunas' => $output,
                        'contrato' => $statusContrato,
                        'dados' => $dados
                    ], 'Verificação concluída');
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao verificar colunas: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'excluir_veiculo':
            // Excluir veículo
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    // Verificar se o veículo existe
                    $stmt = $pdo->prepare("SELECT id, placa FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    $veiculo = $stmt->fetch();
                    
                    if (!$veiculo) {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Verificar se há viagens em andamento
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM viagens 
                        WHERE veiculo_id = ? AND data_fim IS NULL
                    ");
                    $stmt->execute([$id]);
                    $viagensAtivas = $stmt->fetch()['total'];
                    
                    if ($viagensAtivas > 0) {
                        resposta(false, null, 'Não é possível excluir veículo com viagens em andamento', 400);
                    }
                    
                    // Excluir veículo
                    $stmt = $pdo->prepare("DELETE FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, "Veículo {$veiculo['placa']} excluído com sucesso");
                    } else {
                        resposta(false, null, 'Erro ao excluir veículo', 500);
                    }
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'excluir_cliente':
            // Excluir cliente
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do cliente é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do cliente inválido', 400);
                }
                
                try {
                    // Verificar se o cliente existe
                    $stmt = $pdo->prepare("SELECT id, nome FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    $cliente = $stmt->fetch();
                    
                    if (!$cliente) {
                        resposta(false, null, 'Cliente não encontrado', 404);
                    }
                    
                    // Verificar se há veículos vinculados a este cliente
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM veiculos 
                        WHERE cliente_contrato_id = ?
                    ");
                    $stmt->execute([$id]);
                    $veiculosVinculados = $stmt->fetch()['total'];
                    
                    if ($veiculosVinculados > 0) {
                        resposta(false, null, 'Não é possível excluir cliente com veículos vinculados', 400);
                    }
                    
                    // Verificar se há viagens vinculadas a este cliente
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM viagens 
                        WHERE cliente_id = ? OR cliente = (SELECT nome FROM clientes WHERE id = ?)
                    ");
                    $stmt->execute([$id, $id]);
                    $viagensVinculadas = $stmt->fetch()['total'];
                    
                    if ($viagensVinculadas > 0) {
                        resposta(false, null, 'Não é possível excluir cliente com viagens vinculadas', 400);
                    }
                    
                    // Excluir cliente
                    $stmt = $pdo->prepare("DELETE FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, "Cliente {$cliente['nome']} excluído com sucesso");
                    } else {
                        resposta(false, null, 'Erro ao excluir cliente', 500);
                    }
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir cliente: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'cliente':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                // Buscar cliente individual
                $id = isset($_GET['id']) ? $_GET['id'] : null;
                
                if (!$id || !is_numeric($id)) {
                    resposta(false, null, 'ID do cliente é obrigatório e deve ser numérico', 400);
                }
                
                try {
                    $stmt = $pdo->prepare("SELECT * FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    $cliente = $stmt->fetch();
                    
                    if ($cliente) {
                        resposta(true, $cliente, 'Cliente encontrado');
                    } else {
                        resposta(false, null, 'Cliente não encontrado', 404);
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao buscar cliente: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'veiculo':
            // Buscar veículo específico por ID
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                $id = isset($_GET['id']) ? intval($_GET['id']) : 0;
                
                error_log("========== DEBUG BUSCAR VEÍCULO ==========");
                error_log("ID recebido: " . ($_GET['id'] ?? 'NULL'));
                error_log("ID convertido: " . $id);
                
                if ($id <= 0) {
                    error_log("ID inválido: " . $id);
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    // Primeiro, vamos verificar se existem veículos na tabela
                    $stmtCount = $pdo->query("SELECT COUNT(*) as total FROM veiculos");
                    $total = $stmtCount->fetch()['total'];
                    error_log("Total de veículos na tabela: " . $total);
                    
                    // Verificar se existe com campos básicos primeiro
                    $stmtSimple = $pdo->prepare("SELECT id, modelo, placa FROM veiculos WHERE id = ?");
                    $stmtSimple->execute([$id]);
                    $veiculoBasico = $stmtSimple->fetch();
                    error_log("Veículo básico encontrado: " . ($veiculoBasico ? "SIM" : "NÃO"));
                    
                    if (!$veiculoBasico) {
                        error_log("Veículo com ID $id não existe");
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Agora buscar com todos os campos, tratando NULLs e incluindo dados de contrato
                    $stmt = $pdo->prepare("
                        SELECT 
                            v.id, 
                            v.modelo, 
                            IFNULL(v.marca, '') as marca, 
                            v.placa, 
                            IFNULL(v.ano_fabricacao, '') as ano_fabricacao, 
                            IFNULL(v.tipo, 'carro') as tipo, 
                            IFNULL(v.cor, '') as cor, 
                            IFNULL(v.odometro_atual, 0) as odometro_atual,
                            IFNULL(v.observacoes, '') as observacoes,
                            v.cliente_contrato_id,
                            v.km_mensal_contrato,
                            v.km_diario_contrato,
                            c.nome as cliente_contrato_nome,
                            CASE 
                                WHEN v.status IS NULL OR v.status = '' THEN 'ativo'
                                ELSE v.status 
                            END as status
                        FROM veiculos v
                        LEFT JOIN clientes c ON v.cliente_contrato_id = c.id
                        WHERE v.id = ?
                    ");
                    $stmt->execute([$id]);
                    $veiculo = $stmt->fetch();
                    
                    error_log("Veículo completo encontrado: " . ($veiculo ? "SIM" : "NÃO"));
                    if ($veiculo) {
                        error_log("Dados do veículo: " . json_encode($veiculo));
                    }
                    
                    if ($veiculo) {
                        resposta(true, $veiculo, 'Veículo encontrado');
                    } else {
                        resposta(false, null, 'Erro ao buscar dados completos do veículo', 500);
                    }
                } catch (Exception $e) {
                    error_log("Erro na consulta: " . $e->getMessage());
                    resposta(false, null, 'Erro ao buscar veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'liberar_veiculo':
            // Liberar veículo (mudar status de "em_uso" para "ativo")
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    // Verificar se o veículo existe
                    $stmt = $pdo->prepare("SELECT id, placa, status FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    $veiculo = $stmt->fetch();
                    
                    if (!$veiculo) {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Atualizar status para ativo
                    $stmt = $pdo->prepare("UPDATE veiculos SET status = 'ativo' WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    // Também finalizar viagens em andamento deste veículo, se houver
                    $stmt = $pdo->prepare("
                        UPDATE viagens 
                        SET data_fim = NOW() 
                        WHERE veiculo_id = ? AND data_fim IS NULL
                    ");
                    $stmt->execute([$id]);
                    
                    resposta(true, ['id' => $id], "Veículo {$veiculo['placa']} liberado com sucesso");
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao liberar veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'atualizar-veiculo':
            // Atualizar dados do veículo
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['modelo', 'placa'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo]) || empty($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                try {
                    // Verificar se o veículo existe
                    $stmt = $pdo->prepare("SELECT id FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if (!$stmt->fetch()) {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Atualizar veículo incluindo campos de contrato
                    $sql = "UPDATE veiculos SET 
                        modelo = ?, 
                        marca = ?, 
                        placa = ?, 
                        ano_fabricacao = ?, 
                        tipo = ?, 
                        cor = ?, 
                        odometro_atual = ?,
                        cliente_contrato_id = ?,
                        km_mensal_contrato = ?,
                        km_diario_contrato = ?
                        WHERE id = ?";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $input['modelo'],
                        isset($input['marca']) ? $input['marca'] : null,
                        $input['placa'],
                        isset($input['anoFabricacao']) ? $input['anoFabricacao'] : null,
                        isset($input['tipo']) ? $input['tipo'] : 'carro',
                        isset($input['cor']) ? $input['cor'] : null,
                        isset($input['odometroAtual']) ? intval($input['odometroAtual']) : 0,
                        isset($input['clienteContrato']) && !empty($input['clienteContrato']) ? intval($input['clienteContrato']) : null,
                        isset($input['kmMensal']) && !empty($input['kmMensal']) ? intval($input['kmMensal']) : null,
                        isset($input['kmDiario']) && !empty($input['kmDiario']) ? intval($input['kmDiario']) : null,
                        $id
                    ]);
                    
                    resposta(true, ['id' => $id], 'Veículo atualizado com sucesso');
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao atualizar veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'checklist_veiculo':
            // API para checklist de veículo
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                // Salvar checklist
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados do checklist são obrigatórios', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['viagemId', 'veiculoId', 'itens'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                try {
                    // CORREÇÃO AUTOMÁTICA DE IDs - BUSCAR VIAGEM REAL
                    $viagemIdLocal = intval($input['viagemId']);
                    $veiculoId = intval($input['veiculoId']);
                    $dataHoraChecklist = isset($input['dataHora']) ? $input['dataHora'] : date('Y-m-d H:i:s');
                    
                    // Log dos dados recebidos para debug
                    error_log("API-SIMPLES CHECKLIST DEBUG: App enviou viagemId=$viagemIdLocal, veiculoId=$veiculoId, dataHora=$dataHoraChecklist");
                    
                    // Buscar a viagem real no servidor usando múltiplos critérios
                    $viagemReal = null;
                    
                    // Buscar viagem pelo veículo na data específica
                    $dataChecklist = date('Y-m-d', strtotime($dataHoraChecklist));
                    $sqlViagem = "SELECT id, data_inicio, cliente 
                                FROM viagens 
                                WHERE veiculo_id = ? 
                                AND DATE(data_inicio) = ? 
                                ORDER BY id DESC 
                                LIMIT 1";
                    
                    $stmtViagem = $pdo->prepare($sqlViagem);
                    $stmtViagem->execute([$veiculoId, $dataChecklist]);
                    $viagemReal = $stmtViagem->fetch();
                    
                    if (!$viagemReal) {
                        error_log("API-SIMPLES ERROR: Nenhuma viagem encontrada! ViagemIdLocal=$viagemIdLocal, VeiculoId=$veiculoId, Data=$dataChecklist");
                        resposta(false, null, "Viagem não encontrada. Por favor, verifique se existe uma viagem ativa para este veículo na data $dataChecklist", 404);
                        return;
                    }
                    
                    $viagemIdCorreto = $viagemReal['id']; // ID real da viagem no servidor
                    
                    // Log da correção para debug
                    error_log("API-SIMPLES SUCCESS: Conversão de ID - App enviou: $viagemIdLocal, Usando: $viagemIdCorreto (Cliente: {$viagemReal['cliente']})");
                    
                    // Verificar se já existe checklist para esta viagem
                    $stmt = $pdo->prepare("SELECT id FROM checklist_veiculo WHERE viagem_id = ? AND veiculo_id = ?");
                    $stmt->execute([$viagemIdCorreto, $veiculoId]);
                    if ($stmt->fetch()) {
                        error_log("API-SIMPLES WARN: Checklist já existe para esta viagem/veículo");
                        // Permitir múltiplos checklists por enquanto
                        // resposta(false, null, 'Já existe um checklist para esta viagem', 400);
                        // return;
                    }
                    
                    // ==========================================
                    // 🔧 BUSCAR TIPO CORRETO DO VEÍCULO
                    // ==========================================
                    // IGNORAR o tipo enviado pelo app e buscar o correto do banco
                    $stmt_veiculo = $pdo->prepare("SELECT tipo FROM veiculos WHERE id = ?");
                    $stmt_veiculo->execute([$veiculoId]);
                    $veiculo_info = $stmt_veiculo->fetch(PDO::FETCH_ASSOC);
                    
                    if (!$veiculo_info) {
                        error_log("API-SIMPLES ERROR: Veículo ID $veiculoId não encontrado na tabela veiculos");
                        resposta(false, null, "Veículo não encontrado", 400);
                        return;
                    }
                    
                    // Usar o tipo CORRETO do banco, não o enviado pelo app
                    $tipoVeiculoCorreto = strtoupper($veiculo_info['tipo']);
                    
                    // Log da correção se houve diferença
                    $tipoEnviado = isset($input['tipoVeiculo']) ? strtoupper($input['tipoVeiculo']) : 'NAO_ENVIADO';
                    if ($tipoEnviado !== $tipoVeiculoCorreto) {
                        error_log("🔧 API-SIMPLES CORREÇÃO: App enviou '$tipoEnviado' mas veículo $veiculoId é '$tipoVeiculoCorreto'");
                    }
                    
                    // Inserir checklist COM O ID CORRETO E TIPO CORRETO
                    $sql = "INSERT INTO checklist_veiculo (
                        viagem_id, veiculo_id, tipo_veiculo, data_hora, itens_json, observacoes_gerais
                    ) VALUES (?, ?, ?, ?, ?, ?)";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $viagemIdCorreto,      // USANDO O ID CORRETO!
                        $veiculoId,
                        $tipoVeiculoCorreto,   // USANDO O TIPO CORRETO DO BANCO!
                        $dataHoraChecklist,
                        json_encode($input['itens'], JSON_UNESCAPED_UNICODE),
                        isset($input['observacoesGerais']) ? $input['observacoesGerais'] : null
                    ]);
                    
                    $checklistId = $pdo->lastInsertId();
                    
                    // Log para auditoria COM CORREÇÃO
                    error_log("API-SIMPLES INSERT SUCCESS: Checklist ID=$checklistId, ViagemOriginal=$viagemIdLocal, ViagemCorrigida=$viagemIdCorreto, Veículo=$veiculoId, TipoCorreto=$tipoVeiculoCorreto");
                    
                    resposta(true, [
                        'id' => $checklistId,
                        'viagemIdOriginal' => $viagemIdLocal,
                        'viagemIdCorrigido' => $viagemIdCorreto,
                        'tipoVeiculoCorreto' => $tipoVeiculoCorreto,
                        'message' => 'Checklist salvo com sucesso - ID da viagem e tipo de veículo corrigidos automaticamente'
                    ], 'Checklist salvo com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao salvar checklist: " . $e->getMessage());
                    resposta(false, null, 'Erro ao salvar checklist: ' . $e->getMessage(), 500);
                }
                
            } elseif ($metodo === 'GET') {
                // Buscar checklists
                try {
                    $viagemId = isset($_GET['viagemId']) ? intval($_GET['viagemId']) : null;
                    $veiculoId = isset($_GET['veiculoId']) ? intval($_GET['veiculoId']) : null;
                    
                    if ($viagemId) {
                        // Buscar checklist específico por viagem
                        $stmt = $pdo->prepare("
                            SELECT c.*, v.modelo as veiculo_modelo, v.placa as veiculo_placa
                            FROM checklist_veiculo c
                            LEFT JOIN veiculos v ON c.veiculo_id = v.id
                            WHERE c.viagem_id = ?
                        ");
                        $stmt->execute([$viagemId]);
                        $checklist = $stmt->fetch();
                        
                        if ($checklist) {
                            $checklist['itens'] = json_decode($checklist['itens_json'], true);
                            unset($checklist['itens_json']);
                            resposta(true, $checklist, 'Checklist encontrado');
                        } else {
                            resposta(false, null, 'Checklist não encontrado', 404);
                        }
                        
                    } elseif ($veiculoId) {
                        // Buscar histórico de checklists por veículo
                        $stmt = $pdo->prepare("
                            SELECT c.*, v.modelo as veiculo_modelo, v.placa as veiculo_placa
                            FROM checklist_veiculo c
                            LEFT JOIN veiculos v ON c.veiculo_id = v.id
                            WHERE c.veiculo_id = ?
                            ORDER BY c.data_hora DESC
                            LIMIT 10
                        ");
                        $stmt->execute([$veiculoId]);
                        $checklists = $stmt->fetchAll();
                        
                        // Decodificar JSON dos itens
                        foreach ($checklists as &$checklist) {
                            $checklist['itens'] = json_decode($checklist['itens_json'], true);
                            unset($checklist['itens_json']);
                        }
                        
                        resposta(true, $checklists, 'Histórico de checklists');
                        
                    } else {
                        // Listar todos os checklists de forma simples
                        $stmt = $pdo->query("
                            SELECT 
                                id, viagem_id, veiculo_id, data_hora, 
                                observacoes_gerais, sincronizado,
                                JSON_LENGTH(itens_json) as total_itens
                            FROM checklist_veiculo 
                            ORDER BY data_hora DESC 
                            LIMIT 20
                        ");
                        $checklists = $stmt->fetchAll();
                        
                        // Processamento simples dos checklists
                        // (total_itens já vem da query usando JSON_LENGTH)
                        
                        resposta(true, $checklists, 'Lista de checklists disponíveis');
                    }
                    
                } catch (Exception $e) {
                    error_log("Erro ao buscar checklists: " . $e->getMessage());
                    resposta(false, [], 'Erro ao buscar checklists: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'verificar_colunas_veiculos':
            // Verificar se as colunas de contrato existem na tabela veículos
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Verificar colunas existentes
                    $stmt = $pdo->query("SHOW COLUMNS FROM veiculos");
                    $colunas = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    $output = "Colunas encontradas:\n";
                    foreach ($colunas as $coluna) {
                        $output .= "- {$coluna['Field']} ({$coluna['Type']})";
                        if ($coluna['Null'] === 'NO') $output .= " NOT NULL";
                        if (!empty($coluna['Default'])) $output .= " DEFAULT '{$coluna['Default']}'";
                        $output .= "\n";
                    }
                    
                    // Verificar colunas de contrato específicas
                    $colunasContrato = ['cliente_contrato_id', 'km_mensal_contrato', 'km_diario_contrato'];
                    $statusContrato = "";
                    
                    foreach ($colunasContrato as $coluna) {
                        $existe = false;
                        foreach ($colunas as $col) {
                            if ($col['Field'] === $coluna) {
                                $existe = true;
                                $statusContrato .= "✅ $coluna - EXISTS ({$col['Type']})\n";
                                break;
                            }
                        }
                        if (!$existe) {
                            $statusContrato .= "❌ $coluna - NOT EXISTS\n";
                        }
                    }
                    
                    // Buscar alguns dados de exemplo
                    $stmt = $pdo->query("SELECT id, modelo, placa, cliente_contrato_id, km_mensal_contrato, km_diario_contrato FROM veiculos LIMIT 3");
                    $veiculos = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    $dados = "";
                    if (empty($veiculos)) {
                        $dados = "Nenhum veículo encontrado.\n";
                    } else {
                        foreach ($veiculos as $veiculo) {
                            $dados .= "ID: {$veiculo['id']} | Modelo: {$veiculo['modelo']} | Placa: {$veiculo['placa']}\n";
                            $dados .= "  Cliente Contrato: " . ($veiculo['cliente_contrato_id'] ?? 'NULL') . "\n";
                            $dados .= "  KM Mensal: " . ($veiculo['km_mensal_contrato'] ?? 'NULL') . "\n";
                            $dados .= "  KM Diário: " . ($veiculo['km_diario_contrato'] ?? 'NULL') . "\n\n";
                        }
                    }
                    
                    resposta(true, [
                        'colunas' => $output,
                        'contrato' => $statusContrato,
                        'dados' => $dados
                    ], 'Verificação concluída');
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao verificar colunas: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'excluir_veiculo':
            // Excluir veículo
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    // Verificar se o veículo existe
                    $stmt = $pdo->prepare("SELECT id, placa FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    $veiculo = $stmt->fetch();
                    
                    if (!$veiculo) {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Verificar se há viagens em andamento
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM viagens 
                        WHERE veiculo_id = ? AND data_fim IS NULL
                    ");
                    $stmt->execute([$id]);
                    $viagensAtivas = $stmt->fetch()['total'];
                    
                    if ($viagensAtivas > 0) {
                        resposta(false, null, 'Não é possível excluir veículo com viagens em andamento', 400);
                    }
                    
                    // Excluir veículo
                    $stmt = $pdo->prepare("DELETE FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, "Veículo {$veiculo['placa']} excluído com sucesso");
                    } else {
                        resposta(false, null, 'Erro ao excluir veículo', 500);
                    }
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'excluir_cliente':
            // Excluir cliente
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do cliente é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do cliente inválido', 400);
                }
                
                try {
                    // Verificar se o cliente existe
                    $stmt = $pdo->prepare("SELECT id, nome FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    $cliente = $stmt->fetch();
                    
                    if (!$cliente) {
                        resposta(false, null, 'Cliente não encontrado', 404);
                    }
                    
                    // Verificar se há veículos vinculados a este cliente
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM veiculos 
                        WHERE cliente_contrato_id = ?
                    ");
                    $stmt->execute([$id]);
                    $veiculosVinculados = $stmt->fetch()['total'];
                    
                    if ($veiculosVinculados > 0) {
                        resposta(false, null, 'Não é possível excluir cliente com veículos vinculados', 400);
                    }
                    
                    // Verificar se há viagens vinculadas a este cliente
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM viagens 
                        WHERE cliente_id = ? OR cliente = (SELECT nome FROM clientes WHERE id = ?)
                    ");
                    $stmt->execute([$id, $id]);
                    $viagensVinculadas = $stmt->fetch()['total'];
                    
                    if ($viagensVinculadas > 0) {
                        resposta(false, null, 'Não é possível excluir cliente com viagens vinculadas', 400);
                    }
                    
                    // Excluir cliente
                    $stmt = $pdo->prepare("DELETE FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, "Cliente {$cliente['nome']} excluído com sucesso");
                    } else {
                        resposta(false, null, 'Erro ao excluir cliente', 500);
                    }
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir cliente: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'cliente':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                // Buscar cliente individual
                $id = isset($_GET['id']) ? $_GET['id'] : null;
                
                if (!$id || !is_numeric($id)) {
                    resposta(false, null, 'ID do cliente é obrigatório e deve ser numérico', 400);
                }
                
                try {
                    $stmt = $pdo->prepare("SELECT * FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    $cliente = $stmt->fetch();
                    
                    if ($cliente) {
                        resposta(true, $cliente, 'Cliente encontrado');
                    } else {
                        resposta(false, null, 'Cliente não encontrado', 404);
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao buscar cliente: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'veiculo':
            // Buscar veículo específico por ID
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                $id = isset($_GET['id']) ? intval($_GET['id']) : 0;
                
                error_log("========== DEBUG BUSCAR VEÍCULO ==========");
                error_log("ID recebido: " . ($_GET['id'] ?? 'NULL'));
                error_log("ID convertido: " . $id);
                
                if ($id <= 0) {
                    error_log("ID inválido: " . $id);
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    // Primeiro, vamos verificar se existem veículos na tabela
                    $stmtCount = $pdo->query("SELECT COUNT(*) as total FROM veiculos");
                    $total = $stmtCount->fetch()['total'];
                    error_log("Total de veículos na tabela: " . $total);
                    
                    // Verificar se existe com campos básicos primeiro
                    $stmtSimple = $pdo->prepare("SELECT id, modelo, placa FROM veiculos WHERE id = ?");
                    $stmtSimple->execute([$id]);
                    $veiculoBasico = $stmtSimple->fetch();
                    error_log("Veículo básico encontrado: " . ($veiculoBasico ? "SIM" : "NÃO"));
                    
                    if (!$veiculoBasico) {
                        error_log("Veículo com ID $id não existe");
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Agora buscar com todos os campos, tratando NULLs e incluindo dados de contrato
                    $stmt = $pdo->prepare("
                        SELECT 
                            v.id, 
                            v.modelo, 
                            IFNULL(v.marca, '') as marca, 
                            v.placa, 
                            IFNULL(v.ano_fabricacao, '') as ano_fabricacao, 
                            IFNULL(v.tipo, 'carro') as tipo, 
                            IFNULL(v.cor, '') as cor, 
                            IFNULL(v.odometro_atual, 0) as odometro_atual,
                            IFNULL(v.observacoes, '') as observacoes,
                            v.cliente_contrato_id,
                            v.km_mensal_contrato,
                            v.km_diario_contrato,
                            c.nome as cliente_contrato_nome,
                            CASE 
                                WHEN v.status IS NULL OR v.status = '' THEN 'ativo'
                                ELSE v.status 
                            END as status
                        FROM veiculos v
                        LEFT JOIN clientes c ON v.cliente_contrato_id = c.id
                        WHERE v.id = ?
                    ");
                    $stmt->execute([$id]);
                    $veiculo = $stmt->fetch();
                    
                    error_log("Veículo completo encontrado: " . ($veiculo ? "SIM" : "NÃO"));
                    if ($veiculo) {
                        error_log("Dados do veículo: " . json_encode($veiculo));
                    }
                    
                    if ($veiculo) {
                        resposta(true, $veiculo, 'Veículo encontrado');
                    } else {
                        resposta(false, null, 'Erro ao buscar dados completos do veículo', 500);
                    }
                } catch (Exception $e) {
                    error_log("Erro na consulta: " . $e->getMessage());
                    resposta(false, null, 'Erro ao buscar veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'liberar_veiculo':
            // Liberar veículo (mudar status de "em_uso" para "ativo")
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    // Verificar se o veículo existe
                    $stmt = $pdo->prepare("SELECT id, placa, status FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    $veiculo = $stmt->fetch();
                    
                    if (!$veiculo) {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Atualizar status para ativo
                    $stmt = $pdo->prepare("UPDATE veiculos SET status = 'ativo' WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    // Também finalizar viagens em andamento deste veículo, se houver
                    $stmt = $pdo->prepare("
                        UPDATE viagens 
                        SET data_fim = NOW() 
                        WHERE veiculo_id = ? AND data_fim IS NULL
                    ");
                    $stmt->execute([$id]);
                    
                    resposta(true, ['id' => $id], "Veículo {$veiculo['placa']} liberado com sucesso");
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao liberar veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'atualizar-veiculo':
            // Atualizar dados do veículo
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['modelo', 'placa'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo]) || empty($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                try {
                    // Verificar se o veículo existe
                    $stmt = $pdo->prepare("SELECT id FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if (!$stmt->fetch()) {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Atualizar veículo incluindo campos de contrato
                    $sql = "UPDATE veiculos SET 
                        modelo = ?, 
                        marca = ?, 
                        placa = ?, 
                        ano_fabricacao = ?, 
                        tipo = ?, 
                        cor = ?, 
                        odometro_atual = ?,
                        cliente_contrato_id = ?,
                        km_mensal_contrato = ?,
                        km_diario_contrato = ?
                        WHERE id = ?";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $input['modelo'],
                        isset($input['marca']) ? $input['marca'] : null,
                        $input['placa'],
                        isset($input['anoFabricacao']) ? $input['anoFabricacao'] : null,
                        isset($input['tipo']) ? $input['tipo'] : 'carro',
                        isset($input['cor']) ? $input['cor'] : null,
                        isset($input['odometroAtual']) ? intval($input['odometroAtual']) : 0,
                        isset($input['clienteContrato']) && !empty($input['clienteContrato']) ? intval($input['clienteContrato']) : null,
                        isset($input['kmMensal']) && !empty($input['kmMensal']) ? intval($input['kmMensal']) : null,
                        isset($input['kmDiario']) && !empty($input['kmDiario']) ? intval($input['kmDiario']) : null,
                        $id
                    ]);
                    
                    resposta(true, ['id' => $id], 'Veículo atualizado com sucesso');
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao atualizar veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'checklist_veiculo':
            // API para checklist de veículo
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                // Salvar checklist
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados do checklist são obrigatórios', 400);
                }
                
                // Validar campos obrigatórios
                $camposObrigatorios = ['viagemId', 'veiculoId', 'itens'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }
                
                try {
                    // CORREÇÃO AUTOMÁTICA DE IDs - BUSCAR VIAGEM REAL
                    $viagemIdLocal = intval($input['viagemId']);
                    $veiculoId = intval($input['veiculoId']);
                    $dataHoraChecklist = isset($input['dataHora']) ? $input['dataHora'] : date('Y-m-d H:i:s');
                    
                    // Log dos dados recebidos para debug
                    error_log("API-SIMPLES CHECKLIST DEBUG: App enviou viagemId=$viagemIdLocal, veiculoId=$veiculoId, dataHora=$dataHoraChecklist");
                    
                    // Buscar a viagem real no servidor usando múltiplos critérios
                    $viagemReal = null;
                    
                    // Buscar viagem pelo veículo na data específica
                    $dataChecklist = date('Y-m-d', strtotime($dataHoraChecklist));
                    $sqlViagem = "SELECT id, data_inicio, cliente 
                                FROM viagens 
                                WHERE veiculo_id = ? 
                                AND DATE(data_inicio) = ? 
                                ORDER BY id DESC 
                                LIMIT 1";
                    
                    $stmtViagem = $pdo->prepare($sqlViagem);
                    $stmtViagem->execute([$veiculoId, $dataChecklist]);
                    $viagemReal = $stmtViagem->fetch();
                    
                    if (!$viagemReal) {
                        error_log("API-SIMPLES ERROR: Nenhuma viagem encontrada! ViagemIdLocal=$viagemIdLocal, VeiculoId=$veiculoId, Data=$dataChecklist");
                        resposta(false, null, "Viagem não encontrada. Por favor, verifique se existe uma viagem ativa para este veículo na data $dataChecklist", 404);
                        return;
                    }
                    
                    $viagemIdCorreto = $viagemReal['id']; // ID real da viagem no servidor
                    
                    // Log da correção para debug
                    error_log("API-SIMPLES SUCCESS: Conversão de ID - App enviou: $viagemIdLocal, Usando: $viagemIdCorreto (Cliente: {$viagemReal['cliente']})");
                    
                    // Verificar se já existe checklist para esta viagem
                    $stmt = $pdo->prepare("SELECT id FROM checklist_veiculo WHERE viagem_id = ? AND veiculo_id = ?");
                    $stmt->execute([$viagemIdCorreto, $veiculoId]);
                    if ($stmt->fetch()) {
                        error_log("API-SIMPLES WARN: Checklist já existe para esta viagem/veículo");
                        // Permitir múltiplos checklists por enquanto
                        // resposta(false, null, 'Já existe um checklist para esta viagem', 400);
                        // return;
                    }
                    
                    // ==========================================
                    // 🔧 BUSCAR TIPO CORRETO DO VEÍCULO
                    // ==========================================
                    // IGNORAR o tipo enviado pelo app e buscar o correto do banco
                    $stmt_veiculo = $pdo->prepare("SELECT tipo FROM veiculos WHERE id = ?");
                    $stmt_veiculo->execute([$veiculoId]);
                    $veiculo_info = $stmt_veiculo->fetch(PDO::FETCH_ASSOC);
                    
                    if (!$veiculo_info) {
                        error_log("API-SIMPLES ERROR: Veículo ID $veiculoId não encontrado na tabela veiculos");
                        resposta(false, null, "Veículo não encontrado", 400);
                        return;
                    }
                    
                    // Usar o tipo CORRETO do banco, não o enviado pelo app
                    $tipoVeiculoCorreto = strtoupper($veiculo_info['tipo']);
                    
                    // Log da correção se houve diferença
                    $tipoEnviado = isset($input['tipoVeiculo']) ? strtoupper($input['tipoVeiculo']) : 'NAO_ENVIADO';
                    if ($tipoEnviado !== $tipoVeiculoCorreto) {
                        error_log("🔧 API-SIMPLES CORREÇÃO: App enviou '$tipoEnviado' mas veículo $veiculoId é '$tipoVeiculoCorreto'");
                    }
                    
                    // Inserir checklist COM O ID CORRETO E TIPO CORRETO
                    $sql = "INSERT INTO checklist_veiculo (
                        viagem_id, veiculo_id, tipo_veiculo, data_hora, itens_json, observacoes_gerais
                    ) VALUES (?, ?, ?, ?, ?, ?)";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        $viagemIdCorreto,      // USANDO O ID CORRETO!
                        $veiculoId,
                        $tipoVeiculoCorreto,   // USANDO O TIPO CORRETO DO BANCO!
                        $dataHoraChecklist,
                        json_encode($input['itens'], JSON_UNESCAPED_UNICODE),
                        isset($input['observacoesGerais']) ? $input['observacoesGerais'] : null
                    ]);
                    
                    $checklistId = $pdo->lastInsertId();
                    
                    // Log para auditoria COM CORREÇÃO
                    error_log("API-SIMPLES INSERT SUCCESS: Checklist ID=$checklistId, ViagemOriginal=$viagemIdLocal, ViagemCorrigida=$viagemIdCorreto, Veículo=$veiculoId, TipoCorreto=$tipoVeiculoCorreto");
                    
                    resposta(true, [
                        'id' => $checklistId,
                        'viagemIdOriginal' => $viagemIdLocal,
                        'viagemIdCorrigido' => $viagemIdCorreto,
                        'tipoVeiculoCorreto' => $tipoVeiculoCorreto,
                        'message' => 'Checklist salvo com sucesso - ID da viagem e tipo de veículo corrigidos automaticamente'
                    ], 'Checklist salvo com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao salvar checklist: " . $e->getMessage());
                    resposta(false, null, 'Erro ao salvar checklist: ' . $e->getMessage(), 500);
                }
                
            } elseif ($metodo === 'GET') {
                // Buscar checklists
                try {
                    $viagemId = isset($_GET['viagemId']) ? intval($_GET['viagemId']) : null;
                    $veiculoId = isset($_GET['veiculoId']) ? intval($_GET['veiculoId']) : null;
                    
                    if ($viagemId) {
                        // Buscar checklist específico por viagem
                        $stmt = $pdo->prepare("
                            SELECT c.*, v.modelo as veiculo_modelo, v.placa as veiculo_placa
                            FROM checklist_veiculo c
                            LEFT JOIN veiculos v ON c.veiculo_id = v.id
                            WHERE c.viagem_id = ?
                        ");
                        $stmt->execute([$viagemId]);
                        $checklist = $stmt->fetch();
                        
                        if ($checklist) {
                            $checklist['itens'] = json_decode($checklist['itens_json'], true);
                            unset($checklist['itens_json']);
                            resposta(true, $checklist, 'Checklist encontrado');
                        } else {
                            resposta(false, null, 'Checklist não encontrado', 404);
                        }
                        
                    } elseif ($veiculoId) {
                        // Buscar histórico de checklists por veículo
                        $stmt = $pdo->prepare("
                            SELECT c.*, v.modelo as veiculo_modelo, v.placa as veiculo_placa
                            FROM checklist_veiculo c
                            LEFT JOIN veiculos v ON c.veiculo_id = v.id
                            WHERE c.veiculo_id = ?
                            ORDER BY c.data_hora DESC
                            LIMIT 10
                        ");
                        $stmt->execute([$veiculoId]);
                        $checklists = $stmt->fetchAll();
                        
                        // Decodificar JSON dos itens
                        foreach ($checklists as &$checklist) {
                            $checklist['itens'] = json_decode($checklist['itens_json'], true);
                            unset($checklist['itens_json']);
                        }
                        
                        resposta(true, $checklists, 'Histórico de checklists');
                        
                    } else {
                        // Listar todos os checklists de forma simples
                        $stmt = $pdo->query("
                            SELECT 
                                id, viagem_id, veiculo_id, data_hora, 
                                observacoes_gerais, sincronizado,
                                JSON_LENGTH(itens_json) as total_itens
                            FROM checklist_veiculo 
                            ORDER BY data_hora DESC 
                            LIMIT 20
                        ");
                        $checklists = $stmt->fetchAll();
                        
                        // Processamento simples dos checklists
                        // (total_itens já vem da query usando JSON_LENGTH)
                        
                        resposta(true, $checklists, 'Lista de checklists disponíveis');
                    }
                    
                } catch (Exception $e) {
                    error_log("Erro ao buscar checklists: " . $e->getMessage());
                    resposta(false, [], 'Erro ao buscar checklists: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'verificar_colunas_veiculos':
            // Verificar se as colunas de contrato existem na tabela veículos
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Verificar colunas existentes
                    $stmt = $pdo->query("SHOW COLUMNS FROM veiculos");
                    $colunas = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    $output = "Colunas encontradas:\n";
                    foreach ($colunas as $coluna) {
                        $output .= "- {$coluna['Field']} ({$coluna['Type']})";
                        if ($coluna['Null'] === 'NO') $output .= " NOT NULL";
                        if (!empty($coluna['Default'])) $output .= " DEFAULT '{$coluna['Default']}'";
                        $output .= "\n";
                    }
                    
                    // Verificar colunas de contrato específicas
                    $colunasContrato = ['cliente_contrato_id', 'km_mensal_contrato', 'km_diario_contrato'];
                    $statusContrato = "";
                    
                    foreach ($colunasContrato as $coluna) {
                        $existe = false;
                        foreach ($colunas as $col) {
                            if ($col['Field'] === $coluna) {
                                $existe = true;
                                $statusContrato .= "✅ $coluna - EXISTS ({$col['Type']})\n";
                                break;
                            }
                        }
                        if (!$existe) {
                            $statusContrato .= "❌ $coluna - NOT EXISTS\n";
                        }
                    }
                    
                    // Buscar alguns dados de exemplo
                    $stmt = $pdo->query("SELECT id, modelo, placa, cliente_contrato_id, km_mensal_contrato, km_diario_contrato FROM veiculos LIMIT 3");
                    $veiculos = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    $dados = "";
                    if (empty($veiculos)) {
                        $dados = "Nenhum veículo encontrado.\n";
                    } else {
                        foreach ($veiculos as $veiculo) {
                            $dados .= "ID: {$veiculo['id']} | Modelo: {$veiculo['modelo']} | Placa: {$veiculo['placa']}\n";
                            $dados .= "  Cliente Contrato: " . ($veiculo['cliente_contrato_id'] ?? 'NULL') . "\n";
                            $dados .= "  KM Mensal: " . ($veiculo['km_mensal_contrato'] ?? 'NULL') . "\n";
                            $dados .= "  KM Diário: " . ($veiculo['km_diario_contrato'] ?? 'NULL') . "\n\n";
                        }
                    }
                    
                    resposta(true, [
                        'colunas' => $output,
                        'contrato' => $statusContrato,
                        'dados' => $dados
                    ], 'Verificação concluída');
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao verificar colunas: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'excluir_veiculo':
            // Excluir veículo
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do veículo inválido', 400);
                }
                
                try {
                    // Verificar se o veículo existe
                    $stmt = $pdo->prepare("SELECT id, placa FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    $veiculo = $stmt->fetch();
                    
                    if (!$veiculo) {
                        resposta(false, null, 'Veículo não encontrado', 404);
                    }
                    
                    // Verificar se há viagens em andamento
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM viagens 
                        WHERE veiculo_id = ? AND data_fim IS NULL
                    ");
                    $stmt->execute([$id]);
                    $viagensAtivas = $stmt->fetch()['total'];
                    
                    if ($viagensAtivas > 0) {
                        resposta(false, null, 'Não é possível excluir veículo com viagens em andamento', 400);
                    }
                    
                    // Excluir veículo
                    $stmt = $pdo->prepare("DELETE FROM veiculos WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, "Veículo {$veiculo['placa']} excluído com sucesso");
                    } else {
                        resposta(false, null, 'Erro ao excluir veículo', 500);
                    }
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir veículo: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'excluir_cliente':
            // Excluir cliente
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do cliente é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do cliente inválido', 400);
                }
                
                try {
                    // Verificar se o cliente existe
                    $stmt = $pdo->prepare("SELECT id, nome FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    $cliente = $stmt->fetch();
                    
                    if (!$cliente) {
                        resposta(false, null, 'Cliente não encontrado', 404);
                    }
                    
                    // Verificar se há veículos vinculados a este cliente
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM veiculos 
                        WHERE cliente_contrato_id = ?
                    ");
                    $stmt->execute([$id]);
                    $veiculosVinculados = $stmt->fetch()['total'];
                    
                    if ($veiculosVinculados > 0) {
                        resposta(false, null, 'Não é possível excluir cliente com veículos vinculados', 400);
                    }
                    
                    // Verificar se há viagens vinculadas a este cliente
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM viagens 
                        WHERE cliente_id = ? OR cliente = (SELECT nome FROM clientes WHERE id = ?)
                    ");
                    $stmt->execute([$id, $id]);
                    $viagensVinculadas = $stmt->fetch()['total'];
                    
                    if ($viagensVinculadas > 0) {
                        resposta(false, null, 'Não é possível excluir cliente com viagens vinculadas', 400);
                    }
                    
                    // Excluir cliente
                    $stmt = $pdo->prepare("DELETE FROM clientes WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, "Cliente {$cliente['nome']} excluído com sucesso");
                    } else {
                        resposta(false, null, 'Erro ao excluir cliente', 500);
                    }
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir cliente: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'sync':
            // Endpoint de sincronização completa
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                $ultimaSync = isset($_GET['ultima_sync']) ? $_GET['ultima_sync'] : '1970-01-01 00:00:00';
                
                $dados = [];
                
                // Buscar motoristas atualizados
                try {
                    $stmt = $pdo->prepare("SELECT * FROM motoristas WHERE updated_at > ? OR created_at > ? ORDER BY nome");
                    $stmt->execute([$ultimaSync, $ultimaSync]);
                    $dados['motoristas'] = $stmt->fetchAll();
                } catch (Exception $e) {
                    // Fallback: buscar todos os motoristas ativos
                    try {
                        $stmt = $pdo->query("SELECT * FROM motoristas WHERE status = 'ativo' ORDER BY nome");
                        $dados['motoristas'] = $stmt->fetchAll();
                    } catch (Exception $e2) {
                        $dados['motoristas'] = [];
                    }
                }
                
                // Buscar veículos atualizados
                try {
                    // Buscar todos os veículos com tratamento de status NULL
                    $stmt = $pdo->query("
                        SELECT 
                            id, modelo, marca, placa,
                            CASE 
                                WHEN status IS NULL OR status = '' THEN 'ativo'
                                ELSE status 
                            END as status
                        FROM veiculos 
                        ORDER BY modelo
                    ");
                    $dados['veiculos'] = $stmt->fetchAll();
                } catch (Exception $e) {
                    $dados['veiculos'] = [];
                }
                
                // Buscar clientes da tabela clientes
                try {
                    $stmt = $pdo->query("
                        SELECT id, nome, cpf_cnpj, telefone, email, status
                        FROM clientes 
                        WHERE status = 'ativo'
                        ORDER BY nome
                    ");
                    $dados['clientes'] = $stmt->fetchAll();
                    
                    // Se não houver clientes, buscar todos independente do status
                    if (empty($dados['clientes'])) {
                        $stmt = $pdo->query("
                            SELECT id, nome, cpf_cnpj, telefone, email, status
                            FROM clientes 
                            ORDER BY nome
                        ");
                        $dados['clientes'] = $stmt->fetchAll();
                    }
                } catch (Exception $e) {
                    // Fallback: buscar clientes únicos das viagens como antes
                    try {
                        $stmt = $pdo->query("
                            SELECT DISTINCT cliente as nome, COUNT(*) as total_viagens 
                            FROM viagens 
                            WHERE cliente IS NOT NULL AND cliente != '' 
                            GROUP BY cliente 
                            ORDER BY cliente
                        ");
                        $dados['clientes'] = $stmt->fetchAll();
                    } catch (Exception $e2) {
                        $dados['clientes'] = [
                            ['nome' => 'Cliente Exemplo 1', 'total_viagens' => 0],
                            ['nome' => 'Cliente Exemplo 2', 'total_viagens' => 0]
                        ];
                    }
                }
                
                // Buscar viagens recentes (últimas 50)
                try {
                    $stmt = $pdo->prepare("
                        SELECT * FROM viagens 
                        WHERE updated_at > ? OR created_at > ? 
                        ORDER BY data_inicio DESC 
                        LIMIT 50
                    ");
                    $stmt->execute([$ultimaSync, $ultimaSync]);
                    $dados['viagens'] = $stmt->fetchAll();
                } catch (Exception $e) {
                    $dados['viagens'] = [];
                }
                
                $dados['timestamp_sync'] = date('Y-m-d H:i:s');
                $dados['total_motoristas'] = count($dados['motoristas']);
                $dados['total_veiculos'] = count($dados['veiculos']);
                $dados['total_clientes'] = count($dados['clientes']);
                $dados['total_viagens'] = count($dados['viagens']);
                
                resposta(true, $dados, 'Sincronização completa realizada');
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'gestao-veiculos':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                // Listar veículos com status detalhado
                try {
                    $stmt = $pdo->query("
                        SELECT 
                            v.*,
                            CASE 
                                WHEN EXISTS (
                                    SELECT 1 FROM viagens vi 
                                    WHERE vi.veiculo_id = v.id 
                                    AND vi.data_fim IS NULL
                                ) THEN 'em_uso'
                                ELSE v.status
                            END as status_real,
                            (SELECT COUNT(*) FROM viagens vi WHERE vi.veiculo_id = v.id AND vi.data_fim IS NULL) as viagens_ativas
                        FROM veiculos v
                        ORDER BY v.modelo
                    ");
                    $veiculos = $stmt->fetchAll();
                    resposta(true, $veiculos, 'Veículos listados com status');
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao listar veículos: ' . $e->getMessage(), 500);
                }
            } elseif ($metodo === 'PUT') {
                // Atualizar status do veículo
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id']) || !isset($input['status'])) {
                    resposta(false, null, 'ID do veículo e status são obrigatórios', 400);
                }
                
                $veiculoId = $input['id'];
                $novoStatus = $input['status'];
                
                // Validar status
                $statusValidos = ['ativo', 'disponivel', 'manutencao', 'inativo'];
                if (!in_array($novoStatus, $statusValidos)) {
                    resposta(false, null, 'Status inválido. Use: ' . implode(', ', $statusValidos), 400);
                }
                
                try {
                    // Se está liberando o veículo (ativo ou disponivel), finalizar viagens em andamento
                    if ($novoStatus === 'ativo' || $novoStatus === 'disponivel') {
                        $stmt = $pdo->prepare("
                            UPDATE viagens 
                            SET data_fim = NOW(), 
                                observacoes = CONCAT(COALESCE(observacoes, ''), ' - Viagem finalizada automaticamente ao liberar veículo')
                            WHERE veiculo_id = ? AND data_fim IS NULL
                        ");
                        $stmt->execute([$veiculoId]);
                        $viagensFinalizadas = $stmt->rowCount();
                    }
                    
                    // Atualizar status do veículo - garantir que nunca seja NULL
                    $stmt = $pdo->prepare("UPDATE veiculos SET status = ?, updated_at = NOW() WHERE id = ?");
                    $stmt->execute([$novoStatus, $veiculoId]);
                    
                    // Verificar se a atualização foi bem-sucedida
                    if ($stmt->rowCount() === 0) {
                        resposta(false, null, 'Veículo não encontrado ou status já atualizado', 404);
                        return;
                    }
                    
                    $mensagem = "Status do veículo atualizado para '$novoStatus'";
                    if (isset($viagensFinalizadas) && $viagensFinalizadas > 0) {
                        $mensagem .= " e $viagensFinalizadas viagem(ns) finalizada(s)";
                    }
                    
                    resposta(true, ['viagens_finalizadas' => $viagensFinalizadas ?? 0], $mensagem);
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao atualizar status: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'atualizar-localizacao':
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['viagem_id']) || !isset($input['latitude']) || !isset($input['longitude'])) {
                    resposta(false, null, 'ID da viagem, latitude e longitude são obrigatórios', 400);
                }
                
                try {
                    // Buscar trajeto atual
                    $stmt = $pdo->prepare("SELECT trajeto FROM viagens WHERE id = ? AND data_fim IS NULL");
                    $stmt->execute([$input['viagem_id']]);
                    $viagem = $stmt->fetch();
                    
                    if (!$viagem) {
                        resposta(false, null, 'Viagem não encontrada ou já finalizada', 404);
                        return;
                    }
                    
                    // Adicionar novo ponto ao trajeto
                    $trajeto = $viagem['trajeto'] ? json_decode($viagem['trajeto'], true) : [];
                    if (!is_array($trajeto)) $trajeto = [];
                    
                    $novoPonto = [
                        'latitude' => floatval($input['latitude']),
                        'longitude' => floatval($input['longitude']),
                        'timestamp' => date('Y-m-d H:i:s'),
                        'velocidade' => isset($input['velocidade']) ? floatval($input['velocidade']) : null,
                        'precisao' => isset($input['precisao']) ? floatval($input['precisao']) : null,
                        'altitude' => isset($input['altitude']) ? floatval($input['altitude']) : null
                    ];
                    
                    $trajeto[] = $novoPonto;
                    
                    // Atualizar no banco
                    $stmt = $pdo->prepare("
                        UPDATE viagens 
                        SET trajeto = ?, latitude_final = ?, longitude_final = ?, 
                            endereco_final = COALESCE(?, endereco_final)
                        WHERE id = ?
                    ");
                    $stmt->execute([
                        json_encode($trajeto),
                        $input['latitude'],
                        $input['longitude'],
                        isset($input['endereco']) ? $input['endereco'] : null,
                        $input['viagem_id']
                    ]);
                    
                    resposta(true, [
                        'pontos_trajeto' => count($trajeto),
                        'ultima_atualizacao' => $novoPonto['timestamp']
                    ], 'Localização atualizada com sucesso');
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao atualizar localização: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'iniciar-viagem':
            if ($metodo !== 'POST') {
                resposta(false, null, 'Método não permitido para iniciar viagem', 405);
            }
            
            $pdo = conectarBanco();
            
            // Receber dados do POST (form data ou JSON)
            $input = [];
            if ($_POST) {
                $input = $_POST;
            } else {
                $json = json_decode(file_get_contents('php://input'), true);
                if ($json) $input = $json;
            }
            
            // Validar campos obrigatórios
            $camposObrigatorios = ['cliente', 'motorista', 'veiculo', 'motivo', 'latitude_inicio', 'longitude_inicio'];
            foreach ($camposObrigatorios as $campo) {
                if (!isset($input[$campo]) || $input[$campo] === '') {
                    resposta(false, null, "Campo obrigatório: $campo", 400);
                }
            }
            
            // Log dos dados recebidos para debug
            error_log("=========== DEBUG INICIAR VIAGEM ===========");
            error_log("Dados recebidos para iniciar viagem: " . json_encode($input));
            error_log("odometro_inicial presente: " . (isset($input['odometro_inicial']) ? 'SIM' : 'NÃO'));
            error_log("odometro_inicial valor: " . (isset($input['odometro_inicial']) ? $input['odometro_inicial'] : 'NULL'));
            error_log("endereco_inicial presente: " . (isset($input['endereco_inicial']) ? 'SIM' : 'NÃO'));
            error_log("endereco_inicial valor: " . (isset($input['endereco_inicial']) ? $input['endereco_inicial'] : 'NULL'));
            error_log("cliente_id presente: " . (isset($input['cliente_id']) ? 'SIM' : 'NÃO'));
            error_log("cliente_id valor: " . (isset($input['cliente_id']) ? $input['cliente_id'] : 'NULL'));
            
            try {
                // Buscar IDs de motorista e veículo pelos nomes/placas
                error_log("Procurando motorista por nome: '{$input['motorista']}'");
                $stmt = $pdo->prepare("SELECT id, nome, matricula FROM motoristas WHERE nome LIKE ? OR matricula = ? LIMIT 1");
                $stmt->execute(["%{$input['motorista']}%", $input['motorista']]);
                $motorista = $stmt->fetch();
                
                if ($motorista) {
                    $motoristaId = $motorista['id'];
                    error_log("Motorista encontrado: ID={$motoristaId}, Nome='{$motorista['nome']}', Matricula='{$motorista['matricula']}'");
                } else {
                    $motoristaId = 1; // Default se não encontrar
                    error_log("ATENÇÃO: Motorista NÃO encontrado! Usando ID padrão: $motoristaId");
                    error_log("Termo buscado: '{$input['motorista']}'");
                    // Listar todos os motoristas para debug
                    $stmt_all = $pdo->query("SELECT id, nome, matricula FROM motoristas");
                    $todosMotoristas = $stmt_all->fetchAll();
                    error_log("Motoristas disponíveis no banco: " . json_encode($todosMotoristas));
                }
                
                $stmt = $pdo->prepare("SELECT id FROM veiculos WHERE placa = ? OR modelo LIKE ? LIMIT 1");
                $stmt->execute([$input['veiculo'], "%{$input['veiculo']}%"]);
                $veiculo = $stmt->fetch();
                $veiculoId = $veiculo ? $veiculo['id'] : 1; // Default se não encontrar
                
                // Buscar cliente_id se fornecido
                $clienteId = null;
                if (isset($input['cliente_id']) && !empty($input['cliente_id'])) {
                    $clienteId = $input['cliente_id'];
                }
                
                // 🌍 GEOCODIFICAÇÃO AUTOMÁTICA: Buscar endereço se não foi fornecido
                $enderecoInicial = isset($input['endereco_inicial']) ? $input['endereco_inicial'] : null;
                if (empty($enderecoInicial) && !empty($input['latitude_inicio']) && !empty($input['longitude_inicio'])) {
                    error_log("🌍 Geocodificando endereço inicial automaticamente...");
                    $enderecoInicial = geocodificar($input['latitude_inicio'], $input['longitude_inicio']);
                    if ($enderecoInicial) {
                        error_log("✅ Endereço inicial encontrado: " . substr($enderecoInicial, 0, 100) . "...");
                    } else {
                        error_log("❌ Não foi possível geocodificar endereço inicial");
                    }
                }
                
                // Inserir viagem ATIVA (sem data_fim) com TODOS os campos
                $sql = "INSERT INTO viagens (
                    tecnico_id, veiculo_id, cliente, motivo, odometro_inicial,
                    data_inicio, latitude_inicial, longitude_inicial,
                    endereco_inicial, cliente_id, sincronizado
                ) VALUES (?, ?, ?, ?, ?, NOW(), ?, ?, ?, ?, 1)";
                
                // SALVAR O NOME DO MOTORISTA no tecnico_id (não o ID numérico)
                $nomeMotoristaParaSalvar = $input['motorista']; // Nome completo enviado pelo app
                
                $stmt = $pdo->prepare($sql);
                $stmt->execute([
                    $nomeMotoristaParaSalvar, // SALVAR NOME, NÃO ID!
                    $veiculoId,
                    $input['cliente'],
                    $input['motivo'],
                    isset($input['odometro_inicial']) ? intval($input['odometro_inicial']) : 0,
                    $input['latitude_inicio'],
                    $input['longitude_inicio'],
                    $enderecoInicial, // Usar endereço geocodificado
                    $clienteId
                ]);
                
                $viagemId = $pdo->lastInsertId();
                
                // Log dos valores que foram inseridos
                error_log("Viagem inserida com ID: $viagemId");
                error_log("Valores inseridos: tecnico_id='$nomeMotoristaParaSalvar', veiculoId=$veiculoId, odometro_inicial=" . (isset($input['odometro_inicial']) ? intval($input['odometro_inicial']) : 0));
                error_log("endereco_inicial inserido: " . (isset($input['endereco_inicial']) ? $input['endereco_inicial'] : 'NULL'));
                error_log("cliente_id inserido: " . ($clienteId ?? 'NULL'));
                
                // Verificar se realmente foi salvo
                $stmt_check = $pdo->prepare("SELECT tecnico_id, odometro_inicial, endereco_inicial, cliente_id FROM viagens WHERE id = ?");
                $stmt_check->execute([$viagemId]);
                $viagemSalva = $stmt_check->fetch();
                error_log("Dados realmente salvos no banco: " . json_encode($viagemSalva));
                error_log("tecnico_id salvo: '" . $viagemSalva['tecnico_id'] . "'");
                error_log("=========== FIM DEBUG INICIAR VIAGEM ===========");
                
                resposta(true, [
                    'viagem_id' => $viagemId,
                    'motorista_id' => $motoristaId,
                    'veiculo_id' => $veiculoId
                ], 'Viagem iniciada com sucesso! ID: ' . $viagemId);
                
            } catch (Exception $e) {
                error_log("Erro ao iniciar viagem: " . $e->getMessage());
                resposta(false, null, 'Erro ao iniciar viagem: ' . $e->getMessage(), 500);
            }
            break;
            
        case 'marcar-rota-concluida':
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                try {
                    $input = json_decode(file_get_contents('php://input'), true);
                    $rotaId = $input['rota_id'] ?? null;
                    
                    if (!$rotaId) {
                        resposta(false, null, 'ID da rota é obrigatório', 400);
                        break;
                    }
                    
                    // Marcar rota como concluída
                    $sql = "UPDATE solicitacoes_rotas SET 
                            status = 'concluida',
                            data_fim_real = NOW(),
                            data_inicio_real = COALESCE(data_inicio_real, data_inicio)
                            WHERE id = ? AND status = 'aprovada'";
                    
                    $stmt = $pdo->prepare($sql);
                    $success = $stmt->execute([$rotaId]);
                    
                    if ($success && $stmt->rowCount() > 0) {
                        resposta(true, null, 'Rota marcada como concluída com sucesso');
                    } else {
                        resposta(false, null, 'Rota não encontrada ou já concluída', 404);
                    }
                    
                } catch (Exception $e) {
                    error_log("Erro ao marcar rota como concluída: " . $e->getMessage());
                    resposta(false, null, 'Erro ao marcar rota como concluída: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'finalizar-viagem':
            if ($metodo !== 'POST') {
                resposta(false, null, 'Método não permitido para finalizar viagem', 405);
            }
            
            $pdo = conectarBanco();
            
            // Receber dados do POST (form data ou JSON)
            $input = [];
            if ($_POST) {
                $input = $_POST;
            } else {
                $json = json_decode(file_get_contents('php://input'), true);
                if ($json) $input = $json;
            }
            
            // Log dos dados recebidos para debug
            error_log("=========== DEBUG FINALIZAR VIAGEM (UPDATE ONLY) ===========");
            error_log("Dados recebidos para finalizar: " . json_encode($input));
            error_log("viagem_id presente: " . (isset($input['viagem_id']) ? 'SIM' : 'NÃO'));
            error_log("viagem_id valor: " . (isset($input['viagem_id']) ? $input['viagem_id'] : 'NULL'));
            error_log("viagem_id tipo: " . gettype($input['viagem_id'] ?? 'undefined'));
            error_log("viagem_id empty: " . (empty($input['viagem_id']) ? 'SIM' : 'NÃO'));
            
            // Validar campos obrigatórios
            if (!isset($input['viagem_id']) || empty($input['viagem_id']) || intval($input['viagem_id']) <= 0) {
                error_log("❌ ERRO: ID da viagem inválido ou não fornecido");
                resposta(false, null, 'ID da viagem deve ser um número maior que 0', 400);
            }
            
            try {
                error_log("ID da viagem válido: " . $input['viagem_id']);
                
                // Verificar se viagem existe e está ativa
                $stmt = $pdo->prepare("SELECT * FROM viagens WHERE id = ? AND data_fim IS NULL");
                $stmt->execute([$input['viagem_id']]);
                $viagem = $stmt->fetch();
                
                if (!$viagem) {
                    error_log("ERRO: Viagem não encontrada ou já finalizada - ID: " . $input['viagem_id']);
                    resposta(false, null, 'Viagem não encontrada ou já finalizada', 404);
                }
                
                error_log("✅ Viagem encontrada: " . json_encode($viagem));
                
                // 🌍 GEOCODIFICAÇÃO AUTOMÁTICA: Buscar endereço final se não foi fornecido
                $enderecoFinal = isset($input['endereco_final']) ? $input['endereco_final'] : null;
                if (empty($enderecoFinal) && !empty($input['latitude_fim']) && !empty($input['longitude_fim'])) {
                    error_log("🌍 Geocodificando endereço final automaticamente...");
                    $enderecoFinal = geocodificar($input['latitude_fim'], $input['longitude_fim']);
                    if ($enderecoFinal) {
                        error_log("✅ Endereço final encontrado: " . substr($enderecoFinal, 0, 100) . "...");
                    } else {
                        error_log("❌ Não foi possível geocodificar endereço final");
                    }
                }
                
                // ATUALIZAR viagem existente (NUNCA INSERIR NOVA)
                // 🔧 CORREÇÃO AVANÇADA: Preservar TODOS os dados existentes
                $sql = "UPDATE viagens SET 
                    data_fim = NOW(),
                    latitude_final = CASE 
                        WHEN ? IS NOT NULL AND ? != 0 THEN ? 
                        ELSE latitude_final 
                    END,
                    longitude_final = CASE 
                        WHEN ? IS NOT NULL AND ? != 0 THEN ? 
                        ELSE longitude_final 
                    END,
                    distancia_gps = CASE 
                        WHEN ? IS NOT NULL AND ? > 0 THEN ? 
                        ELSE distancia_gps 
                    END,

                    odometro_final = CASE 
                        WHEN ? IS NOT NULL AND ? > 0 THEN ? 
                        ELSE odometro_final 
                    END,
                    observacoes = CASE 
                        WHEN ? IS NOT NULL AND TRIM(?) != '' THEN ? 
                        ELSE COALESCE(observacoes, CONCAT('Finalizada pelo app em ', NOW())) 
                    END,
                    endereco_final = CASE 
                        WHEN ? IS NOT NULL AND TRIM(?) != '' THEN ? 
                        ELSE endereco_final 
                    END,
                    observacoes = CASE 
                        WHEN ? IS NOT NULL AND TRIM(?) != '' THEN ? 
                        ELSE observacoes 
                    END
                    WHERE id = ? AND data_fim IS NULL";
                
                $lat = isset($input['latitude_fim']) ? floatval($input['latitude_fim']) : null;
                $lng = isset($input['longitude_fim']) ? floatval($input['longitude_fim']) : null;
                // 🔧 CORREÇÃO: CALCULAR KM GPS AUTOMATICAMENTE se não foi fornecido
                $kmGps = isset($input['km_rodados']) ? floatval($input['km_rodados']) : 
                         (isset($input['kmGpsFinal']) ? floatval($input['kmGpsFinal']) / 1000.0 : null);
                
                // 🔧 NOVO: Se kmGps não foi fornecido, calcular baseado nos pontos GPS salvos
                if ($kmGps === null || $kmGps <= 0) {
                    error_log("🔧 Calculando distancia_gps automaticamente baseado nos pontos GPS...");
                    
                    // Buscar todos os pontos GPS da viagem
                    $stmt_pontos = $pdo->prepare("
                        SELECT latitude, longitude, timestamp 
                        FROM rastreamento_tempo_real 
                        WHERE viagem_id = ? 
                        ORDER BY timestamp ASC
                    ");
                    $stmt_pontos->execute([intval($input['viagem_id'])]);
                    $pontos = $stmt_pontos->fetchAll();
                    
                    if (count($pontos) > 1) {
                        $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'];
                            
                            // Calcular distância usando fórmula de Haversine
                            $distancia = haversine($lat1, $lon1, $lat2, $lon2);
                            $distanciaTotal += $distancia;
                        }
                        
                        $kmGps = $distanciaTotal;
                        $metrosGps = $distanciaTotal * 1000; // Converter para metros
                        error_log("✅ distancia_gps calculado: {$kmGps} km ({$metrosGps} metros) baseado em " . count($pontos) . " pontos GPS");
                        
                        // 🔧 MELHORIA: Salvar tanto em KM quanto em metros
                        // O valor será salvo com todas as casas decimais
                    } else {
                        error_log("⚠️ Poucos pontos GPS para calcular distância: " . count($pontos) . " pontos");
                        $kmGps = 0;
                    }
                }
                
                $kmFinal = isset($input['odometro_final']) ? intval($input['odometro_final']) : null;
                $obs = isset($input['observacoes']) ? trim($input['observacoes']) : null;
                $justificativaKm = isset($input['justificativa_divergencia']) ? trim($input['justificativa_divergencia']) : null;
                $kmPlanejado = isset($input['km_planejado']) ? intval($input['km_planejado']) : null;
                $diferencaKm = isset($input['diferenca_km_calculada']) ? intval($input['diferenca_km_calculada']) : null;
                
                $valores = [
                    // latitude_final
                    $lat, $lat, $lat,
                    // longitude_final  
                    $lng, $lng, $lng,
                    // distancia_gps
                    $kmGps, $kmGps, $kmGps,

                    // odometro_final
                    $kmFinal, $kmFinal, $kmFinal,
                    // observacoes (usado duas vezes agora)
                    $obs, $obs, $obs,
                    // endereco_final
                    $enderecoFinal, $enderecoFinal, $enderecoFinal,
                    // observacoes (segunda vez)
                    $obs, $obs, $obs,
                    // WHERE id
                    intval($input['viagem_id'])
                ];
                
                error_log("🔄 SQL UPDATE: $sql");
                error_log("🔄 Valores para UPDATE: " . json_encode($valores));
                
                $stmt = $pdo->prepare($sql);
                $stmt->execute($valores);
                
                $linhasAfetadas = $stmt->rowCount();
                error_log("📊 Linhas afetadas pelo UPDATE: $linhasAfetadas");
                
                if ($linhasAfetadas > 0) {
                    error_log("✅ Viagem ID {$input['viagem_id']} finalizada com sucesso!");
                    
                    // 🎯 NOVO: Atualizar status da solicitação para "concluída"
                    try {
                        // Buscar a solicitação relacionada à viagem
                        $stmt_solicitacao = $pdo->prepare("
                            SELECT s.id, s.tecnico_id, s.cliente, s.motivo 
                            FROM solicitacoes_viagem s 
                            INNER JOIN viagens v ON s.tecnico_id = v.tecnico_id 
                                AND s.cliente = v.cliente 
                                AND s.motivo = v.motivo
                                AND s.status = 'aprovada'
                            WHERE v.id = ? 
                            ORDER BY s.created_at DESC 
                            LIMIT 1
                        ");
                        $stmt_solicitacao->execute([intval($input['viagem_id'])]);
                        $solicitacao = $stmt_solicitacao->fetch();
                        
                        if ($solicitacao) {
                            error_log("🎯 Encontrada solicitação ID {$solicitacao['id']} para atualizar status");
                            
                            // Atualizar status da solicitação para "concluída"
                            $stmt_update = $pdo->prepare("
                                UPDATE solicitacoes_viagem 
                                SET status = 'concluída', updated_at = NOW() 
                                WHERE id = ?
                            ");
                            $stmt_update->execute([$solicitacao['id']]);
                            
                            $linhasSolicitacao = $stmt_update->rowCount();
                            if ($linhasSolicitacao > 0) {
                                error_log("✅ Status da solicitação ID {$solicitacao['id']} atualizado para 'concluída'");
                            } else {
                                error_log("⚠️ Nenhuma linha da solicitação foi atualizada");
                            }
                        } else {
                            error_log("⚠️ Nenhuma solicitação encontrada para a viagem ID {$input['viagem_id']}");
                        }
                    } catch (Exception $e) {
                        error_log("❌ Erro ao atualizar status da solicitação: " . $e->getMessage());
                        // Não falhar a finalização da viagem por causa deste erro
                    }
                    
                    // Verificar dados finais salvos
                    $stmt_verify = $pdo->prepare("SELECT id, data_inicio, data_fim, endereco_final FROM viagens WHERE id = ?");
                    $stmt_verify->execute([intval($input['viagem_id'])]);
                    $dadosFinais = $stmt_verify->fetch();
                    error_log("✅ Dados finais salvos: " . json_encode($dadosFinais));
                
                resposta(true, [
                        'viagem_id' => intval($input['viagem_id']),
                        'dados_finais' => $dadosFinais
                    ], "Viagem ID {$input['viagem_id']} finalizada com sucesso!");
                } else {
                    error_log("⚠️ Nenhuma linha afetada - viagem já pode estar finalizada");
                    resposta(false, null, 'Viagem já estava finalizada ou não encontrada', 409);
                }
                
                error_log("=========== FIM DEBUG FINALIZAR VIAGEM ===========");
                
            } catch (Exception $e) {
                error_log("Erro ao finalizar viagem: " . $e->getMessage());
                resposta(false, null, 'Erro ao finalizar viagem: ' . $e->getMessage(), 500);
            }
            break;
            
        case 'estatisticas':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                $tecnico_id = $_GET['tecnico_id'] ?? '';
                
                if (empty($tecnico_id)) {
                    resposta(false, null, 'ID do técnico é obrigatório', 400);
                    break;
                }
                
                try {
                    error_log("Buscando estatísticas para técnico: '$tecnico_id'");
                    
                    // Total de viagens do técnico
                    $stmt = $pdo->prepare("SELECT COUNT(*) as total FROM viagens WHERE tecnico_id = ?");
                    $stmt->execute([$tecnico_id]);
                    $totalViagens = $stmt->fetch()['total'];
                    
                    // Viagens em andamento do técnico
                    $stmt = $pdo->prepare("SELECT COUNT(*) as em_andamento FROM viagens WHERE tecnico_id = ? AND data_fim IS NULL");
                    $stmt->execute([$tecnico_id]);
                    $viagensEmAndamento = $stmt->fetch()['em_andamento'];
                    
                    // Viagens finalizadas do técnico
                    $stmt = $pdo->prepare("SELECT COUNT(*) as finalizadas FROM viagens WHERE tecnico_id = ? AND data_fim IS NOT NULL");
                    $stmt->execute([$tecnico_id]);
                    $viagensFinalizadas = $stmt->fetch()['finalizadas'];
                    
                    // Estatísticas gerais (para admin)
                    $stmt = $pdo->query("SELECT COUNT(DISTINCT id) as total_motoristas FROM motoristas");
                    $totalMotoristas = $stmt->fetch()['total_motoristas'];
                    
                    $stmt = $pdo->query("SELECT COUNT(DISTINCT id) as total_veiculos FROM veiculos");
                    $totalVeiculos = $stmt->fetch()['total_veiculos'];
                    
                    $estatisticas = [
                        'tecnico_id' => $tecnico_id,
                        'total_viagens' => intval($totalViagens),
                        'viagens_em_andamento' => intval($viagensEmAndamento),
                        'viagens_finalizadas' => intval($viagensFinalizadas),
                        'total_motoristas' => intval($totalMotoristas),
                        'total_veiculos' => intval($totalVeiculos)
                    ];
                    
                    error_log("Estatísticas calculadas: " . json_encode($estatisticas));
                    
                    resposta(true, $estatisticas, 'Estatísticas carregadas com sucesso');
                } catch (Exception $e) {
                    error_log("Erro ao buscar estatísticas: " . $e->getMessage());
                    resposta(false, null, 'Erro ao carregar estatísticas: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;

        case 'rastreamento':
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                // RECEBER COORDENADA GPS EM TEMPO REAL
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados de localização são obrigatórios', 400);
                }
                
                // Validar campos obrigatórios
                if (!isset($input['tecnicoId']) || !isset($input['latitude']) || !isset($input['longitude'])) {
                    resposta(false, null, 'Campos obrigatórios: tecnicoId, latitude, longitude', 400);
                }
                
                try {
                    // 1. SALVAR PONTO DETALHADO NO HISTÓRICO
                    $sqlPonto = "INSERT INTO rastreamento_tempo_real (
                        tecnico_id, viagem_id, latitude, longitude, velocidade, 
                        precisao, altitude, timestamp_gps, battery_level, is_online
                    ) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), ?, ?)";
                    
                    $stmtPonto = $pdo->prepare($sqlPonto);
                    $stmtPonto->execute([
                        $input['tecnicoId'],
                        isset($input['viagemId']) ? $input['viagemId'] : null,
                        $input['latitude'],
                        $input['longitude'],
                        isset($input['velocidade']) ? $input['velocidade'] : 0,
                        isset($input['precisao']) ? $input['precisao'] : 0,
                        isset($input['altitude']) ? $input['altitude'] : 0,
                        isset($input['batteryLevel']) ? $input['batteryLevel'] : null,
                        isset($input['isOnline']) ? ($input['isOnline'] ? 1 : 0) : 1
                    ]);
                    
                    // 2. ATUALIZAR STATUS ATUAL DO TÉCNICO
                    $sqlStatus = "INSERT INTO status_tecnicos (
                        tecnico_id, ultimo_ping, latitude_atual, longitude_atual, 
                        velocidade_atual, viagem_ativa, status_conexao, battery_level,
                        app_version
                    ) VALUES (?, NOW(), ?, ?, ?, ?, 'online', ?, ?)
                    ON DUPLICATE KEY UPDATE
                        ultimo_ping = NOW(),
                        latitude_atual = VALUES(latitude_atual),
                        longitude_atual = VALUES(longitude_atual),
                        velocidade_atual = VALUES(velocidade_atual),
                        viagem_ativa = VALUES(viagem_ativa),
                        status_conexao = 'online',
                        battery_level = VALUES(battery_level),
                        app_version = VALUES(app_version)";
                    
                    $stmtStatus = $pdo->prepare($sqlStatus);
                    $stmtStatus->execute([
                        $input['tecnicoId'],
                        $input['latitude'],
                        $input['longitude'],
                        isset($input['velocidade']) ? $input['velocidade'] : 0,
                        isset($input['viagemId']) ? $input['viagemId'] : null,
                        isset($input['batteryLevel']) ? $input['batteryLevel'] : null,
                        isset($input['appVersion']) ? $input['appVersion'] : null
                    ]);
                    
                    resposta(true, [
                        'pontoSalvo' => $pdo->lastInsertId(),
                        'timestamp' => date('Y-m-d H:i:s')
                    ], 'Localização recebida com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao salvar rastreamento: " . $e->getMessage());
                    resposta(false, null, 'Erro ao salvar localização: ' . $e->getMessage(), 500);
                }
                
            } elseif ($metodo === 'GET') {
                // OBTER POSIÇÕES ATUAIS DOS TÉCNICOS
                try {
                    $stmt = $pdo->query("
                        SELECT 
                            st.tecnico_id,
                            st.ultimo_ping,
                            st.latitude_atual,
                            st.longitude_atual,
                            st.velocidade_atual,
                            st.viagem_ativa,
                            st.status_conexao,
                            st.battery_level,
                            st.app_version,
                            m.nome as tecnico_nome,
                            v.cliente as viagem_cliente,
                            CASE 
                                WHEN st.ultimo_ping > DATE_SUB(NOW(), INTERVAL 5 MINUTE) THEN 'online'
                                WHEN st.ultimo_ping > DATE_SUB(NOW(), INTERVAL 30 MINUTE) THEN 'ausente'
                                ELSE 'offline'
                            END as status_real
                        FROM status_tecnicos st
                        LEFT JOIN motoristas m ON st.tecnico_id = m.nome
                        LEFT JOIN viagens v ON st.viagem_ativa = v.id
                        WHERE st.latitude_atual IS NOT NULL 
                        AND st.longitude_atual IS NOT NULL
                        ORDER BY st.ultimo_ping DESC
                    ");
                    
                    $tecnicos = $stmt->fetchAll();
                    
                    resposta(true, $tecnicos, 'Posições dos técnicos obtidas');
                    
                } catch (Exception $e) {
                    error_log("Erro ao buscar rastreamento: " . $e->getMessage());
                    resposta(false, null, 'Erro ao buscar posições: ' . $e->getMessage(), 500);
                }
                
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'atualizar-posicao':
            // Endpoint unificado para apps Android enviarem posição
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                // ✅ ACEITAR TANTO JSON QUANTO FORM DATA
                $input = null;
                
                // Tentar JSON primeiro
                $jsonInput = json_decode(file_get_contents('php://input'), true);
                if ($jsonInput) {
                    $input = $jsonInput;
                } else {
                    // Se não for JSON, usar $_POST
                    $input = $_POST;
                }
                
                // Log para debug
                error_log("Posição recebida do Android: " . json_encode($input));
                
                if (!$input || !isset($input['viagem_id']) || !isset($input['latitude']) || !isset($input['longitude'])) {
                    resposta(false, null, 'viagem_id, latitude e longitude são obrigatórios', 400);
                }
                
                try {
                    // Verificar se a viagem existe (ativa ou finalizada)
                    $stmt = $pdo->prepare("
                        SELECT v.id, v.trajeto, v.tecnico_id, v.data_fim, COALESCE(m.nome, 'Motorista não identificado') as motorista_nome
                        FROM viagens v
                        LEFT JOIN motoristas m ON (v.tecnico_id = m.id OR v.tecnico_id = m.nome)
                        WHERE v.id = ?
                    ");
                    $stmt->execute([$input['viagem_id']]);
                    $viagem = $stmt->fetch();
                    
                    if (!$viagem) {
                        resposta(false, null, 'Viagem não encontrada', 404);
                    }
                    
                    // Processar trajeto atual
                    $trajeto = $viagem['trajeto'] ? json_decode($viagem['trajeto'], true) : [];
                    if (!is_array($trajeto)) $trajeto = [];
                    
                    // Criar novo ponto GPS com nome do motorista
                    $novoPonto = [
                        'latitude' => floatval($input['latitude']),
                        'longitude' => floatval($input['longitude']),
                        'timestamp' => date('Y-m-d H:i:s'),
                        'velocidade' => isset($input['velocidade']) ? floatval($input['velocidade']) : null,
                        'precisao' => isset($input['precisao']) ? floatval($input['precisao']) : null,
                        'altitude' => isset($input['altitude']) ? floatval($input['altitude']) : null,
                        'bearing' => isset($input['bearing']) ? floatval($input['bearing']) : null,
                        'motorista_nome' => isset($input['motorista_nome']) ? $input['motorista_nome'] : null // ✅ ADICIONAR NOME
                    ];
                    
                    // Adicionar ao trajeto
                    $trajeto[] = $novoPonto;
                    
                    // 🔧 CORREÇÃO: Salvar coordenadas iniciais e finais + endereços
                    $stmt = $pdo->prepare("
                        UPDATE viagens 
                        SET trajeto = ?, 
                            latitude_final = ?, 
                            longitude_final = ?,
                            latitude_inicial = CASE 
                                WHEN latitude_inicial IS NULL OR latitude_inicial = 0 THEN ? 
                                ELSE latitude_inicial 
                            END,
                            longitude_inicial = CASE 
                                WHEN longitude_inicial IS NULL OR longitude_inicial = 0 THEN ? 
                                ELSE longitude_inicial 
                            END,
                            endereco_inicial = CASE 
                                WHEN endereco_inicial IS NULL OR endereco_inicial = '' THEN ? 
                                ELSE endereco_inicial 
                            END,
                            endereco_final = ?
                        WHERE id = ?
                    ");
                    
                    // 🔧 NOVO: Geocodificar endereços
                    $enderecoInicial = null;
                    $enderecoFinal = null;
                    
                    // Se é o primeiro ponto, geocodificar endereço inicial
                    if (count($trajeto) == 1) {
                        $enderecoInicial = geocodificar($input['latitude'], $input['longitude']);
                        error_log("Endereço inicial geocodificado: " . ($enderecoInicial ?: 'Falha na geocodificação'));
                    }
                    
                    // Sempre geocodificar endereço final
                    $enderecoFinal = geocodificar($input['latitude'], $input['longitude']);
                    error_log("Endereço final geocodificado: " . ($enderecoFinal ?: 'Falha na geocodificação'));
                    
                    $resultado = $stmt->execute([
                        json_encode($trajeto),
                        $input['latitude'],
                        $input['longitude'],
                        $input['latitude'], // latitude_inicial (se for primeiro ponto)
                        $input['longitude'], // longitude_inicial (se for primeiro ponto)
                        $enderecoInicial, // endereco_inicial
                        $enderecoFinal, // endereco_final
                        $input['viagem_id']
                    ]);
                    
                    // ✅ TAMBÉM SALVAR NA TABELA DE RASTREAMENTO TEMPO REAL
                    try {
                        $stmt2 = $pdo->prepare("
                            INSERT INTO rastreamento_tempo_real (
                                tecnico_id, viagem_id, latitude, longitude, velocidade, 
                                precisao, altitude, timestamp_gps, battery_level, is_online
                            ) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), ?, ?)
                        ");
                        
                        $resultado2 = $stmt2->execute([
                            $viagem['tecnico_id'], // Usar ID numérico do técnico
                            $input['viagem_id'],
                            $input['latitude'],
                            $input['longitude'],
                            isset($input['velocidade']) ? $input['velocidade'] : 0,
                            isset($input['precisao']) ? $input['precisao'] : 0,
                            isset($input['altitude']) ? $input['altitude'] : 0,
                            isset($input['battery_level']) ? $input['battery_level'] : null,
                            1 // is_online = true
                        ]);
                        
                        if ($resultado2) {
                            error_log("✅ Ponto salvo na tabela rastreamento_tempo_real - viagem_id: " . $input['viagem_id']);
                        } else {
                            error_log("❌ ERRO ao salvar na tabela rastreamento_tempo_real - viagem_id: " . $input['viagem_id']);
                        }
                    } catch (Exception $e) {
                        error_log("❌ EXCEÇÃO ao salvar na tabela rastreamento_tempo_real: " . $e->getMessage());
                    }
                    
                    // ✅ ATUALIZAR STATUS ATUAL DO TÉCNICO
                    $stmt3 = $pdo->prepare("
                        INSERT INTO status_tecnicos (
                            tecnico_id, ultimo_ping, latitude_atual, longitude_atual, 
                            velocidade_atual, viagem_ativa, status_conexao, battery_level
                        ) VALUES (?, NOW(), ?, ?, ?, ?, 'online', ?)
                        ON DUPLICATE KEY UPDATE
                            ultimo_ping = NOW(),
                            latitude_atual = VALUES(latitude_atual),
                            longitude_atual = VALUES(longitude_atual),
                            velocidade_atual = VALUES(velocidade_atual),
                            viagem_ativa = VALUES(viagem_ativa),
                            status_conexao = 'online',
                            battery_level = VALUES(battery_level)
                    ");
                    
                    $stmt3->execute([
                        $viagem['tecnico_id'], // Usar ID numérico do técnico
                        $input['latitude'],
                        $input['longitude'],
                        isset($input['velocidade']) ? $input['velocidade'] : 0,
                        $input['viagem_id'],
                        isset($input['battery_level']) ? $input['battery_level'] : null
                    ]);
                    
                    if ($resultado) {
                        resposta(true, [
                            'viagem_id' => $input['viagem_id'],
                            'total_pontos' => count($trajeto),
                            'ultima_atualizacao' => $novoPonto['timestamp'],
                            'motorista_nome' => $viagem['motorista_nome'] // ✅ RETORNAR NOME DO MOTORISTA
                        ], 'Posição atualizada com sucesso');
                    } else {
                        resposta(false, null, 'Erro ao atualizar posição no banco', 500);
                    }
                    
                } catch (Exception $e) {
                    error_log("Erro ao atualizar posição: " . $e->getMessage());
                    resposta(false, null, 'Erro ao processar posição: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Apenas método POST é suportado', 405);
            }
            break;
            
        case 'reabrir-viagem':
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['viagem_id'])) {
                    resposta(false, null, 'ID da viagem é obrigatório', 400);
                }
                
                try {
                    $stmt = $pdo->prepare("
                        UPDATE viagens 
                        SET data_fim = NULL
                        WHERE id = ? AND data_fim IS NOT NULL
                    ");
                    
                    $stmt->execute([$input['viagem_id']]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, ['viagem_id' => $input['viagem_id']], 'Viagem reaberta com sucesso');
                    } else {
                        resposta(false, null, 'Viagem não encontrada ou já está em andamento', 404);
                    }
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao reabrir viagem: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'criar-tabelas':
            $pdo = conectarBanco();
            
            try {
                // 1. TABELA RASTREAMENTO_TEMPO_REAL
                $sql1 = "CREATE TABLE IF NOT EXISTS rastreamento_tempo_real (
                    id BIGINT AUTO_INCREMENT PRIMARY KEY,
                    tecnico_id VARCHAR(100) NOT NULL,
                    viagem_id BIGINT NULL,
                    latitude DECIMAL(10, 8) NOT NULL,
                    longitude DECIMAL(11, 8) NOT NULL,
                    velocidade DECIMAL(5, 2) DEFAULT 0,
                    precisao DECIMAL(8, 2) DEFAULT 0,
                    altitude DECIMAL(8, 2) DEFAULT 0,
                    timestamp_gps DATETIME DEFAULT CURRENT_TIMESTAMP,
                    battery_level INT DEFAULT NULL,
                    is_online BOOLEAN DEFAULT TRUE,
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    INDEX idx_tecnico (tecnico_id),
                    INDEX idx_viagem (viagem_id),
                    INDEX idx_timestamp (timestamp_gps),
                    INDEX idx_online (is_online)
                )";
                
                $pdo->exec($sql1);
                
                // 2. TABELA STATUS_TECNICOS
                $sql2 = "CREATE TABLE IF NOT EXISTS status_tecnicos (
                    tecnico_id VARCHAR(100) PRIMARY KEY,
                    ultimo_ping DATETIME DEFAULT CURRENT_TIMESTAMP,
                    latitude_atual DECIMAL(10, 8),
                    longitude_atual DECIMAL(11, 8),
                    velocidade_atual DECIMAL(5, 2) DEFAULT 0,
                    viagem_ativa BIGINT NULL,
                    status_conexao ENUM('online', 'offline', 'ausente') DEFAULT 'online',
                    battery_level INT DEFAULT NULL,
                    app_version VARCHAR(20) DEFAULT NULL,
                    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                    INDEX idx_ping (ultimo_ping),
                    INDEX idx_status (status_conexao)
                )";
                
                $pdo->exec($sql2);
                
                // 3. INSERIR TÉCNICOS EXISTENTES
                $sql3 = "INSERT INTO status_tecnicos (tecnico_id, status_conexao) 
                         SELECT DISTINCT nome, 'offline' 
                         FROM motoristas 
                         WHERE status = 'ativo'
                         ON DUPLICATE KEY UPDATE tecnico_id = tecnico_id";
                
                $pdo->exec($sql3);
                
                // 4. VERIFICAR CRIAÇÃO
                $tabelas = [];
                
                $stmt = $pdo->query("SHOW TABLES LIKE '%rastreamento%'");
                while ($row = $stmt->fetch()) {
                    $tabelas[] = $row[0];
                }
                
                $stmt = $pdo->query("SHOW TABLES LIKE '%status%'");
                while ($row = $stmt->fetch()) {
                    $tabelas[] = $row[0];
                }
                
                resposta(true, [
                    'tabelas_criadas' => $tabelas,
                    'timestamp' => date('Y-m-d H:i:s')
                ], 'Tabelas criadas com sucesso');
                
            } catch (Exception $e) {
                resposta(false, null, 'Erro ao criar tabelas: ' . $e->getMessage(), 500);
            }
            break;
            
        case 'proximo-id-viagem':
            try {
                // Buscar o maior ID atual
                $stmt = $pdo->query("SELECT MAX(id) as ultimo_id FROM viagens");
                $resultado = $stmt->fetch(PDO::FETCH_ASSOC);
                $ultimoId = intval($resultado['ultimo_id']);
                
                // Próximo ID será o último + 1
                $proximoId = $ultimoId + 1;
                
                error_log("API: Consultado próximo ID de viagem - Último=$ultimoId, Próximo=$proximoId");
                
                resposta(true, ['proximo_id' => $proximoId], 'Próximo ID obtido com sucesso');
            } catch (Exception $e) {
                error_log("Erro ao consultar próximo ID: " . $e->getMessage());
                resposta(false, null, 'Erro ao consultar próximo ID: ' . $e->getMessage(), 500);
            }
            break;
            
        case 'salvar-imagem-trajeto':
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['viagem_id']) || !isset($input['imagem_base64'])) {
                    resposta(false, null, 'ID da viagem e imagem são obrigatórios', 400);
                }
                
                $viagemId = intval($input['viagem_id']);
                $imagemBase64 = $input['imagem_base64'];
                $nomeArquivo = isset($input['nome_arquivo']) ? $input['nome_arquivo'] : "trajeto_viagem_{$viagemId}.jpg";
                
                try {
                    // Verificar se a viagem existe
                    $stmt = $pdo->prepare("SELECT id, cliente FROM viagens WHERE id = ?");
                    $stmt->execute([$viagemId]);
                    $viagem = $stmt->fetch();
                    
                    if (!$viagem) {
                        resposta(false, null, 'Viagem não encontrada', 404);
                    }
                    
                    // Criar diretório para imagens se não existir
                    $diretorioImagens = __DIR__ . '/imagens-trajetos/';
                    if (!is_dir($diretorioImagens)) {
                        mkdir($diretorioImagens, 0755, true);
                    }
                    
                    // Decodificar Base64 e salvar arquivo
                    $dadosImagem = base64_decode($imagemBase64);
                    if ($dadosImagem === false) {
                        resposta(false, null, 'Imagem Base64 inválida', 400);
                    }
                    
                    $caminhoArquivo = $diretorioImagens . $nomeArquivo;
                    $resultado = file_put_contents($caminhoArquivo, $dadosImagem);
                    
                    if ($resultado === false) {
                        resposta(false, null, 'Erro ao salvar arquivo de imagem', 500);
                    }
                    
                    // Atualizar viagem no banco com caminho da imagem
                    $caminhoRelativo = 'imagens-trajetos/' . $nomeArquivo;
                    $stmt = $pdo->prepare("
                        UPDATE viagens 
                        SET imagem_trajeto = ?, 
                            data_atualizacao = NOW() 
                        WHERE id = ?
                    ");
                    $stmt->execute([$caminhoRelativo, $viagemId]);
                    
                    // Log da operação
                    error_log("📸 Imagem do trajeto salva: viagem_id=$viagemId, arquivo=$nomeArquivo, tamanho=" . strlen($dadosImagem) . " bytes");
                    
                    resposta(true, [
                        'viagem_id' => $viagemId,
                        'arquivo' => $nomeArquivo,
                        'caminho' => $caminhoRelativo,
                        'tamanho_bytes' => strlen($dadosImagem),
                        'url_visualizacao' => "imagens-trajetos/$nomeArquivo"
                    ], 'Imagem do trajeto salva com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao salvar imagem do trajeto: " . $e->getMessage());
                    resposta(false, null, 'Erro interno ao salvar imagem', 500);
                }
            } else {
                resposta(false, null, 'Método não permitido. Use POST.', 405);
            }
            break;
            
        case 'listar-viagens-completas':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Buscar viagens com informações completas incluindo imagem
                    $sql = "
                        SELECT 
                            v.id,
                            v.cliente,
                            v.motivo,
                            v.odometro_inicial,
                            v.odometro_final,
                            v.distancia_gps,
                            v.data_inicio,
                            v.data_fim,
                            v.observacoes,
                            '' as justificativa_divergencia,
                            NULL as km_planejado,
                            NULL as diferenca_km_calculada,
                            v.imagem_trajeto,
                            v.data_atualizacao,
                            v.tecnico_id,
                            m.nome as motorista_nome,
                            ve.modelo as veiculo_modelo,
                            ve.placa as veiculo_placa,
                            COALESCE(v.km_gps_real, v.distancia_gps) as km_gps_real
                        FROM viagens v
                        LEFT JOIN motoristas m ON v.tecnico_id = m.id
                        LEFT JOIN veiculos ve ON v.veiculo_id = ve.id
                        WHERE v.data_fim IS NOT NULL
                        ORDER BY v.data_inicio DESC
                        LIMIT 100
                    ";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute();
                    $viagens = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    // Processar dados e verificar se arquivos de imagem existem
                    $viagensProcessadas = array_map(function($viagem) {
                        // Verificar se arquivo de imagem existe fisicamente
                        if ($viagem['imagem_trajeto']) {
                            $caminhoCompleto = __DIR__ . '/' . $viagem['imagem_trajeto'];
                            $viagem['imagem_existe'] = file_exists($caminhoCompleto);
                            $viagem['imagem_url'] = $viagem['imagem_trajeto'];
                            
                            // Informações do arquivo
                            if ($viagem['imagem_existe']) {
                                $viagem['imagem_tamanho'] = filesize($caminhoCompleto);
                                $viagem['imagem_data_modificacao'] = date('Y-m-d H:i:s', filemtime($caminhoCompleto));
                            }
                        } else {
                            $viagem['imagem_existe'] = false;
                            $viagem['imagem_url'] = null;
                        }
                        
                        // Calcular distância percorrida
                        if ($viagem['odometro_inicial'] && $viagem['odometro_final']) {
                            $viagem['km_percorridos'] = $viagem['odometro_final'] - $viagem['odometro_inicial'];
                        } else {
                            $viagem['km_percorridos'] = null;
                        }
                        
                        return $viagem;
                    }, $viagens);
                    
                    // Estatísticas gerais
                    $totalViagens = count($viagensProcessadas);
                    $viagensComImagem = count(array_filter($viagensProcessadas, function($v) {
                        return $v['imagem_existe'];
                    }));
                    $viagensSemImagem = $totalViagens - $viagensComImagem;
                    
                    resposta(true, $viagensProcessadas, "Encontradas $totalViagens viagens ($viagensComImagem com imagem, $viagensSemImagem sem imagem)");
                    
                } catch (Exception $e) {
                    error_log("Erro ao listar viagens completas: " . $e->getMessage());
                    resposta(false, null, 'Erro interno ao listar viagens', 500);
                }
            } else {
                resposta(false, null, 'Método não permitido. Use GET.', 405);
            }
            break;
            
        case 'excluir_motorista':
            // Excluir motorista
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID do motorista é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                
                if ($id <= 0) {
                    resposta(false, null, 'ID do motorista inválido', 400);
                }
                
                try {
                    // Verificar se o motorista existe
                    $stmt = $pdo->prepare("SELECT id, nome FROM motoristas WHERE id = ?");
                    $stmt->execute([$id]);
                    $motorista = $stmt->fetch();
                    
                    if (!$motorista) {
                        resposta(false, null, 'Motorista não encontrado', 404);
                    }
                    
                    // Verificar se há viagens em andamento
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM viagens 
                        WHERE motorista_id = ? AND data_fim IS NULL
                    ");
                    $stmt->execute([$id]);
                    $viagensAtivas = $stmt->fetch()['total'];
                    
                    if ($viagensAtivas > 0) {
                        resposta(false, null, 'Não é possível excluir motorista com viagens em andamento', 400);
                    }
                    
                    // Verificar se há viagens vinculadas a este motorista
                    $stmt = $pdo->prepare("
                        SELECT COUNT(*) as total 
                        FROM viagens 
                        WHERE motorista_id = ? OR motorista = (SELECT nome FROM motoristas WHERE id = ?)
                    ");
                    $stmt->execute([$id, $id]);
                    $viagensVinculadas = $stmt->fetch()['total'];
                    
                    if ($viagensVinculadas > 0) {
                        resposta(false, null, 'Não é possível excluir motorista com viagens vinculadas', 400);
                    }
                    
                    // Excluir motorista
                    $stmt = $pdo->prepare("DELETE FROM motoristas WHERE id = ?");
                    $stmt->execute([$id]);
                    
                    if ($stmt->rowCount() > 0) {
                        resposta(true, null, "Motorista {$motorista['nome']} excluído com sucesso");
                    } else {
                        resposta(false, null, 'Erro ao excluir motorista', 500);
                    }
                    
                } catch (Exception $e) {
                    resposta(false, null, 'Erro ao excluir motorista: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'verificar_schema_rotas':
            // Endpoint para verificar o schema das tabelas de rotas
            $pdo = conectarBanco();
            
            try {
                // Verificar colunas da tabela solicitacoes_rotas
                $stmt = $pdo->query("DESCRIBE solicitacoes_rotas");
                $colunas_solicitacoes = $stmt->fetchAll();
                
                // Verificar colunas da tabela rota_clientes
                $stmt = $pdo->query("DESCRIBE rota_clientes");
                $colunas_clientes = $stmt->fetchAll();
                
                resposta(true, [
                    'solicitacoes_rotas' => $colunas_solicitacoes,
                    'rota_clientes' => $colunas_clientes
                ], 'Schema das tabelas verificado');
                
            } catch (Exception $e) {
                resposta(false, null, 'Erro ao verificar schema: ' . $e->getMessage(), 500);
            }
            break;

        case 'recriar_tabelas_rotas':
            // Endpoint para recriar as tabelas com o schema correto
            $pdo = conectarBanco();
            
            try {
                // Dropar tabelas existentes (se existirem)
                $pdo->exec("DROP TABLE IF EXISTS rota_clientes");
                $pdo->exec("DROP TABLE IF EXISTS solicitacoes_rotas");
                error_log("✅ Tabelas antigas removidas");
                
                // Criar tabela solicitacoes_rotas novamente
                $sql_solicitacoes = "CREATE TABLE solicitacoes_rotas (
                    id BIGINT AUTO_INCREMENT PRIMARY KEY,
                    motorista_id BIGINT NOT NULL COMMENT 'ID do motorista que solicitou a rota',
                    veiculo_id BIGINT NOT NULL COMMENT 'ID do veículo a ser usado',
                    titulo VARCHAR(200) NOT NULL COMMENT 'Título da rota',
                    descricao TEXT NULL COMMENT 'Descrição detalhada da rota',
                    data_prevista DATE NOT NULL COMMENT 'Data prevista para execução da rota',
                    hora_inicio_prevista TIME NOT NULL COMMENT 'Horário previsto para início',
                    duracao_estimada INT NULL COMMENT 'Duração estimada em minutos',
                    km_estimado INT NULL COMMENT 'Quilometragem estimada total',
                    prioridade ENUM('baixa', 'normal', 'alta', 'urgente') DEFAULT 'normal',
                    status ENUM('pendente', 'aprovada', 'negada', 'em_execucao', 'concluida', 'cancelada') DEFAULT 'pendente',
                    
                    gestor_id BIGINT NULL COMMENT 'ID do gestor que respondeu',
                    data_resposta TIMESTAMP NULL,
                    justificativa_gestor TEXT NULL,
                    
                    data_inicio_real TIMESTAMP NULL,
                    data_fim_real TIMESTAMP NULL,
                    observacoes_finais TEXT NULL,
                    
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
                )";
                
                $pdo->exec($sql_solicitacoes);
                error_log("✅ Tabela solicitacoes_rotas recriada");
                
                // Criar tabela rota_clientes novamente
                $sql_clientes = "CREATE TABLE rota_clientes (
                    id BIGINT AUTO_INCREMENT PRIMARY KEY,
                    solicitacao_rota_id BIGINT NOT NULL,
                    cliente_id INT NULL COMMENT 'ID do cliente na tabela clientes (se existir)',
                    nome_cliente VARCHAR(200) NOT NULL COMMENT 'Nome do cliente',
                    endereco TEXT NULL COMMENT 'Endereço do cliente',
                    telefone VARCHAR(20) NULL,
                    motivo_atendimento TEXT NOT NULL COMMENT 'Motivo da visita',
                    ordem_sequencia INT NOT NULL COMMENT 'Ordem de atendimento (1, 2, 3...)',
                    tempo_estimado INT NULL COMMENT 'Tempo estimado em minutos para este cliente',
                    
                    hora_chegada TIMESTAMP NULL,
                    hora_saida TIMESTAMP NULL,
                    status_atendimento ENUM('pendente', 'em_atendimento', 'concluido', 'cancelado') DEFAULT 'pendente',
                    observacoes TEXT NULL,
                    
                    latitude DECIMAL(10, 8) NULL,
                    longitude DECIMAL(11, 8) NULL,
                    
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                    
                    FOREIGN KEY (solicitacao_rota_id) REFERENCES solicitacoes_rotas(id) ON DELETE CASCADE
                )";
                
                $pdo->exec($sql_clientes);
                error_log("✅ Tabela rota_clientes recriada");
                
                resposta(true, null, 'Tabelas de rotas recriadas com schema correto!');
                
            } catch (Exception $e) {
                error_log("❌ Erro ao recriar tabelas: " . $e->getMessage());
                resposta(false, null, 'Erro ao recriar tabelas: ' . $e->getMessage(), 500);
            }
            break;

        case 'criar_tabelas_rotas':
            // Endpoint para criar as tabelas de rotas automaticamente
            $pdo = conectarBanco();
            
            try {
                // Criar tabela solicitacoes_rotas
                $sql_solicitacoes = "CREATE TABLE IF NOT EXISTS solicitacoes_rotas (
                    id BIGINT AUTO_INCREMENT PRIMARY KEY,
                    motorista_id BIGINT NOT NULL COMMENT 'ID do motorista que solicitou a rota',
                    veiculo_id BIGINT NOT NULL COMMENT 'ID do veículo a ser usado',
                    titulo VARCHAR(200) NOT NULL COMMENT 'Título da rota (ex: \"Atendimento Região Norte\")',
                    descricao TEXT NULL COMMENT 'Descrição detalhada da rota',
                    data_prevista DATE NOT NULL COMMENT 'Data prevista para execução da rota',
                    hora_inicio_prevista TIME NOT NULL COMMENT 'Horário previsto para início',
                    duracao_estimada INT NULL COMMENT 'Duração estimada em minutos',
                    km_estimado INT NULL COMMENT 'Quilometragem estimada total',
                    prioridade ENUM('baixa', 'normal', 'alta', 'urgente') DEFAULT 'normal',
                    status ENUM('pendente', 'aprovada', 'negada', 'em_execucao', 'concluida', 'cancelada') DEFAULT 'pendente',
                    
                    gestor_id BIGINT NULL COMMENT 'ID do gestor que respondeu (tabela motoristas com tipo gestor)',
                    data_resposta TIMESTAMP NULL,
                    justificativa_gestor TEXT NULL,
                    
                    data_inicio_real TIMESTAMP NULL,
                    data_fim_real TIMESTAMP NULL,
                    observacoes_finais TEXT NULL,
                    
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                    
                    FOREIGN KEY (motorista_id) REFERENCES motoristas(id) ON UPDATE CASCADE,
                    FOREIGN KEY (veiculo_id) REFERENCES veiculos(id) ON UPDATE CASCADE,
                    FOREIGN KEY (gestor_id) REFERENCES motoristas(id) ON UPDATE CASCADE,
                    
                    INDEX idx_motorista (motorista_id),
                    INDEX idx_veiculo (veiculo_id),
                    INDEX idx_status (status),
                    INDEX idx_data_prevista (data_prevista),
                    INDEX idx_gestor (gestor_id)
                )";
                
                $pdo->exec($sql_solicitacoes);
                error_log("✅ Tabela solicitacoes_rotas criada");
                
                // Criar tabela rota_clientes
                $sql_clientes = "CREATE TABLE IF NOT EXISTS rota_clientes (
                    id BIGINT AUTO_INCREMENT PRIMARY KEY,
                    solicitacao_rota_id BIGINT NOT NULL,
                    cliente_id INT NULL COMMENT 'ID do cliente na tabela clientes (se existir)',
                    nome_cliente VARCHAR(200) NOT NULL COMMENT 'Nome do cliente',
                    endereco TEXT NULL COMMENT 'Endereço do cliente',
                    telefone VARCHAR(20) NULL,
                    motivo_atendimento TEXT NOT NULL COMMENT 'Motivo da visita',
                    ordem_sequencia INT NOT NULL COMMENT 'Ordem de atendimento (1, 2, 3...)',
                    tempo_estimado INT NULL COMMENT 'Tempo estimado em minutos para este cliente',
                    
                    hora_chegada TIMESTAMP NULL,
                    hora_saida TIMESTAMP NULL,
                    status_atendimento ENUM('pendente', 'em_atendimento', 'concluido', 'cancelado') DEFAULT 'pendente',
                    observacoes TEXT NULL,
                    
                    latitude DECIMAL(10, 8) NULL,
                    longitude DECIMAL(11, 8) NULL,
                    
                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                    
                    FOREIGN KEY (solicitacao_rota_id) REFERENCES solicitacoes_rotas(id) ON DELETE CASCADE,
                    FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE SET NULL,
                    
                    INDEX idx_solicitacao (solicitacao_rota_id),
                    INDEX idx_cliente (cliente_id),
                    INDEX idx_ordem (ordem_sequencia),
                    INDEX idx_status (status_atendimento)
                )";
                
                $pdo->exec($sql_clientes);
                error_log("✅ Tabela rota_clientes criada");
                
                resposta(true, null, 'Tabelas de rotas criadas com sucesso!');
                
            } catch (Exception $e) {
                error_log("❌ Erro ao criar tabelas: " . $e->getMessage());
                resposta(false, null, 'Erro ao criar tabelas: ' . $e->getMessage(), 500);
            }
            break;

        case 'solicitar_rota':
            // Endpoint para o app Android solicitar autorização de rota
            $pdo = conectarBanco();
            
            // DEBUG: Verificar se as tabelas existem
            try {
                $pdo->query("SELECT 1 FROM solicitacoes_rotas LIMIT 1");
                error_log("✅ Tabela solicitacoes_rotas existe");
            } catch (Exception $e) {
                error_log("❌ Tabela solicitacoes_rotas NÃO existe: " . $e->getMessage());
                resposta(false, null, 'Tabela solicitacoes_rotas não existe. Acesse: https://sistemas.pinheiroempresas.com.br/controlefrota/backend-php/api-simples-v2.php?acao=criar_tabelas_rotas', 500);
                break;
            }
            
            try {
                $pdo->query("SELECT 1 FROM rota_clientes LIMIT 1");
                error_log("✅ Tabela rota_clientes existe");
            } catch (Exception $e) {
                error_log("❌ Tabela rota_clientes NÃO existe: " . $e->getMessage());
                resposta(false, null, 'Tabela rota_clientes não existe. Acesse: https://sistemas.pinheiroempresas.com.br/controlefrota/backend-php/api-simples-v2.php?acao=criar_tabelas_rotas', 500);
                break;
            }
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input) {
                    resposta(false, null, 'Dados JSON inválidos', 400);
                }

                // Validar campos obrigatórios
                $camposObrigatorios = ['motorista_id', 'veiculo_id', 'titulo', 'data_prevista', 'hora_inicio', 'gestor_id', 'clientes'];
                foreach ($camposObrigatorios as $campo) {
                    if (!isset($input[$campo]) || empty($input[$campo])) {
                        resposta(false, null, "Campo obrigatório: $campo", 400);
                    }
                }

                if (!is_array($input['clientes']) || count($input['clientes']) === 0) {
                    resposta(false, null, 'É necessário adicionar pelo menos um cliente à rota', 400);
                }

                try {
                    $pdo->beginTransaction();

                    // Calcular tempo estimado total
                    $tempo_total_estimado = 0;
                    foreach ($input['clientes'] as $cliente) {
                        $tempo_total_estimado += intval($cliente['tempo_estimado'] ?? 60);
                    }

                    // 🧮 USAR KM ESTIMADO ENVIADO PELO APP OU CALCULAR AUTOMATICAMENTE
                    $km_estimado = 0;
                    
                    // Se o app enviou km_estimado, usar ele
                    if (isset($input['km_estimado']) && $input['km_estimado'] > 0) {
                        $km_estimado = floatval($input['km_estimado']);
                        error_log("📍 Usando km_estimado enviado pelo app: {$km_estimado}km");
                    } else if (count($input['clientes']) >= 2) {
                        // Função para calcular distância entre coordenadas
                        function calcularDistancia($lat1, $lon1, $lat2, $lon2) {
                            $r = 6371; // Raio da Terra em km
                            $dLat = deg2rad($lat2 - $lat1);
                            $dLon = deg2rad($lon2 - $lon1);
                            $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon/2) * sin($dLon/2);
                            $c = 2 * atan2(sqrt($a), sqrt(1-$a));
                            return $r * $c;
                        }
                        
                        // Função para estimar distância baseada em endereços
                        function estimarDistanciaPorEndereco($endereco1, $endereco2) {
                            if (empty($endereco1) || empty($endereco2)) {
                                return 5; // Valor padrão se endereço vazio
                            }
                            
                            // Normalizar endereços para comparação
                            $end1 = strtolower(trim($endereco1));
                            $end2 = strtolower(trim($endereco2));
                            
                            // Se endereços são idênticos ou muito similares
                            if ($end1 === $end2 || similar_text($end1, $end2) > strlen($end1) * 0.8) {
                                return 0.5; // Mesmo local ou muito próximo
                            }
                            
                            // Verificar se são bairros diferentes
                            $bairros = [
                                'atalaia' => ['lat' => -10.9456, 'lng' => -37.0714],
                                'são josé' => ['lat' => -10.9167, 'lng' => -37.0500],
                                'centro' => ['lat' => -10.9091, 'lng' => -37.0677],
                                'coroa do meio' => ['lat' => -10.9000, 'lng' => -37.0833],
                                'grageru' => ['lat' => -10.9200, 'lng' => -37.0800],
                                'inácio barbosa' => ['lat' => -10.9300, 'lng' => -37.0900],
                                'salgado filho' => ['lat' => -10.9100, 'lng' => -37.0600],
                                '13 de julho' => ['lat' => -10.9050, 'lng' => -37.0750],
                                'farolândia' => ['lat' => -10.9150, 'lng' => -37.0850],
                                'jardins' => ['lat' => -10.9250, 'lng' => -37.0650]
                            ];
                            
                            $bairro1 = null;
                            $bairro2 = null;
                            
                            foreach ($bairros as $bairro => $coords) {
                                if (strpos($end1, $bairro) !== false) {
                                    $bairro1 = $coords;
                                }
                                if (strpos($end2, $bairro) !== false) {
                                    $bairro2 = $coords;
                                }
                            }
                            
                            // Se encontrou ambos os bairros, calcular distância real
                            if ($bairro1 && $bairro2) {
                                $r = 6371; // Raio da Terra em km
                                $dLat = deg2rad($bairro2['lat'] - $bairro1['lat']);
                                $dLon = deg2rad($bairro2['lng'] - $bairro1['lng']);
                                $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($bairro1['lat'])) * cos(deg2rad($bairro2['lat'])) * sin($dLon/2) * sin($dLon/2);
                                $c = 2 * atan2(sqrt($a), sqrt(1-$a));
                                return $r * $c;
                            }
                            
                            // Se não conseguiu identificar bairros, usar estimativa baseada em palavras-chave
                            $palavras_distancia = [
                                'atalaia' => 8, 'são josé' => 3, 'centro' => 0, 'coroa do meio' => 2,
                                'grageru' => 1, 'inácio barbosa' => 4, 'salgado filho' => 2, '13 de julho' => 1,
                                'farolândia' => 3, 'jardins' => 2
                            ];
                            
                            $dist1 = 0;
                            $dist2 = 0;
                            
                            foreach ($palavras_distancia as $palavra => $dist) {
                                if (strpos($end1, $palavra) !== false) {
                                    $dist1 = $dist;
                                }
                                if (strpos($end2, $palavra) !== false) {
                                    $dist2 = $dist;
                                }
                            }
                            
                            return abs($dist1 - $dist2) + 1; // Mínimo 1km
                        }
                        
                        // Calcular distância entre clientes usando endereços
                        for ($i = 0; $i < count($input['clientes']) - 1; $i++) {
                            $cliente1 = $input['clientes'][$i];
                            $cliente2 = $input['clientes'][$i + 1];
                            
                            $endereco1 = $cliente1['endereco'] ?? '';
                            $endereco2 = $cliente2['endereco'] ?? '';
                            
                            // Estimar distância baseada nos endereços
                            $distancia = estimarDistanciaPorEndereco($endereco1, $endereco2);
                            $km_estimado += $distancia;
                            
                            error_log("📍 Distância estimada entre '{$endereco1}' e '{$endereco2}': {$distancia}km");
                        }
                    } else {
                        // Poucos clientes, usar valor padrão
                        $km_estimado = 10; // 10km padrão
                    }
                    
                    $km_estimado = round($km_estimado, 2);

                    // Inserir solicitação de rota COM KM ESTIMADO
                    $sql = "INSERT INTO solicitacoes_rotas (
                        motorista_id, veiculo_id, titulo, descricao, data_prevista, 
                        hora_inicio_prevista, duracao_estimada, km_estimado, prioridade, gestor_id, status
                    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'pendente')";

                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([
                        intval($input['motorista_id']),
                        intval($input['veiculo_id']),
                        $input['titulo'],
                        $input['descricao'] ?? null,
                        $input['data_prevista'],
                        $input['hora_inicio'],
                        $tempo_total_estimado,
                        $km_estimado,
                        $input['prioridade'] ?? 'normal',
                        intval($input['gestor_id'])
                    ]);

                    $solicitacao_id = $pdo->lastInsertId();

                    // Inserir clientes da rota
                    $sql_cliente = "INSERT INTO rota_clientes (
                        solicitacao_rota_id, nome_cliente, endereco, telefone, 
                        motivo_atendimento, ordem_sequencia, tempo_estimado
                    ) VALUES (?, ?, ?, ?, ?, ?, ?)";

                    $stmt_cliente = $pdo->prepare($sql_cliente);

                    foreach ($input['clientes'] as $index => $cliente) {
                        $stmt_cliente->execute([
                            $solicitacao_id,
                            $cliente['nome'],
                            $cliente['endereco'] ?? null,
                            $cliente['telefone'] ?? null,
                            $cliente['motivo'],
                            $cliente['ordem'] ?? ($index + 1),
                            intval($cliente['tempo_estimado'] ?? 60)
                        ]);
                    }

                    // Buscar dados do motorista para notificação
                    $stmt = $pdo->prepare("SELECT nome FROM motoristas WHERE id = ?");
                    $stmt->execute([$input['motorista_id']]);
                    $motorista = $stmt->fetch();
                    $nome_motorista = $motorista['nome'] ?? "Motorista {$input['motorista_id']}";
                    
                    error_log("NOVA SOLICITAÇÃO DE ROTA - ID: $solicitacao_id, Título: {$input['titulo']}, Motorista: $nome_motorista, Clientes: " . count($input['clientes']));

                    $pdo->commit();

                    // 🚨 ENVIAR NOTIFICAÇÃO PUSH PARA GESTORES (ntfy + FCM)
                    try {
                        error_log("📱 Enviando notificação push para gestores sobre rota $solicitacao_id");
                        
                        // 1. ENVIAR VIA NTFY (método direto como as viagens) - com detalhes completos da rota
                        $detalhesClientes = [];
                        foreach ($input['clientes'] as $index => $cliente) {
                            $ordem = $index + 1;
                            $nomeCliente = $cliente['nome'];
                            $motivo = $cliente['motivo'];
                            $tempo = $cliente['tempo_estimado'] ?? 60;
                            $endereco = !empty($cliente['endereco']) ? " - " . substr($cliente['endereco'], 0, 50) . "..." : "";
                            $telefone = !empty($cliente['telefone']) ? " ☎️{$cliente['telefone']}" : "";
                            
                            $detalhesClientes[] = "#{$ordem} $nomeCliente$endereco\n   📝 $motivo ({$tempo}min)$telefone";
                        }
                        $listaClientes = implode("\n\n", $detalhesClientes);
                        
                        $prioridadeIcon = ($input['prioridade'] ?? 'normal') === 'urgente' ? '🚨 URGENTE' : '📋 Normal';
                        $descricao = !empty($input['descricao']) ? "\n💬 Descrição: {$input['descricao']}" : "";
                        
                        $ntfyMessage = "🗺️ NOVA ROTA SOLICITADA\n\n" .
                                     "👤 Motorista: $nome_motorista\n" .
                                     "📍 Título: {$input['titulo']}\n" .
                                     "📅 Data: {$input['data_prevista']} às {$input['hora_inicio']}\n" .
                                     "🚗 Veículo ID: {$input['veiculo_id']}\n" .
                                     "⏱️ Duração total: {$tempo_total_estimado}min\n" .
                                     "🔥 Prioridade: $prioridadeIcon" .
                                     $descricao . "\n\n" .
                                     "👥 ROTA COMPLETA (" . count($input['clientes']) . " clientes):\n\n" .
                                     $listaClientes;
                        
                        // Buscar o tópico ntfy específico do gestor selecionado
                        $stmt = $pdo->prepare("SELECT nome FROM motoristas WHERE id = ?");
                        $stmt->execute([$input['gestor_id']]);
                        $gestor = $stmt->fetch();
                        $nome_gestor = strtolower($gestor['nome'] ?? "gestor{$input['gestor_id']}");
                        
                        // Mapear nomes de gestores para tópicos ntfy
                        $mapGestorTopic = [
                            'administrador' => 'geraldo',
                            'antonio' => 'antonio', 
                            'kelwen' => 'kelwen',
                            'marcio' => 'marcio'
                        ];
                        
                        $gestorTopic = $mapGestorTopic[$nome_gestor] ?? 'geraldo'; // fallback para geraldo
                        error_log("📍 Enviando notificação de rota apenas para gestor: $nome_gestor -> tópico: $gestorTopic");
                        
                        $ntfyTopics = [$gestorTopic]; // Apenas o gestor específico
                        
                        foreach ($ntfyTopics as $topic) {
                            $ntfyUrl = "https://ntfy.sh/$topic";
                            
                            $ch_ntfy = curl_init();
                            curl_setopt($ch_ntfy, CURLOPT_URL, $ntfyUrl);
                            curl_setopt($ch_ntfy, CURLOPT_POST, true);
                            curl_setopt($ch_ntfy, CURLOPT_POSTFIELDS, $ntfyMessage);
                            $titlePrioridade = ($input['prioridade'] ?? 'normal') === 'urgente' ? '[URGENTE] ' : '';
                            $titleDetalhes = $titlePrioridade . "Rota: {$input['titulo']} (" . count($input['clientes']) . " clientes)";
                            
                            curl_setopt($ch_ntfy, CURLOPT_HTTPHEADER, [
                                'Title: ' . $titleDetalhes,
                                'Priority: ' . (($input['prioridade'] ?? 'normal') === 'urgente' ? 'urgent' : 'high'),
                                'Tags: car,route,check',
                                'Click: controlefrota://solicitacao/' . $solicitacao_id . '?gestor_id=' . $input['gestor_id'] . '&tipo=rota'
                            ]);
                            curl_setopt($ch_ntfy, CURLOPT_RETURNTRANSFER, true);
                            curl_setopt($ch_ntfy, CURLOPT_TIMEOUT, 5);
                            curl_setopt($ch_ntfy, CURLOPT_SSL_VERIFYPEER, false);
                            
                            $ntfy_response = curl_exec($ch_ntfy);
                            $ntfy_code = curl_getinfo($ch_ntfy, CURLINFO_HTTP_CODE);
                            curl_close($ch_ntfy);
                            
                            if ($ntfy_code === 200) {
                                error_log("✅ Notificação de rota enviada para gestor '$nome_gestor' (tópico '$topic'): $ntfy_response");
                            } else {
                                error_log("⚠️ Erro ao enviar notificação de rota para gestor '$nome_gestor' (tópico '$topic'): HTTP $ntfy_code - $ntfy_response");
                            }
                        }
                        
                        // 2. TAMBÉM ENVIAR VIA FCM (para compatibilidade)
                        $notificacaoUrl = 'https://sistemas.pinheiroempresas.com.br/controlefrota/backend-php/api/gestao/enviar-notificacao-gestores.php';
                        
                        $notificacaoData = [
                            'titulo' => "🗺️ Nova Solicitação de Rota",
                            'mensagem' => "$nome_motorista solicitou rota: {$input['titulo']} (" . count($input['clientes']) . " clientes)",
                            'tipo' => 'solicitacao_rota',
                            'dados' => [
                                'solicitacao_id' => $solicitacao_id,
                                'motorista_id' => $input['motorista_id'],
                                'motorista_nome' => $nome_motorista,
                                'titulo' => $input['titulo'],
                                'total_clientes' => count($input['clientes']),
                                'gestor_id' => $input['gestor_id']
                            ]
                        ];
                        
                        $ch = curl_init();
                        curl_setopt($ch, CURLOPT_URL, $notificacaoUrl);
                        curl_setopt($ch, CURLOPT_POST, true);
                        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($notificacaoData));
                        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
                        
                        $response = curl_exec($ch);
                        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                        curl_close($ch);
                        
                        if ($httpCode === 200) {
                            error_log("✅ Notificação FCM de rota enviada com sucesso: $response");
                        } else {
                            error_log("⚠️ Erro ao enviar notificação FCM de rota: HTTP $httpCode - $response");
                        }
                        
                    } catch (Exception $e) {
                        error_log("❌ Exceção ao enviar notificação push de rota: " . $e->getMessage());
                        // Não falhar a operação principal por causa da notificação
                    }

                    resposta(true, [
                        'solicitacao_id' => $solicitacao_id,
                        'total_clientes' => count($input['clientes']),
                        'tempo_estimado' => $tempo_total_estimado
                    ], 'Solicitação de rota enviada com sucesso! Aguarde aprovação do gestor.');

                } catch (Exception $e) {
                    $pdo->rollBack();
                    error_log("Erro ao salvar rota: " . $e->getMessage());
                    resposta(false, null, 'Erro ao salvar rota: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;

        case 'detalhes_rota':
            // Buscar detalhes completos de uma rota específica
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                $rota_id = isset($_GET['id']) ? intval($_GET['id']) : 0;
                
                if ($rota_id <= 0) {
                    resposta(false, null, 'ID da rota é obrigatório', 400);
                }
                
                try {
                    // Buscar dados da rota principal
                    $stmt = $pdo->prepare("
                        SELECT 
                            sr.id,
                            sr.titulo,
                            sr.descricao,
                            sr.data_prevista,
                            sr.hora_inicio_prevista,
                            sr.duracao_estimada,
                            sr.prioridade,
                            sr.status,
                            sr.motorista_id,
                            sr.veiculo_id,
                            sr.gestor_id,
                            sr.created_at,
                            m.nome as motorista_nome,
                            v.modelo as veiculo_modelo,
                            v.placa as veiculo_placa,
                            g.nome as gestor_nome
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                        LEFT JOIN motoristas g ON sr.gestor_id = g.id
                        WHERE sr.id = ?
                    ");
                    $stmt->execute([$rota_id]);
                    $rota = $stmt->fetch();
                    
                    if (!$rota) {
                        resposta(false, null, 'Rota não encontrada', 404);
                        break;
                    }
                    
                    // Buscar clientes da rota
                    $stmt_clientes = $pdo->prepare("
                        SELECT 
                            rc.id,
                            rc.nome_cliente,
                            rc.endereco,
                            rc.telefone,
                            rc.motivo_atendimento,
                            rc.ordem_sequencia,
                            rc.tempo_estimado,
                            rc.status_atendimento,
                            rc.observacoes
                        FROM rota_clientes rc
                        WHERE rc.solicitacao_rota_id = ?
                        ORDER BY rc.ordem_sequencia ASC
                    ");
                    $stmt_clientes->execute([$rota_id]);
                    $clientes = $stmt_clientes->fetchAll();
                    
                    // Combinar dados
                    $rota['clientes'] = $clientes;
                    $rota['total_clientes'] = count($clientes);
                    
                    resposta(true, $rota, 'Detalhes da rota encontrados');
                    
                } catch (Exception $e) {
                    error_log("Erro ao buscar detalhes da rota: " . $e->getMessage());
                    resposta(false, null, 'Erro ao buscar detalhes da rota: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;
            
        case 'rotas_pendentes':
            // Listar rotas pendentes para gestores
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    $sql = "
                        SELECT 
                            sr.*,
                            m.nome as motorista_nome,
                            v.modelo as veiculo_modelo,
                            v.placa as veiculo_placa,
                            COUNT(rc.id) as total_clientes,
                            SUM(rc.tempo_estimado) as tempo_total_estimado
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                        LEFT JOIN rota_clientes rc ON sr.id = rc.solicitacao_rota_id
                        WHERE sr.status = 'pendente'
                        GROUP BY sr.id
                        ORDER BY sr.created_at DESC
                    ";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute();
                    $rotas = $stmt->fetchAll();
                    
                    resposta(true, $rotas, 'Rotas pendentes listadas');
                    
                } catch (Exception $e) {
                    error_log("Erro ao listar rotas: " . $e->getMessage());
                    resposta(false, null, 'Erro ao listar rotas: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;

        case 'aprovar_rota':
            // Aprovar solicitação de rota
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id'])) {
                    resposta(false, null, 'ID da rota é obrigatório', 400);
                }
                
                $id = intval($input['id']);
                $gestor_id = intval($input['gestor_id'] ?? 1); // Por enquanto usar ID 1
                $justificativa = $input['justificativa'] ?? 'Rota aprovada pelo gestor';
                
                try {
                    $pdo->beginTransaction();
                    
                    // Verificar se a rota existe e está pendente
                    $stmt = $pdo->prepare("SELECT * FROM solicitacoes_rotas WHERE id = ? AND status = 'pendente'");
                    $stmt->execute([$id]);
                    $rota = $stmt->fetch();

                    if (!$rota) {
                        resposta(false, null, 'Rota não encontrada ou já processada', 404);
                    }

                    // Atualizar status da rota
                    $sql = "UPDATE solicitacoes_rotas SET 
                            status = 'aprovada', 
                            gestor_id = ?, 
                            data_resposta = NOW(), 
                            justificativa_gestor = ? 
                            WHERE id = ?";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([$gestor_id, $justificativa, $id]);

                    $pdo->commit();
                    
                    error_log("Rota ID $id aprovada pelo gestor ID $gestor_id");
                    resposta(true, ['id' => $id], 'Rota aprovada com sucesso');

                } catch (Exception $e) {
                    $pdo->rollBack();
                    error_log("Erro ao aprovar rota: " . $e->getMessage());
                    resposta(false, null, 'Erro ao aprovar rota: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;

        case 'negar_rota':
            // Negar solicitação de rota
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                $input = json_decode(file_get_contents('php://input'), true);
                
                if (!$input || !isset($input['id']) || !isset($input['justificativa'])) {
                    resposta(false, null, 'ID da rota e justificativa são obrigatórios', 400);
                }
                
                $id = intval($input['id']);
                $gestor_id = intval($input['gestor_id'] ?? 1); // Por enquanto usar ID 1
                $justificativa = $input['justificativa'];
                
                try {
                    // Verificar se a rota existe e está pendente
                    $stmt = $pdo->prepare("SELECT * FROM solicitacoes_rotas WHERE id = ? AND status = 'pendente'");
                    $stmt->execute([$id]);
                    $rota = $stmt->fetch();

                    if (!$rota) {
                        resposta(false, null, 'Rota não encontrada ou já processada', 404);
                    }

                    // Atualizar status da rota
                    $sql = "UPDATE solicitacoes_rotas SET 
                            status = 'negada', 
                            gestor_id = ?, 
                            data_resposta = NOW(), 
                            justificativa_gestor = ? 
                            WHERE id = ?";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute([$gestor_id, $justificativa, $id]);
                    
                    error_log("Rota ID $id negada pelo gestor ID $gestor_id - Motivo: $justificativa");
                    resposta(true, ['id' => $id], 'Rota negada');

                } catch (Exception $e) {
                    error_log("Erro ao negar rota: " . $e->getMessage());
                    resposta(false, null, 'Erro ao negar rota: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não suportado', 405);
            }
            break;

        case 'migrar_colunas_viagem_km':
            try {
                $pdo = conectarBanco();
                
                // Verificar se as colunas já existem
                $stmt = $pdo->query("DESCRIBE viagens");
                $colunas = $stmt->fetchAll(PDO::FETCH_COLUMN);
                
                $migracoes = [];
                
                if (!in_array('km_planejado', $colunas)) {
                    $migracoes[] = "ALTER TABLE viagens ADD COLUMN km_planejado INT NULL COMMENT 'Quilometragem planejada para a viagem'";
                }
                
                if (!in_array('diferenca_km_calculada', $colunas)) {
                    $migracoes[] = "ALTER TABLE viagens ADD COLUMN diferenca_km_calculada INT NULL COMMENT 'Diferença entre KM real e planejado'";
                }
                
                if (!in_array('justificativa_divergencia', $colunas)) {
                    $migracoes[] = "ALTER TABLE viagens ADD COLUMN justificativa_divergencia TEXT NULL COMMENT 'Justificativa para divergência de quilometragem'";
                }
                
                if (empty($migracoes)) {
                    resposta(true, null, 'Todas as colunas já existem na tabela viagens');
                    break;
                }
                
                foreach ($migracoes as $sql) {
                    $pdo->exec($sql);
                    error_log("✅ Migração executada: " . $sql);
                }
                
                resposta(true, null, 'Colunas adicionadas com sucesso à tabela viagens: ' . count($migracoes) . ' migrações executadas');
                
            } catch (Exception $e) {
                error_log("❌ Erro na migração de colunas: " . $e->getMessage());
                resposta(false, null, 'Erro na migração: ' . $e->getMessage(), 500);
            }
            break;

        case 'migrar_proprietario_veiculo':
            // Endpoint para adicionar campo proprietario na tabela veiculos
            $pdo = conectarBanco();

            try {
                // Verificar se a coluna já existe
                $stmt = $pdo->query("SHOW COLUMNS FROM veiculos LIKE 'proprietario'");
                $exists = $stmt->fetch();

                if (!$exists) {
                    // Adicionar coluna proprietario
                    $pdo->exec("ALTER TABLE veiculos 
                        ADD COLUMN proprietario ENUM('empresa', 'proprio') DEFAULT 'empresa' 
                        COMMENT 'Indica se o veículo é da empresa ou do motorista'");
                    error_log("✅ Coluna proprietario adicionada à tabela veiculos");

                    // Criar índice
                    $pdo->exec("CREATE INDEX idx_proprietario ON veiculos(proprietario)");
                    error_log("✅ Índice idx_proprietario criado");

                    // Atualizar registros existentes
                    $stmt = $pdo->exec("UPDATE veiculos SET proprietario = 'empresa' WHERE proprietario IS NULL");
                    error_log("✅ Registros existentes atualizados para 'empresa'");

                    // Verificar resultado
                    $stmt = $pdo->query("SELECT proprietario, COUNT(*) as quantidade FROM veiculos GROUP BY proprietario");
                    $resultado = $stmt->fetchAll(PDO::FETCH_ASSOC);

                    resposta(true, $resultado, 'Migração concluída! Campo proprietario adicionado com sucesso.');
                } else {
                    resposta(true, null, 'Campo proprietario já existe na tabela veiculos.');
                }

            } catch (Exception $e) {
                error_log("❌ Erro na migração: " . $e->getMessage());
                resposta(false, null, 'Erro na migração: ' . $e->getMessage(), 500);
            }
            break;

        case 'rotas-recentes':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    $sqlRotas = "
                        SELECT 
                            sr.id,
                            'rota' as tipo,
                            sr.titulo as cliente,
                            sr.descricao as motivo,
                            sr.motorista_id as tecnico_id,
                            sr.veiculo_id,
                            -- ✅ CORREÇÃO: Buscar odômetro inicial das viagens (query mais ampla)
                            COALESCE(
                                (SELECT v.odometro_inicial FROM viagens v 
                                 WHERE v.veiculo_id = sr.veiculo_id 
                                 AND v.odometro_inicial > 0
                                 AND v.data_inicio >= DATE_SUB(sr.data_inicio_real, INTERVAL 1 DAY)
                                 AND v.data_inicio <= DATE_ADD(sr.data_inicio_real, INTERVAL 1 DAY)
                                 ORDER BY v.data_inicio ASC 
                                 LIMIT 1),
                                (SELECT v.odometro_inicial FROM viagens v 
                                 WHERE v.veiculo_id = sr.veiculo_id 
                                 AND v.odometro_inicial > 0
                                 ORDER BY v.data_inicio DESC 
                                 LIMIT 1),
                                0
                            ) as odometro_inicial,
                            -- ✅ CORREÇÃO: Buscar odômetro final das viagens (query mais ampla)
                            COALESCE(
                                (SELECT v.odometro_final FROM viagens v 
                                 WHERE v.veiculo_id = sr.veiculo_id 
                                 AND v.odometro_final > 0
                                 AND v.data_inicio >= DATE_SUB(sr.data_inicio_real, INTERVAL 1 DAY)
                                 AND v.data_inicio <= DATE_ADD(sr.data_inicio_real, INTERVAL 1 DAY)
                                 ORDER BY v.data_inicio DESC 
                                 LIMIT 1),
                                (SELECT v.odometro_final FROM viagens v 
                                 WHERE v.veiculo_id = sr.veiculo_id 
                                 AND v.odometro_final > 0
                                 ORDER BY v.data_inicio DESC 
                                 LIMIT 1),
                                0
                            ) as odometro_final,
                            -- ✅ CORREÇÃO: Usar distância GPS já calculada das viagens (query simplificada)
                            COALESCE(
                                (SELECT SUM(v.distancia_gps) FROM viagens v 
                                 WHERE v.veiculo_id = sr.veiculo_id 
                                 AND DATE(v.data_inicio) = DATE(sr.data_inicio_real)
                                 AND v.distancia_gps > 0),
                                0
                            ) as distancia_gps,
                            sr.data_inicio_real as data_inicio,
                            sr.data_fim_real as data_fim,
                            NULL as latitude_inicial,
                            NULL as longitude_inicial,
                            NULL as latitude_final,
                            NULL as longitude_final,
                            'Múltiplos endereços' as endereco_inicial,
                            'Múltiplos endereços' as endereco_final,
                            sr.observacoes_finais as observacoes,
                            sr.justificativa_km as justificativa_divergencia,
                            sr.km_estimado as km_planejado,
                            sr.diferenca_km_calculada,
                            COALESCE(m.nome, 'Motorista não identificado') as tecnico_nome,
                            COALESCE(m.matricula, 'N/A') as tecnico_matricula,
                            COALESCE(ve.modelo, 'Veículo não identificado') as veiculo_nome,
                            COALESCE(ve.placa, 'N/A') as veiculo_placa,
                            CONCAT(COALESCE(ve.modelo, 'Veículo não identificado'), ' - ', COALESCE(ve.placa, 'N/A')) as veiculo_completo,
                            sr.distancia_odometro_rota as distancia_total,
                            (SELECT COUNT(*) FROM rota_clientes rc WHERE rc.solicitacao_rota_id = sr.id) as total_clientes,
                            sr.duracao_estimada,
                            sr.km_estimado as km_estimado_rota,
                            -- ✅ CORREÇÃO: Status da rota baseado nas datas
                            CASE 
                                WHEN sr.data_fim_real IS NOT NULL THEN 'finalizada'
                                WHEN sr.data_inicio_real IS NOT NULL THEN 'em_andamento'
                                ELSE sr.status
                            END as status_rota
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos ve ON sr.veiculo_id = ve.id
                        WHERE sr.status IN ('aprovada', 'em_andamento', 'em_execucao', 'concluida')
                        ORDER BY 
                            CASE 
                                WHEN sr.data_fim_real IS NOT NULL THEN sr.data_fim_real
                                WHEN sr.data_inicio_real IS NOT NULL THEN sr.data_inicio_real
                                ELSE sr.created_at
                            END DESC
                        LIMIT 10
                    ";
                    
                    $stmt = $pdo->query($sqlRotas);
                    $rotas = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    // ✅ DEBUG: Log dos dados retornados
                    error_log("🔍 ROTAS-RECENTES DEBUG: Total de rotas encontradas: " . count($rotas));
                    if (count($rotas) > 0) {
                        error_log("🔍 ROTAS-RECENTES DEBUG: Primeira rota: " . json_encode($rotas[0]));
                        
                        // Debug específico para odômetros
                        $primeiraRota = $rotas[0];
                        error_log("🔍 ODÔMETRO DEBUG:");
                        error_log("   - Rota ID: " . $primeiraRota['id']);
                        error_log("   - Motorista ID: " . $primeiraRota['tecnico_id']);
                        error_log("   - Veículo ID: " . $primeiraRota['veiculo_id']);
                        error_log("   - Data Início Real: " . ($primeiraRota['data_inicio'] ?? 'NULL'));
                        error_log("   - Odômetro Inicial: " . ($primeiraRota['odometro_inicial'] ?? 'NULL'));
                        error_log("   - Odômetro Final: " . ($primeiraRota['odometro_final'] ?? 'NULL'));
                        error_log("   - Distância GPS: " . ($primeiraRota['distancia_gps'] ?? 'NULL'));
                        error_log("   - Status Rota: " . ($primeiraRota['status_rota'] ?? 'NULL'));
                        
                        // Debug: Verificar se há viagens para este veículo
                        $sqlDebug = "SELECT id, tecnico_id, veiculo_id, odometro_inicial, odometro_final, data_inicio 
                                     FROM viagens 
                                     WHERE veiculo_id = ? 
                                     ORDER BY data_inicio DESC 
                                     LIMIT 5";
                        $stmtDebug = $pdo->prepare($sqlDebug);
                        $stmtDebug->execute([$primeiraRota['veiculo_id']]);
                        $viagensDebug = $stmtDebug->fetchAll(PDO::FETCH_ASSOC);
                        error_log("🔍 VIAGENS DEBUG para veículo " . $primeiraRota['veiculo_id'] . ": " . json_encode($viagensDebug));
                        
                        // Debug específico: testar query do odômetro inicial
                        $sqlOdometroDebug = "SELECT v.odometro_inicial, v.data_inicio 
                                            FROM viagens v 
                                            WHERE v.veiculo_id = ? 
                                            AND v.odometro_inicial > 0
                                            ORDER BY v.data_inicio DESC 
                                            LIMIT 3";
                        $stmtOdometroDebug = $pdo->prepare($sqlOdometroDebug);
                        $stmtOdometroDebug->execute([$primeiraRota['veiculo_id']]);
                        $odometrosDebug = $stmtOdometroDebug->fetchAll(PDO::FETCH_ASSOC);
                        error_log("🔍 ODÔMETROS DISPONÍVEIS para veículo " . $primeiraRota['veiculo_id'] . ": " . json_encode($odometrosDebug));
                    }
                    
                    resposta(true, $rotas, 'Rotas recentes carregadas com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao listar rotas recentes: " . $e->getMessage());
                    resposta(false, null, 'Erro ao carregar rotas: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'rotas-executadas':
            // Listar rotas executadas (concluídas) para a página específica
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // ✅ CORREÇÃO: Query simplificada para evitar erros
                    $sqlRotas = "
                        SELECT 
                            sr.id,
                            sr.titulo,
                            sr.descricao,
                            sr.status,
                            sr.data_inicio_real,
                            sr.data_fim_real,
                            sr.km_estimado,
                            sr.distancia_odometro_rota,
                            sr.diferenca_km_calculada,
                            sr.justificativa_km,
                            sr.duracao_estimada,
                            TIMESTAMPDIFF(MINUTE, sr.data_inicio_real, sr.data_fim_real) as duracao_real_minutos,
                            (SELECT COUNT(*) FROM rota_clientes rc WHERE rc.solicitacao_rota_id = sr.id) as total_clientes,
                            (SELECT COUNT(*) FROM rota_clientes rc WHERE rc.solicitacao_rota_id = sr.id AND rc.status_atendimento = 'concluido') as clientes_concluidos,
                            m.nome as motorista_nome,
                            ve.modelo as veiculo_modelo,
                            ve.placa as veiculo_placa,
                            -- ✅ CORREÇÃO: Buscar distancia_gps das viagens da rota
                            (SELECT SUM(v.distancia_gps) 
                             FROM rota_viagens rv 
                             JOIN viagens v ON rv.viagem_id = v.id 
                             WHERE rv.solicitacao_rota_id = sr.id 
                             AND v.distancia_gps IS NOT NULL 
                             AND v.distancia_gps > 0) as distancia_gps
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos ve ON sr.veiculo_id = ve.id
                        WHERE sr.status = 'concluida'
                        ORDER BY sr.data_fim_real DESC
                        LIMIT 50
                    ";
                    
                    $stmt = $pdo->query($sqlRotas);
                    $rotas = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    // Calcular estatísticas para os cards
                    $statsSQL = "
                        SELECT 
                            COUNT(DISTINCT sr.id) as total_rotas,
                            COUNT(DISTINCT rc.id) as total_clientes,
                            -- ✅ CORREÇÃO: Usar distancia_gps em vez de distancia_odometro_rota
                            COALESCE(SUM(
                                (SELECT SUM(v.distancia_gps) 
                                 FROM rota_viagens rv 
                                 JOIN viagens v ON rv.viagem_id = v.id 
                                 WHERE rv.solicitacao_rota_id = sr.id 
                                 AND v.distancia_gps IS NOT NULL 
                                 AND v.distancia_gps > 0)
                            ), 0) as km_total,
                            COALESCE(SUM(sr.duracao_estimada), 0) as tempo_total
                        FROM solicitacoes_rotas sr
                        LEFT JOIN rota_clientes rc ON sr.id = rc.solicitacao_rota_id
                        WHERE sr.status = 'concluida'
                    ";
                    
                    $stmtStats = $pdo->query($statsSQL);
                    $estatisticas = $stmtStats->fetch(PDO::FETCH_ASSOC);
                    
                    resposta(true, [
                        'dados' => $rotas,
                        'estatisticas' => $estatisticas
                    ], 'Rotas executadas carregadas com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao listar rotas executadas: " . $e->getMessage());
                    resposta(false, null, 'Erro ao carregar rotas executadas: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'viagens-unificadas':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Buscar viagens individuais
                    $sqlViagens = "
                        SELECT 
                            v.id,
                            'viagem' as tipo,
                            v.cliente,
                            v.motivo,
                            v.tecnico_id,
                            v.veiculo_id,
                            v.odometro_inicial,
                            v.odometro_final,
                            v.distancia_gps,
                            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,
                            '' as justificativa_divergencia,
                            NULL as km_planejado,
                            NULL as diferenca_km_calculada,
                            COALESCE(m.nome, 'Técnico não identificado') as tecnico_nome,
                            COALESCE(m.matricula, 'N/A') as tecnico_matricula,
                            COALESCE(ve.modelo, 'Veículo não identificado') as veiculo_nome,
                            COALESCE(ve.placa, 'N/A') as veiculo_placa,
                            CONCAT(COALESCE(ve.modelo, 'Veículo não identificado'), ' - ', COALESCE(ve.placa, 'N/A')) as veiculo_completo,
                            v.distancia_gps as distancia_total,
                            NULL as total_clientes,
                            NULL as duracao_estimada,
                            NULL as km_estimado_rota
                        FROM viagens v
                        LEFT JOIN motoristas m ON v.tecnico_id = m.id
                        LEFT JOIN veiculos ve ON v.veiculo_id = ve.id
                        WHERE v.data_fim IS NOT NULL
                        
                        UNION ALL
                        
                        SELECT 
                            sr.id,
                            'rota' as tipo,
                            sr.titulo as cliente,
                            sr.descricao as motivo,
                            sr.motorista_id as tecnico_id,
                            sr.veiculo_id,
                            0 as odometro_inicial,
                            sr.distancia_odometro_rota as odometro_final,
                            sr.distancia_odometro_rota as distancia_gps,
                            sr.data_inicio_real as data_inicio,
                            sr.data_fim_real as data_fim,
                            NULL as latitude_inicial,
                            NULL as longitude_inicial,
                            NULL as latitude_final,
                            NULL as longitude_final,
                            'Múltiplos endereços' as endereco_inicial,
                            'Múltiplos endereços' as endereco_final,
                            sr.observacoes_finais as observacoes,
                            sr.justificativa_km as justificativa_divergencia,
                            sr.km_estimado as km_planejado,
                            sr.diferenca_km_calculada,
                            COALESCE(m.nome, 'Motorista não identificado') as tecnico_nome,
                            COALESCE(m.matricula, 'N/A') as tecnico_matricula,
                            COALESCE(ve.modelo, 'Veículo não identificado') as veiculo_nome,
                            COALESCE(ve.placa, 'N/A') as veiculo_placa,
                            CONCAT(COALESCE(ve.modelo, 'Veículo não identificado'), ' - ', COALESCE(ve.placa, 'N/A')) as veiculo_completo,
                            sr.distancia_odometro_rota as distancia_total,
                            (SELECT COUNT(*) FROM rota_clientes rc WHERE rc.solicitacao_rota_id = sr.id) as total_clientes,
                            sr.duracao_estimada,
                            sr.km_estimado as km_estimado_rota
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos ve ON sr.veiculo_id = ve.id
                        WHERE sr.status = 'concluida'
                        
                        ORDER BY data_fim DESC, data_inicio DESC
                        LIMIT 20
                    ";
                    
                    $stmt = $pdo->query($sqlViagens);
                    $viagens = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    resposta(true, $viagens, 'Viagens e rotas carregadas com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao listar viagens unificadas: " . $e->getMessage());
                    resposta(false, null, 'Erro ao carregar viagens: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'listar-rotas-executadas':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Filtros opcionais
                    $dataInicio = $_GET['dataInicio'] ?? null;
                    $dataFim = $_GET['dataFim'] ?? null;
                    $motoristaId = $_GET['motorista'] ?? null;
                    $status = $_GET['status'] ?? 'concluida';
                    
                    // Construir WHERE clause
                    $whereClause = "WHERE sr.status = :status";
                    $params = [':status' => $status];
                    
                    if ($dataInicio) {
                        $whereClause .= " AND sr.data_prevista >= :dataInicio";
                        $params[':dataInicio'] = $dataInicio;
                    }
                    
                    if ($dataFim) {
                        $whereClause .= " AND sr.data_prevista <= :dataFim";
                        $params[':dataFim'] = $dataFim;
                    }
                    
                    if ($motoristaId) {
                        $whereClause .= " AND sr.motorista_id = :motoristaId";
                        $params[':motoristaId'] = $motoristaId;
                    }
                    
                    // Query principal das rotas
                    $sql = "
                        SELECT 
                            sr.*,
                            m.nome as motorista_nome,
                            v.modelo as veiculo_modelo,
                            v.placa as veiculo_placa,
                            g.nome as gestor_nome,
                            COUNT(DISTINCT rc.id) as total_clientes,
                            SUM(rc.tempo_estimado) as tempo_total_estimado,
                            CASE 
                                WHEN sr.data_inicio_real IS NOT NULL AND sr.data_fim_real IS NOT NULL 
                                THEN TIMESTAMPDIFF(MINUTE, sr.data_inicio_real, sr.data_fim_real)
                                ELSE sr.duracao_estimada 
                            END as duracao_real_minutos,
                            -- ✅ CORREÇÃO: Buscar distancia_gps das viagens da rota
                            (SELECT SUM(v.distancia_gps) 
                             FROM rota_viagens rv 
                             JOIN viagens v ON rv.viagem_id = v.id 
                             WHERE rv.solicitacao_rota_id = sr.id 
                             AND v.distancia_gps IS NOT NULL 
                             AND v.distancia_gps > 0) as distancia_gps
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                        LEFT JOIN motoristas g ON sr.gestor_id = g.id
                        LEFT JOIN rota_clientes rc ON sr.id = rc.solicitacao_rota_id
                        $whereClause
                        GROUP BY sr.id
                        ORDER BY sr.data_prevista DESC, sr.created_at DESC
                    ";
                    
                    $stmt = $pdo->prepare($sql);
                    $stmt->execute($params);
                    $rotas = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    // Para cada rota, buscar os clientes
                    foreach ($rotas as &$rota) {
                        $sqlClientes = "
                            SELECT * FROM rota_clientes 
                            WHERE solicitacao_rota_id = :rotaId 
                            ORDER BY ordem_sequencia ASC
                        ";
                        $stmtClientes = $pdo->prepare($sqlClientes);
                        $stmtClientes->execute([':rotaId' => $rota['id']]);
                        $rota['clientes'] = $stmtClientes->fetchAll(PDO::FETCH_ASSOC);
                    }
                    
                    // Calcular estatísticas
                    $statsSQL = "
                        SELECT 
                            COUNT(DISTINCT sr.id) as total_rotas,
                            COUNT(DISTINCT rc.id) as total_clientes,
                            -- ✅ CORREÇÃO: Usar distancia_gps em vez de distancia_odometro_rota
                            COALESCE(SUM(
                                (SELECT SUM(v.distancia_gps) 
                                 FROM rota_viagens rv 
                                 JOIN viagens v ON rv.viagem_id = v.id 
                                 WHERE rv.solicitacao_rota_id = sr.id 
                                 AND v.distancia_gps IS NOT NULL 
                                 AND v.distancia_gps > 0)
                            ), 0) as km_total,
                            COALESCE(SUM(sr.duracao_estimada), 0) as tempo_total
                        FROM solicitacoes_rotas sr
                        LEFT JOIN rota_clientes rc ON sr.id = rc.solicitacao_rota_id
                        $whereClause
                    ";
                    
                    $stmtStats = $pdo->prepare($statsSQL);
                    $stmtStats->execute($params);
                    $estatisticas = $stmtStats->fetch(PDO::FETCH_ASSOC);
                    
                    resposta(true, [
                        'rotas' => $rotas,
                        'estatisticas' => $estatisticas,
                        'total' => count($rotas)
                    ], 'Rotas executadas carregadas com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao listar rotas executadas: " . $e->getMessage());
                    resposta(false, null, 'Erro ao carregar rotas executadas: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'corrigir-status-rotas':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    $resultados = [];
                    
                    // 1. Marcar rota #12 (Teste 12) como concluída
                    $sql1 = "UPDATE solicitacoes_rotas SET 
                            status = 'concluida',
                            data_fim_real = NOW(),
                            data_inicio_real = COALESCE(data_inicio_real, data_inicio)
                            WHERE id = 12";
                    
                    $stmt1 = $pdo->prepare($sql1);
                    $stmt1->execute();
                    $resultados['rota_12'] = $stmt1->rowCount();
                    
                    // 2. Marcar rota #3 como concluída também (já foi aprovada)
                    $sql2 = "UPDATE solicitacoes_rotas SET 
                            status = 'concluida',
                            data_fim_real = NOW(),
                            data_inicio_real = COALESCE(data_inicio_real, data_inicio)
                            WHERE id = 3 AND status = 'aprovada'";
                    
                    $stmt2 = $pdo->prepare($sql2);
                    $stmt2->execute();
                    $resultados['rota_3'] = $stmt2->rowCount();
                    
                    // 3. Verificar se há viagens finalizadas para essas rotas
                    $sql3 = "SELECT sr.id, sr.titulo, sr.status, 
                                   COUNT(v.id) as viagens_finalizadas
                            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 AND v.data_fim IS NOT NULL
                            WHERE sr.id IN (3, 12)
                            GROUP BY sr.id";
                    
                    $stmt3 = $pdo->prepare($sql3);
                    $stmt3->execute();
                    $verificacao = $stmt3->fetchAll(PDO::FETCH_ASSOC);
                    
                    resposta(true, [
                        'correcoes' => $resultados,
                        'verificacao' => $verificacao
                    ], 'Status das rotas corrigido com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao corrigir status das rotas: " . $e->getMessage());
                    resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'alterar-status-cliente':
            $pdo = conectarBanco();
            
            if ($metodo === 'POST') {
                try {
                    $input = json_decode(file_get_contents('php://input'), true);
                    $rotaId = $input['rota_id'] ?? null;
                    $clienteId = $input['cliente_id'] ?? null;
                    $novoStatus = $input['status'] ?? null;
                    
                    if (!$rotaId || !$clienteId || !$novoStatus) {
                        resposta(false, null, 'Parâmetros obrigatórios: rota_id, cliente_id, status', 400);
                        break;
                    }
                    
                    // Executar atualização diretamente (sem transação para debug)
                    try {
                        // Debug: Log dos parâmetros recebidos
                        error_log("🔧 DEBUG alterar-status-cliente:");
                        error_log("   - rota_id: $rotaId");
                        error_log("   - cliente_id: $clienteId");
                        error_log("   - novo_status: $novoStatus");
                        
                        // Verificar status atual do cliente antes da atualização
                        $sqlCheck = "SELECT status_atendimento, hora_chegada, hora_saida FROM rota_clientes WHERE id = ? AND solicitacao_rota_id = ?";
                        $stmtCheck = $pdo->prepare($sqlCheck);
                        $stmtCheck->execute([$clienteId, $rotaId]);
                        $clienteAtual = $stmtCheck->fetch(PDO::FETCH_ASSOC);
                        
                        if ($clienteAtual) {
                            error_log("   - Status atual: " . $clienteAtual['status_atendimento']);
                            error_log("   - Hora chegada atual: " . $clienteAtual['hora_chegada']);
                            error_log("   - Hora saída atual: " . $clienteAtual['hora_saida']);
                        } else {
                            error_log("   - Cliente não encontrado!");
                        }
                        
                        // Atualizar status do cliente
                        $sql = "UPDATE rota_clientes SET 
                                status_atendimento = ?,
                                hora_chegada = CASE WHEN ? = 'chegou' AND (hora_chegada IS NULL OR hora_chegada = '') THEN NOW() ELSE hora_chegada END,
                                hora_saida = CASE WHEN ? = 'concluido' AND (hora_saida IS NULL OR hora_saida = '') THEN NOW() ELSE hora_saida END
                                WHERE id = ? AND solicitacao_rota_id = ?";
                        
                        error_log("   - SQL: $sql");
                        error_log("   - Parâmetros: [$novoStatus, $novoStatus, $novoStatus, $clienteId, $rotaId]");
                        
                        $stmt = $pdo->prepare($sql);
                        $success = $stmt->execute([$novoStatus, $novoStatus, $novoStatus, $clienteId, $rotaId]);
                        
                        error_log("   - Execute success: " . ($success ? 'true' : 'false'));
                        error_log("   - Row count: " . $stmt->rowCount());
                        
                        // Verificar status após a atualização
                        $stmtCheck->execute([$clienteId, $rotaId]);
                        $clienteAtualizado = $stmtCheck->fetch(PDO::FETCH_ASSOC);
                        
                        if ($clienteAtualizado) {
                            error_log("   - Status após update: " . $clienteAtualizado['status_atendimento']);
                            error_log("   - Hora chegada após update: " . $clienteAtualizado['hora_chegada']);
                            error_log("   - Hora saída após update: " . $clienteAtualizado['hora_saida']);
                        }
                        
                        if (!$success) {
                            resposta(false, null, 'Erro ao executar query', 500);
                            break;
                        }
                        
                        // Verificar se a atualização foi bem-sucedida
                        if ($stmt->rowCount() == 0) {
                            resposta(false, null, 'Cliente não encontrado ou nenhuma alteração realizada', 404);
                            break;
                        }
                        
                        // Se o status for "chegou" e a rota ainda não estiver em andamento, atualizar
                        if ($novoStatus === 'chegou') {
                            $sqlRota = "SELECT status FROM solicitacoes_rotas WHERE id = ?";
                            $stmtRota = $pdo->prepare($sqlRota);
                            $stmtRota->execute([$rotaId]);
                            $rota = $stmtRota->fetch(PDO::FETCH_ASSOC);
                            
                            if ($rota && $rota['status'] === 'aprovada') {
                                $sqlUpdateRota = "UPDATE solicitacoes_rotas SET 
                                                 status = 'em_andamento',
                                                 data_inicio_real = NOW()
                                                 WHERE id = ?";
                                $stmtUpdateRota = $pdo->prepare($sqlUpdateRota);
                                $stmtUpdateRota->execute([$rotaId]);
                                
                                error_log("🔄 Rota $rotaId atualizada para 'em_andamento'");
                            }
                        }
                        
                        // Log final de confirmação
                        error_log("✅ Status do cliente $clienteId atualizado para '$novoStatus'");
                        error_log("✅ Rows affected: " . $stmt->rowCount());
                        
                        resposta(true, null, 'Status do cliente atualizado com sucesso');
                        
                    } catch (Exception $e) {
                        throw $e;
                    }
                    
                } catch (Exception $e) {
                    error_log("Erro ao alterar status do cliente: " . $e->getMessage());
                    resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'testar-rota-12':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Verificar se a rota #12 existe
                    $sql = "SELECT * FROM solicitacoes_rotas WHERE id = 12";
                    $stmt = $pdo->query($sql);
                    $rota = $stmt->fetch(PDO::FETCH_ASSOC);
                    
                    if (!$rota) {
                        resposta(false, null, 'Rota #12 não encontrada na tabela solicitacoes_rotas', 404);
                        break;
                    }
                    
                    // Buscar clientes da rota
                    $sqlClientes = "SELECT * FROM rota_clientes WHERE solicitacao_rota_id = 12";
                    $stmtClientes = $pdo->query($sqlClientes);
                    $clientes = $stmtClientes->fetchAll(PDO::FETCH_ASSOC);
                    
                    resposta(true, [
                        'rota' => $rota,
                        'clientes' => $clientes,
                        'total_clientes' => count($clientes)
                    ], 'Dados da rota #12 encontrados');
                    
                } catch (Exception $e) {
                    error_log("Erro ao testar rota #12: " . $e->getMessage());
                    resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'debug-viagem-186':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Verificar dados específicos da viagem #186
                    $sql = "SELECT 
                                v.id,
                                v.cliente,
                                v.endereco_inicial,
                                v.endereco_final,
                                rv.viagem_id,
                                rv.solicitacao_rota_id,
                                CASE 
                                    WHEN rv.viagem_id IS NOT NULL THEN 'rota'
                                    WHEN v.cliente LIKE '%Teste%' AND (v.endereco_inicial LIKE '%Google%' OR v.endereco_final LIKE '%Google%') THEN 'rota'
                                    WHEN v.endereco_inicial = 'Múltiplos endereços' OR v.endereco_final = 'Múltiplos endereços' THEN 'rota'
                                    WHEN v.cliente = 'Teste 12' THEN 'rota'
                                    ELSE 'viagem'
                                END as tipo_detectado
                            FROM viagens v
                            LEFT JOIN rota_viagens rv ON v.id = rv.viagem_id
                            WHERE v.id = 186 OR v.cliente LIKE '%Teste 12%'";
                    
                    $stmt = $pdo->query($sql);
                    $resultado = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    resposta(true, $resultado, 'Debug da viagem #186 executado');
                    
                } catch (Exception $e) {
                    error_log("Erro no debug da viagem #186: " . $e->getMessage());
                    resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'debug-rotas':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Verificar todas as rotas
                    $sqlRotas = "SELECT * FROM solicitacoes_rotas ORDER BY id DESC LIMIT 10";
                    $stmtRotas = $pdo->query($sqlRotas);
                    $rotas = $stmtRotas->fetchAll(PDO::FETCH_ASSOC);
                    
                    // Verificar rota_viagens
                    $sqlRotaViagens = "SELECT * FROM rota_viagens ORDER BY id DESC LIMIT 10";
                    $stmtRotaViagens = $pdo->query($sqlRotaViagens);
                    $rotaViagens = $stmtRotaViagens->fetchAll(PDO::FETCH_ASSOC);
                    
                    // Verificar viagens
                    $sqlViagens = "SELECT * FROM viagens ORDER BY id DESC LIMIT 10";
                    $stmtViagens = $pdo->query($sqlViagens);
                    $viagens = $stmtViagens->fetchAll(PDO::FETCH_ASSOC);
                    
                    resposta(true, [
                        'rotas' => $rotas,
                        'rota_viagens' => $rotaViagens,
                        'viagens' => $viagens,
                        'total_rotas' => count($rotas),
                        'total_rota_viagens' => count($rotaViagens),
                        'total_viagens' => count($viagens)
                    ], 'Debug das tabelas de rotas');
                    
                } catch (Exception $e) {
                    error_log("Erro no debug de rotas: " . $e->getMessage());
                    resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    // Verificar se a tabela rota_viagens existe
                    $stmt = $pdo->query("SHOW TABLES LIKE 'rota_viagens'");
                    $rotaViagensExists = $stmt->rowCount() > 0;
                    
                    // Verificar dados na tabela se existir
                    $rotaViagensData = [];
                    if ($rotaViagensExists) {
                        $stmt = $pdo->query("SELECT * FROM rota_viagens LIMIT 10");
                        $rotaViagensData = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    }
                    
                    // Verificar viagem específica #186 (Teste 12)
                    $viagemTesteQuery = "SELECT * FROM viagens WHERE id = 186 OR cliente LIKE '%Teste 12%'";
                    $stmt = $pdo->query($viagemTesteQuery);
                    $viagemTeste = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    // Verificar solicitações de rota relacionadas
                    $rotaQuery = "SELECT * FROM solicitacoes_rotas WHERE titulo LIKE '%Teste 12%'";
                    $stmt = $pdo->query($rotaQuery);
                    $rotaData = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
                    $debug = [
                        'rota_viagens_exists' => $rotaViagensExists,
                        'rota_viagens_data' => $rotaViagensData,
                        'viagem_teste_12' => $viagemTeste,
                        'rota_teste_12' => $rotaData,
                        'timestamp' => date('Y-m-d H:i:s')
                    ];
                    
                    resposta(true, $debug, 'Debug de rotas executado com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro no debug de rotas: " . $e->getMessage());
                    resposta(false, null, 'Erro no debug: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

        case 'detalhes-rota-completa':
            $pdo = conectarBanco();
            
            if ($metodo === 'GET') {
                try {
                    $rotaId = $_GET['id'] ?? null;
                    
                    if (!$rotaId) {
                        resposta(false, null, 'ID da rota é obrigatório', 400);
                        break;
                    }
                    
                    // Buscar dados da rota
                    $sqlRota = "
                        SELECT 
                            sr.*,
                            m.nome as motorista_nome,
                            m.matricula as motorista_matricula,
                            v.modelo as veiculo_modelo,
                            v.placa as veiculo_placa,
                            g.nome as gestor_nome
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                        LEFT JOIN motoristas g ON sr.gestor_id = g.id
                        WHERE sr.id = :rotaId
                    ";
                    
                    $stmt = $pdo->prepare($sqlRota);
                    $stmt->execute([':rotaId' => $rotaId]);
                    $rota = $stmt->fetch(PDO::FETCH_ASSOC);
                    
                    if (!$rota) {
                        resposta(false, null, 'Rota não encontrada', 404);
                        break;
                    }
                    
                    // Buscar clientes da rota
                    $sqlClientes = "
                        SELECT 
                            rc.*,
                            CASE 
                                WHEN rc.hora_chegada IS NOT NULL AND rc.hora_saida IS NOT NULL 
                                THEN TIMESTAMPDIFF(SECOND, rc.hora_chegada, rc.hora_saida)
                                ELSE 0
                            END as tempo_real_segundos
                        FROM rota_clientes rc 
                        WHERE rc.solicitacao_rota_id = :rotaId 
                        ORDER BY rc.ordem_sequencia ASC
                    ";
                    
                    $stmtClientes = $pdo->prepare($sqlClientes);
                    $stmtClientes->execute([':rotaId' => $rotaId]);
                    $clientes = $stmtClientes->fetchAll(PDO::FETCH_ASSOC);
                    
                    // Calcular estatísticas
                    $totalClientes = count($clientes);
                    $clientesConcluidos = count(array_filter($clientes, function($c) { return $c['status_atendimento'] === 'concluido'; }));
                    $tempoTotalEstimado = array_sum(array_column($clientes, 'tempo_estimado'));
                    
                    // Calcular tempo real baseado no status da rota
                    $tempoTotalReal = 0;
                    if ($rota['data_inicio_real'] && $rota['data_fim_real']) {
                        // Rota concluída - calcular tempo real
                        $inicio = new DateTime($rota['data_inicio_real']);
                        $fim = new DateTime($rota['data_fim_real']);
                        $diferenca = $inicio->diff($fim);
                        $tempoTotalReal = ($diferenca->h * 60) + $diferenca->i;
                    } else {
                        // Rota em andamento - usar tempo dos clientes concluídos
                        $tempoTotalReal = array_sum(array_column($clientes, 'tempo_real_minutos'));
                    }
                    
                    // Análise de KM - calcular KM planejado baseado na distância entre clientes
                    $kmPlanejado = $rota['km_estimado'] ?? 0;
                    
                    // Se KM planejado estiver zerado, calcular baseado na distância entre clientes
                    if ($kmPlanejado == 0 && count($clientes) >= 2) {
                        // Função para calcular distância entre coordenadas
                        function calcularDistancia($lat1, $lon1, $lat2, $lon2) {
                            $r = 6371; // Raio da Terra em km
                            $dLat = deg2rad($lat2 - $lat1);
                            $dLon = deg2rad($lon2 - $lon1);
                            $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon/2) * sin($dLon/2);
                            $c = 2 * atan2(sqrt($a), sqrt(1-$a));
                            return $r * $c;
                        }
                        
                        $totalKm = 0;
                        for ($i = 0; $i < count($clientes) - 1; $i++) {
                            $cliente1 = $clientes[$i];
                            $cliente2 = $clientes[$i + 1];
                            
                            // Buscar coordenadas dos clientes (se existirem)
                            $stmtCoord = $pdo->prepare("SHOW COLUMNS FROM clientes LIKE 'latitude'");
                            $stmtCoord->execute();
                            $temLatitude = $stmtCoord->fetch();
                            
                            $coord1 = null;
                            $coord2 = null;
                            
                            if ($temLatitude) {
                                // Se a coluna latitude existe, buscar coordenadas
                                $stmtCoord = $pdo->prepare("SELECT latitude, longitude FROM clientes WHERE nome = ?");
                                $stmtCoord->execute([$cliente1['nome_cliente']]);
                                $coord1 = $stmtCoord->fetch();
                                
                                $stmtCoord = $pdo->prepare("SELECT latitude, longitude FROM clientes WHERE nome = ?");
                                $stmtCoord->execute([$cliente2['nome_cliente']]);
                                $coord2 = $stmtCoord->fetch();
                            }
                            
                            if ($coord1 && $coord2 && $coord1['latitude'] && $coord2['latitude']) {
                                $distancia = calcularDistancia(
                                    $coord1['latitude'], $coord1['longitude'],
                                    $coord2['latitude'], $coord2['longitude']
                                );
                                $totalKm += $distancia;
                            } else {
                                // Usar valor padrão se não encontrar coordenadas
                                $totalKm += 5; // 5km padrão entre pontos
                            }
                        }
                        $kmPlanejado = round($totalKm, 2);
                    }
                    
                    // 🔧 CORREÇÃO: Calcular KM REAL (Odômetro) da rota
                    // O odômetro real deve ser: KM Final da última viagem - KM Inicial da primeira viagem
                    $kmReal = 0;
                    $kmOdometro = 0;
                    
                    // Buscar KM inicial e final das viagens da rota
                    $sqlOdometro = "
                        SELECT 
                            MIN(v.odometro_inicial) as km_inicial_rota,
                            MAX(v.odometro_final) as km_final_rota
                        FROM rota_viagens rv 
                        JOIN viagens v ON rv.viagem_id = v.id 
                        WHERE rv.solicitacao_rota_id = :rotaId 
                        AND v.odometro_inicial IS NOT NULL 
                        AND v.odometro_final IS NOT NULL
                        AND v.odometro_inicial > 0 
                        AND v.odometro_final > 0
                    ";
                    
                    $stmtOdometro = $pdo->prepare($sqlOdometro);
                    $stmtOdometro->execute([':rotaId' => $rotaId]);
                    $odometroData = $stmtOdometro->fetch(PDO::FETCH_ASSOC);
                    
                    if ($odometroData && $odometroData['km_inicial_rota'] && $odometroData['km_final_rota']) {
                        $kmReal = $odometroData['km_final_rota'] - $odometroData['km_inicial_rota'];
                        $kmOdometro = $kmReal;
                        
                        // Log para debug
                        error_log("Rota $rotaId: KM Inicial = {$odometroData['km_inicial_rota']}, KM Final = {$odometroData['km_final_rota']}, Odômetro Real = {$kmReal} km");
                    } else {
                        // Fallback: usar valor da tabela (pode estar incorreto)
                        $kmReal = $rota['distancia_odometro_rota'] ?? 0;
                        $kmOdometro = $kmReal;
                        error_log("Rota $rotaId: Fallback - usando distancia_odometro_rota da tabela = {$kmReal} km");
                    }
                    
                    // 🔧 CORREÇÃO: Calcular KM GPS REAL da rota (com filtro de velocidade)
                    // Usar pontos GPS em movimento (velocidade > 0) para cálculo preciso
                    $kmGps = 0;
                    
                    // Calcular distância GPS real ponto a ponto (com filtro de velocidade)
                    $sqlGpsReal = "
                        SELECT ROUND(SUM(
                            (6371 * acos(cos(radians(rtr1.latitude)) * cos(radians(rtr2.latitude)) * 
                             cos(radians(rtr2.longitude) - radians(rtr1.longitude)) + 
                             sin(radians(rtr1.latitude)) * sin(radians(rtr2.latitude))))
                        ), 2) as distancia_total
                        FROM rastreamento_tempo_real rtr1
                        JOIN rastreamento_tempo_real rtr2 ON rtr1.id = rtr2.id - 1 
                            AND rtr1.viagem_id = rtr2.viagem_id
                        JOIN rota_viagens rv ON rtr1.viagem_id = rv.viagem_id
                        WHERE rv.solicitacao_rota_id = :rotaId
                            AND rtr1.velocidade > 0  -- 🔧 FILTRO: Apenas pontos em movimento
                            AND rtr2.velocidade > 0  -- 🔧 FILTRO: Apenas pontos em movimento
                            AND rtr1.latitude IS NOT NULL 
                            AND rtr1.longitude IS NOT NULL
                            AND rtr2.latitude IS NOT NULL 
                            AND rtr2.longitude IS NOT NULL
                            AND rtr1.id < rtr2.id
                    ";
                    
                    $stmtGpsReal = $pdo->prepare($sqlGpsReal);
                    $stmtGpsReal->execute([':rotaId' => $rotaId]);
                    $gpsData = $stmtGpsReal->fetch(PDO::FETCH_ASSOC);
                    
                    if ($gpsData && $gpsData['distancia_total'] > 0) {
                        $kmGps = $gpsData['distancia_total']; // Distância GPS real calculada
                        
                        // Log para debug
                        error_log("Rota $rotaId: KM GPS REAL calculado = {$kmGps} km (com filtro de velocidade)");
                    } else {
                        // Fallback: buscar valores de GPS das viagens (método antigo)
                        $sqlViagens = "SELECT SUM(v.distancia_gps) as total_km_gps, 
                                             SUM(v.odometro_final) as total_km_final,
                                             COUNT(*) as total_viagens
                                      FROM rota_viagens rv 
                                      JOIN viagens v ON rv.viagem_id = v.id 
                                      WHERE rv.solicitacao_rota_id = :rotaId 
                                      AND v.data_fim IS NOT NULL 
                                      AND v.distancia_gps IS NOT NULL 
                                      AND v.distancia_gps > 0";
                        $stmtViagens = $pdo->prepare($sqlViagens);
                        $stmtViagens->execute([':rotaId' => $rotaId]);
                        $viagensData = $stmtViagens->fetch(PDO::FETCH_ASSOC);
                        
                        if ($viagensData && $viagensData['total_km_gps'] > 0) {
                            $kmGps = $viagensData['total_km_gps']; // Soma de todas as viagens
                            $kmOdometro = $viagensData['total_km_final'] ?? $kmReal ?? 0;
                            
                            // Se KM real (odômetro) estiver zerado, usar o valor do odômetro das viagens
                            if ($kmReal == 0) {
                                $kmReal = $kmOdometro;
                            }
                            
                            // Log para debug
                            error_log("Rota $rotaId: Fallback - Total KM GPS = {$kmGps} de {$viagensData['total_viagens']} viagens");
                        }
                    }
                    
                    // 🔧 CORREÇÃO: km_gps agora está em QUILÔMETROS (cálculo real)
                    $kmGpsKm = $kmGps;
                    
                    // 🔧 CORREÇÃO: Calcular diferença CORRETA (Odômetro vs GPS)
                    // A diferença deve ser entre o que o odômetro marcou e o que o GPS calculou
                    $kmOdometroCalculado = $kmReal; // Valor do odômetro da rota
                    $diferencaOdometroGps = $kmOdometroCalculado - $kmGpsKm; // Odômetro - GPS
                    $percentualDiferencaOdometro = $kmOdometroCalculado > 0 ? round(($diferencaOdometroGps / $kmOdometroCalculado) * 100, 2) : 0;
                    
                    // 🔧 CORREÇÃO: Manter também a diferença GPS vs Planejado (para análise)
                    $diferencaGpsPlanejado = $kmGpsKm - $kmPlanejado; // GPS - Planejado
                    $percentualDiferencaGps = $kmPlanejado > 0 ? round(($diferencaGpsPlanejado / $kmPlanejado) * 100, 2) : 0;
                    
                    // Log para debug
                    error_log("Rota $rotaId: KM Planejado = $kmPlanejado, KM GPS = {$kmGpsKm}, KM Odômetro = {$kmOdometroCalculado}");
                    error_log("Rota $rotaId: Diferença Odômetro-GPS = {$diferencaOdometroGps} km ({$percentualDiferencaOdometro}%)");
                    error_log("Rota $rotaId: Diferença GPS-Planejado = {$diferencaGpsPlanejado} km ({$percentualDiferencaGps}%)");
                    
                    // Processar clientes para adicionar tempo_real_minutos
                    $clientesProcessados = array_map(function($cliente) {
                        $tempoRealSegundos = $cliente['tempo_real_segundos'] ?? 0;
                        $tempoRealMinutos = round($tempoRealSegundos / 60, 1); // Arredondar para 1 casa decimal
                        
                        return array_merge($cliente, [
                            'tempo_real_minutos' => $tempoRealMinutos,
                            'tempo_real_segundos' => $tempoRealSegundos
                        ]);
                    }, $clientes);
                    
                    $resultado = [
                        'rota' => $rota,
                        'clientes' => $clientesProcessados,
                        'estatisticas' => [
                            'total_clientes' => $totalClientes,
                            'clientes_concluidos' => $clientesConcluidos,
                            'tempo_estimado_minutos' => $tempoTotalEstimado,
                            'tempo_real_minutos' => $tempoTotalReal,
                            'km_planejado' => $kmPlanejado,
                            'distancia_odometro_rota' => $kmReal, // Odômetro (diferença entre km inicial e final)
                            'km_gps' => $kmGps,   // GPS real (distância calculada pelos pontos GPS)
                            'km_odometro' => $kmOdometro, // Valor explícito do odômetro
                            // 🔧 NOVOS CAMPOS: Diferenças corretas
                            'diferenca_odometro_gps' => $diferencaOdometroGps, // Odômetro - GPS (PRINCIPAL)
                            'percentual_diferenca_odometro' => $percentualDiferencaOdometro, // % da diferença principal
                            'diferenca_gps_planejado' => $diferencaGpsPlanejado, // GPS - Planejado (secundário)
                            'percentual_diferenca_gps' => $percentualDiferencaGps, // % da diferença secundária
                            // 🔧 CAMPOS LEGADOS (manter compatibilidade)
                            'diferenca_km' => $diferencaOdometroGps, // Alias para diferença principal
                            'percentual_diferenca' => $percentualDiferencaOdometro // Alias para percentual principal
                        ]
                    ];
                    
                    resposta(true, $resultado, 'Detalhes da rota carregados com sucesso');
                    
                } catch (Exception $e) {
                    error_log("Erro ao buscar detalhes da rota: " . $e->getMessage());
                    resposta(false, null, 'Erro ao carregar detalhes da rota: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;

    case 'detalhes-rota-execucao':
        // Headers para evitar cache
        header('Cache-Control: no-cache, no-store, must-revalidate');
        header('Pragma: no-cache');
        header('Expires: 0');
        
        $pdo = conectarBanco();
        if ($metodo === 'GET') {
            try {
                $rotaId = $_GET['id'] ?? null;
                if (!$rotaId) {
                    resposta(false, null, 'ID da rota é obrigatório', 400);
                    break;
                }
                
                // Buscar dados da rota
                $sqlRota = "
                    SELECT sr.*, 
                           m.nome as motorista_nome, 
                           m.matricula as motorista_matricula,
                           v.modelo as veiculo_modelo, 
                           v.placa as veiculo_placa,
                           CONCAT(v.modelo, ' - ', v.placa) as veiculo_info,
                           DATE_FORMAT(sr.data_prevista, '%d/%m/%Y') as data_inicio,
                           TIME_FORMAT(sr.hora_inicio_prevista, '%H:%i') as hora_inicio
                    FROM solicitacoes_rotas sr
                    LEFT JOIN motoristas m ON sr.motorista_id = m.id  
                    LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                    WHERE sr.id = :rotaId
                ";
                
                $stmtRota = $pdo->prepare($sqlRota);
                $stmtRota->execute([':rotaId' => $rotaId]);
                $rota = $stmtRota->fetch(PDO::FETCH_ASSOC);
                
                if (!$rota) {
                    resposta(false, null, 'Rota não encontrada', 404);
                    break;
                }
                
                // Buscar clientes da rota (com cache-busting)
                $sqlClientes = "
                    SELECT rc.*, 
                           COALESCE(c.nome, rc.nome_cliente, CONCAT('Cliente ', rc.ordem_sequencia)) as nome_cliente, 
                           COALESCE(c.endereco, rc.endereco, '') as endereco, 
                           COALESCE(c.telefone, rc.telefone, '') as telefone,
                           COALESCE(TIME_FORMAT(rc.hora_chegada, '%H:%i'), '') as hora_chegada_formatada,
                           COALESCE(TIME_FORMAT(rc.hora_saida, '%H:%i'), '') as hora_saida_formatada,
                           CASE 
                               WHEN rc.hora_chegada IS NOT NULL AND rc.hora_saida IS NOT NULL 
                               THEN TIMESTAMPDIFF(MINUTE, rc.hora_chegada, rc.hora_saida)
                               ELSE 0 
                           END as tempo_real_minutos
                    FROM rota_clientes rc
                    LEFT JOIN clientes c ON rc.cliente_id = c.id
                    WHERE rc.solicitacao_rota_id = :rotaId
                    ORDER BY rc.ordem_sequencia
                ";
                
                $stmtClientes = $pdo->prepare($sqlClientes);
                $stmtClientes->execute([':rotaId' => $rotaId]);
                $clientes = $stmtClientes->fetchAll(PDO::FETCH_ASSOC);
                
                // Debug dos clientes
                error_log("🔍 Debug clientes da rota $rotaId:");
                error_log("📊 SQL: " . $sqlClientes);
                error_log("👥 Clientes encontrados: " . count($clientes));
                foreach ($clientes as $i => $cliente) {
                    error_log("🧑 Cliente $i: " . json_encode($cliente));
                }
                
                // Log adicional para verificar se os dados estão atualizados
                error_log("🕐 Timestamp da consulta: " . date('Y-m-d H:i:s'));
                
                // 🔧 CORREÇÃO: Buscar IDs das viagens da rota
                $sqlViagens = "SELECT viagem_id FROM rota_viagens WHERE solicitacao_rota_id = :rotaId";
                $stmtViagens = $pdo->prepare($sqlViagens);
                $stmtViagens->execute([':rotaId' => $rotaId]);
                $viagensIds = $stmtViagens->fetchAll(PDO::FETCH_COLUMN);
                
                error_log("🔍 Viagens encontradas para rota $rotaId: " . json_encode($viagensIds));
                
                // Formatear dados para o app
                $resultado = [
                    'id' => (int)$rota['id'],
                    'titulo' => $rota['titulo'],
                    'descricao' => $rota['descricao'],
                    'motorista_nome' => $rota['motorista_nome'] ?: 'Motorista',
                    'veiculo_info' => $rota['veiculo_info'] ?: 'Veículo',
                    'veiculo_id' => (int)($rota['veiculo_id'] ?: 0),
                    'km_estimado' => (int)($rota['km_estimado'] ?: 0),
                    'status' => $rota['status'],
                    'data_inicio' => $rota['data_inicio'],
                    'hora_inicio' => $rota['hora_inicio'],
                    'viagens_criadas' => $viagensIds, // 🔧 ADICIONADO: IDs das viagens
                    'clientes' => array_map(function($cliente) {
                        return [
                            'id' => (int)$cliente['id'],
                            'nome_cliente' => $cliente['nome_cliente'],
                            'endereco' => $cliente['endereco'] ?: '',
                            'telefone' => $cliente['telefone'] ?: '',
                            'motivo_atendimento' => $cliente['motivo_atendimento'],
                            'ordem_sequencia' => (int)$cliente['ordem_sequencia'],
                            'tempo_estimado' => (int)($cliente['tempo_estimado'] ?: 60),
                            'tempo_real_minutos' => (int)($cliente['tempo_real_minutos'] ?: 0),
                            'status_atendimento' => $cliente['status_atendimento'] ?: 'pendente',
                            'hora_chegada' => $cliente['hora_chegada_formatada'] ?: '',
                            'hora_saida' => $cliente['hora_saida_formatada'] ?: ''
                        ];
                    }, $clientes)
                ];
                
                resposta(true, $resultado, 'Detalhes da rota para execução carregados com sucesso');
            } catch (Exception $e) {
                error_log("Erro ao buscar detalhes da rota para execução: " . $e->getMessage());
                resposta(false, null, 'Erro ao carregar detalhes da rota: ' . $e->getMessage(), 500);
            }
        } else {
            resposta(false, null, 'Método não permitido', 405);
        }
        break;

    case 'iniciar-rota-execucao':
        $pdo = conectarBanco();
        if ($metodo === 'POST') {
            try {
                $input = json_decode(file_get_contents('php://input'), true);
                $rotaId = $input['rota_id'] ?? null;
                $motoristaId = $input['motorista_id'] ?? null;
                $veiculoId = $input['veiculo_id'] ?? null;
                $latitudeInicial = $input['latitude_inicial'] ?? null;
                $longitudeInicial = $input['longitude_inicial'] ?? null;
                $kmInicial = $input['odometro_inicial'] ?? null;
                
                // ✅ DEBUG: Log do odômetro inicial recebido
                error_log("🔍 DEBUG ODÔMETRO INICIAL:");
                error_log("   - Valor recebido: " . ($kmInicial ?? 'NULL'));
                error_log("   - Tipo: " . gettype($kmInicial));
                error_log("   - Input completo: " . json_encode($input));
                
                if (!$rotaId) {
                    resposta(false, null, 'ID da rota é obrigatório', 400);
                    break;
                }
                
                // Verificar se a rota existe e está aprovada
                $sqlRota = "SELECT * FROM solicitacoes_rotas WHERE id = ? AND status = 'aprovada'";
                $stmtRota = $pdo->prepare($sqlRota);
                $stmtRota->execute([$rotaId]);
                $rota = $stmtRota->fetch(PDO::FETCH_ASSOC);
                
                if (!$rota) {
                    resposta(false, null, 'Rota não encontrada ou não está aprovada', 404);
                    break;
                }
                
                // Buscar clientes da rota
                $sqlClientes = "SELECT * FROM rota_clientes WHERE solicitacao_rota_id = ? ORDER BY ordem_sequencia";
                $stmtClientes = $pdo->prepare($sqlClientes);
                $stmtClientes->execute([$rotaId]);
                $clientes = $stmtClientes->fetchAll(PDO::FETCH_ASSOC);
                
                if (empty($clientes)) {
                    resposta(false, null, 'Nenhum cliente encontrado para esta rota', 404);
                    break;
                }
                
                // Iniciar transação
                $pdo->beginTransaction();
                
                try {
                                    // 1. Atualizar status da rota para "em_execucao" (valor correto do ENUM)
                $sqlUpdateRota = "UPDATE solicitacoes_rotas SET 
                                 status = 'em_execucao',
                                 data_inicio_real = COALESCE(data_inicio_real, NOW()),
                                 updated_at = NOW()
                                 WHERE id = ?";
                $stmtUpdateRota = $pdo->prepare($sqlUpdateRota);
                $resultUpdate = $stmtUpdateRota->execute([$rotaId]);
                
                // Log para debug
                error_log("🔄 Atualizando rota $rotaId - Result: " . ($resultUpdate ? 'SUCCESS' : 'FAILED') . " - Rows: " . $stmtUpdateRota->rowCount());
                
                // Verificar se a atualização funcionou
                if (!$resultUpdate || $stmtUpdateRota->rowCount() == 0) {
                    error_log("❌ Falha ao atualizar status da rota $rotaId");
                    throw new Exception("Falha ao atualizar status da rota");
                }
                    
                    // 2. Criar viagens para cada cliente
                    $viagensCriadas = [];
                    $enderecoAnterior = $latitudeInicial && $longitudeInicial ? 
                        geocodificar($latitudeInicial, $longitudeInicial) : 'Local inicial';
                    
                    foreach ($clientes as $i => $cliente) {
                        // Criar viagem para este cliente
                        $sqlViagem = "INSERT INTO viagens (
                            tecnico_id, veiculo_id, cliente, motivo, 
                            odometro_inicial, odometro_final, data_inicio, 
                            latitude_inicial, longitude_inicial,
                            endereco_inicial, endereco_final,
                            cliente_id, observacoes, sincronizado
                        ) VALUES (?, ?, ?, ?, ?, ?, NOW(), ?, ?, ?, ?, ?, ?, 0)";
                        
                        $stmtViagem = $pdo->prepare($sqlViagem);
                        // ✅ CORREÇÃO: Usar valor correto do odômetro inicial
                        $odometroInicialParaSalvar = $kmInicial !== null ? intval($kmInicial) : 0;
                        error_log("💾 Salvando viagem com odômetro inicial: $odometroInicialParaSalvar");
                        
                        $stmtViagem->execute([
                            $motoristaId ?: $rota['motorista_id'],
                            $veiculoId ?: $rota['veiculo_id'],
                            $cliente['nome_cliente'] ?: "Cliente {$cliente['ordem_sequencia']}",
                            $cliente['motivo_atendimento'] ?: 'Visita',
                            $odometroInicialParaSalvar, // odometro_inicial
                            0, // odometro_final
                            $latitudeInicial ?: 0,
                            $longitudeInicial ?: 0,
                            $enderecoAnterior,
                            $cliente['endereco'] ?: 'Endereço do cliente',
                            $cliente['cliente_id'] ?: null,
                            "Viagem da rota #$rotaId - Cliente {$cliente['ordem_sequencia']}"
                        ]);
                        
                        $viagemId = $pdo->lastInsertId();
                        $viagensCriadas[] = $viagemId;
                        
                        // ✅ VERIFICAÇÃO: Confirmar se foi salvo corretamente
                        $stmtCheck = $pdo->prepare("SELECT odometro_inicial FROM viagens WHERE id = ?");
                        $stmtCheck->execute([$viagemId]);
                        $viagemSalva = $stmtCheck->fetch();
                        error_log("✅ Viagem $viagemId salva com odômetro inicial: " . $viagemSalva['odometro_inicial']);
                        
                        // Criar registro na tabela rota_viagens
                        $sqlRotaViagem = "INSERT INTO rota_viagens (
                            solicitacao_rota_id, viagem_id, rota_cliente_id, ordem_execucao
                        ) VALUES (?, ?, ?, ?)";
                        
                        $stmtRotaViagem = $pdo->prepare($sqlRotaViagem);
                        $stmtRotaViagem->execute([
                            $rotaId,
                            $viagemId,
                            $cliente['id'],
                            $cliente['ordem_sequencia']
                        ]);
                        
                        // Atualizar endereço anterior para próxima iteração
                        $enderecoAnterior = $cliente['endereco'] ?: 'Endereço do cliente';
                    }
                    
                    // Commit da transação
                    $pdo->commit();
                    
                    resposta(true, [
                        'rota_id' => $rotaId,
                        'status' => 'em_andamento',
                        'viagens_criadas' => $viagensCriadas,
                        'total_clientes' => count($clientes),
                        'data_inicio' => date('Y-m-d H:i:s')
                    ], 'Rota iniciada com sucesso');
                    
                } catch (Exception $e) {
                    $pdo->rollBack();
                    throw $e;
                }
                
            } catch (Exception $e) {
                error_log("Erro ao iniciar rota: " . $e->getMessage());
                resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
            }
        } else {
            resposta(false, null, 'Método não permitido', 405);
        }
                break;
        

        
    case 'finalizar-rota-execucao':
        $pdo = conectarBanco();
        if ($metodo === 'POST') {
            try {
                $input = json_decode(file_get_contents('php://input'), true);
                $rotaId = $input['rota_id'] ?? null;
                $kmReal = $input['distancia_odometro_rota'] ?? null;
                $observacoes = $input['observacoes_finais'] ?? '';
                $dataFim = $input['data_fim'] ?? date('Y-m-d H:i:s');
                
                // ✅ NOVO: Capturar dados do GPS enviados automaticamente
                $distanciaGpsKm = $input['distancia_gps_km'] ?? null;
                $distanciaGpsMetros = $input['distancia_gps_metros'] ?? null;
                
                error_log("📊 GPS recebido - KM: $distanciaGpsKm, Metros: $distanciaGpsMetros");
                
                if (!$rotaId) {
                    resposta(false, null, 'ID da rota é obrigatório', 400);
                    break;
                }
                
                // Calcular diferença de KM se informado
                $diferencaKm = null;
                $justificativaKm = '';
                
                if ($kmReal) {
                    $sqlRota = "SELECT km_estimado FROM solicitacoes_rotas WHERE id = ?";
                    $stmtRota = $pdo->prepare($sqlRota);
                    $stmtRota->execute([$rotaId]);
                    $rota = $stmtRota->fetch(PDO::FETCH_ASSOC);
                    
                    if ($rota && $rota['km_estimado']) {
                        $diferencaKm = $kmReal - $rota['km_estimado'];
                        
                        // Se diferença > 15% ou > 5km, solicitar justificativa futuramente
                        $percentual = abs($diferencaKm) / $rota['km_estimado'] * 100;
                        if ($percentual > 15 || abs($diferencaKm) > 5) {
                            $justificativaKm = $input['justificativa_km'] ?? 'Diferença significativa detectada';
                        }
                    }
                }
                
                // ✅ CORREÇÃO: Usar campo existente e incluir GPS nas observações
                $observacoesComGps = $observacoes;
                if ($distanciaGpsKm > 0) {
                    $observacoesComGps .= ($observacoes ? ' | ' : '') . "GPS: {$distanciaGpsKm} km";
                }
                
                // Atualizar rota como concluída
                $sql = "UPDATE solicitacoes_rotas SET 
                        status = 'concluida',
                        distancia_odometro_rota = ?,
                        diferenca_km_calculada = ?,
                        justificativa_km = ?,
                        observacoes_finais = ?,
                        data_fim_real = ?,
                        data_inicio_real = COALESCE(data_inicio_real, NOW())
                        WHERE id = ?";
                
                error_log("🔄 Finalizando rota $rotaId com SQL: $sql");
                error_log("📊 Parâmetros: kmReal=$kmReal, gpsKm=$distanciaGpsKm, diferencaKm=$diferencaKm, observacoes=$observacoesComGps, dataFim=$dataFim");
                
                $stmt = $pdo->prepare($sql);
                $success = $stmt->execute([
                    $kmReal,
                    $diferencaKm,
                    $justificativaKm,
                    $observacoesComGps, // ✅ NOVO: Incluir GPS nas observações
                    $dataFim,
                    $rotaId
                ]);
                
                error_log("✅ Resultado da atualização: success=$success, rowCount=" . $stmt->rowCount());
                
                if ($success && $stmt->rowCount() > 0) {
                    // ATUALIZAR TODAS AS VIAGENS DA ROTA
                    $sqlViagens = "UPDATE viagens SET 
                                   odometro_final = ?,
                                   distancia_gps = ?,
                                   data_fim = ?,
                                   observacoes = CONCAT(COALESCE(observacoes, ''), ' | GPS: ', ?, ' km | ', ?)
                                   WHERE id IN (
                                       SELECT rv.viagem_id 
                                       FROM rota_viagens rv 
                                       WHERE rv.solicitacao_rota_id = ?
                                   )";
                    
                    error_log("🔄 Atualizando viagens da rota $rotaId");
                    
                    // Calcular KM GPS baseado nos pontos salvos de cada viagem
                    $sqlViagensRota = "SELECT v.id, v.trajeto FROM viagens v 
                                      INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                                      WHERE rv.solicitacao_rota_id = ?";
                    $stmtViagensRota = $pdo->prepare($sqlViagensRota);
                    $stmtViagensRota->execute([$rotaId]);
                    $viagensRota = $stmtViagensRota->fetchAll(PDO::FETCH_ASSOC);
                    
                    $kmGpsTotal = 0;
                    foreach ($viagensRota as $viagemRota) {
                        if ($viagemRota['trajeto']) {
                            $pontos = json_decode($viagemRota['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])) {
                                        // 🔧 CORREÇÃO: Calcular distância usando Haversine em METROS
                                        $R = 6371000; // Raio da Terra em METROS (não 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; // Distância em METROS
                                        $distanciaViagem += $distancia;
                                    }
                                }
                                $kmGpsTotal += $distanciaViagem / 1000; // 🔧 CORREÇÃO: Converter metros para km
                            }
                        }
                    }
                    
                    // Se não conseguiu calcular KM GPS, calcular baseado na diferença entre KM inicial e final
                    if ($kmGpsTotal <= 0) {
                        // Buscar KM inicial das viagens
                        $sqlKmInicial = "SELECT MIN(v.odometro_inicial) as odometro_inicial FROM viagens v 
                                        INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                                        WHERE rv.solicitacao_rota_id = ?";
                        $stmtKmInicial = $pdo->prepare($sqlKmInicial);
                        $stmtKmInicial->execute([$rotaId]);
                        $kmInicialData = $stmtKmInicial->fetch(PDO::FETCH_ASSOC);
                        
                        if ($kmInicialData && $kmInicialData['odometro_inicial']) {
                            $kmGpsTotal = $kmReal - $kmInicialData['odometro_inicial'];
                            error_log("🔄 KM GPS calculado por diferença: $kmReal - {$kmInicialData['odometro_inicial']} = $kmGpsTotal km");
                        } else {
                            $kmGpsTotal = $kmReal; // Fallback
                            error_log("🔄 KM GPS usando fallback: $kmReal km");
                        }
                    }
                    
                    error_log("🔄 KM GPS calculado para rota $rotaId: $kmGpsTotal km (convertido de metros)");
                    
                    $stmtViagens = $pdo->prepare($sqlViagens);
                    $successViagens = $stmtViagens->execute([
                        $kmReal,
                        $distanciaGpsKm !== null ? $distanciaGpsKm : $kmGpsTotal, // 🔧 CORREÇÃO: Usar GPS em KM do app (mesmo se for 0)
                        $dataFim,
                        $distanciaGpsKm !== null ? $distanciaGpsKm : $kmGpsTotal, // 🔧 CORREÇÃO: GPS em KM para as observações (mesmo se for 0)
                        $observacoes,
                        $rotaId
                    ]);
                    
                    error_log("✅ Viagens atualizadas: success=$successViagens, rowCount=" . $stmtViagens->rowCount());
                    
                    // LIBERAR VEÍCULO AUTOMATICAMENTE APÓS FINALIZAR ROTA
                    $sqlVeiculo = "SELECT veiculo_id FROM solicitacoes_rotas WHERE id = ?";
                    $stmtVeiculo = $pdo->prepare($sqlVeiculo);
                    $stmtVeiculo->execute([$rotaId]);
                    $rotaInfo = $stmtVeiculo->fetch(PDO::FETCH_ASSOC);
                    
                    if ($rotaInfo && $rotaInfo['veiculo_id']) {
                        $veiculoId = $rotaInfo['veiculo_id'];
                        $sqlLiberarVeiculo = "UPDATE veiculos SET status = 'ativo', updated_at = NOW() WHERE id = ?";
                        $stmtLiberarVeiculo = $pdo->prepare($sqlLiberarVeiculo);
                        $stmtLiberarVeiculo->execute([$veiculoId]);
                        
                        error_log("🚗 Veículo $veiculoId liberado automaticamente após finalizar rota $rotaId");
                    }
                    
                    resposta(true, [
                        'rota_id' => $rotaId,
                        'distancia_odometro_rota' => $kmReal,
                        'diferenca_km' => $diferencaKm,
                        'status' => 'concluida',
                        'viagens_atualizadas' => $stmtViagens->rowCount(),
                        'veiculo_liberado' => $rotaInfo['veiculo_id'] ?? null
                    ], 'Rota finalizada com sucesso e veículo liberado automaticamente');
                } else {
                    resposta(false, null, 'Falha ao finalizar rota ou rota não encontrada', 400);
                }
                
            } catch (Exception $e) {
                error_log("Erro ao finalizar rota: " . $e->getMessage());
                resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
            }
        } else {
            resposta(false, null, 'Método não permitido', 405);
        }
        break;

    case 'liberar-veiculo':
        $pdo = conectarBanco();
        if ($metodo === 'POST') {
            try {
                $input = json_decode(file_get_contents('php://input'), true);
                $veiculoId = $input['veiculo_id'] ?? null;
                $rotaId = $input['rota_id'] ?? null;
                
                if (!$veiculoId) {
                    resposta(false, null, 'ID do veículo é obrigatório', 400);
                    break;
                }
                
                // Verificar se o veículo está em uso
                $stmt = $pdo->prepare("
                    SELECT v.id, v.modelo, v.placa, sr.id as rota_id, sr.titulo
                    FROM veiculos v
                    LEFT JOIN solicitacoes_rotas sr ON v.id = sr.veiculo_id 
                    AND sr.status IN ('em_andamento', 'em_execucao')
                    WHERE v.id = ?
                ");
                $stmt->execute([$veiculoId]);
                $veiculo = $stmt->fetch(PDO::FETCH_ASSOC);
                
                if (!$veiculo) {
                    resposta(false, null, 'Veículo não encontrado', 404);
                    break;
                }
                
                if ($veiculo['rota_id'] && $veiculo['rota_id'] != $rotaId) {
                    resposta(false, null, 'Veículo está sendo usado em outra rota', 400);
                    break;
                }
                
                // Atualizar status do veículo para disponível
                $stmt = $pdo->prepare("UPDATE veiculos SET status = 'ativo', updated_at = NOW() WHERE id = ?");
                $success = $stmt->execute([$veiculoId]);
                
                if ($success) {
                    error_log("✅ Veículo $veiculoId liberado com sucesso");
                    resposta(true, [
                        'veiculo_id' => $veiculoId,
                        'modelo' => $veiculo['modelo'],
                        'placa' => $veiculo['placa'],
                        'status' => 'ativo'
                    ], 'Veículo liberado com sucesso');
                } else {
                    resposta(false, null, 'Falha ao liberar veículo', 500);
                }
                
            } catch (Exception $e) {
                error_log("Erro ao liberar veículo: " . $e->getMessage());
                resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
            }
        } else {
            resposta(false, null, 'Método não permitido', 405);
        }
        break;

            case 'verificar-viagem-em-andamento':
            $pdo = conectarBanco();
            if ($metodo === 'GET') {
                try {
                    $tecnicoId = $_GET['tecnico_id'] ?? null;
                    error_log("🔍 [DEBUG] verificar-viagem-em-andamento - tecnicoId: " . $tecnicoId);
                    
                    if (!$tecnicoId) {
                        resposta(false, null, 'ID do técnico é obrigatório', 400);
                        break;
                    }
                    
                                    // Se o técnico_id for "admin", buscar por motorista_id correto
                if ($tecnicoId === 'admin') {
                    error_log("🔍 [DEBUG] verificar-viagem-em-andamento - Admin detectado, buscando ID do admin");
                    
                    // Primeiro, buscar o ID do motorista admin
                    $sqlAdmin = "SELECT id FROM motoristas WHERE usuario = 'admin' LIMIT 1";
                    $stmtAdmin = $pdo->prepare($sqlAdmin);
                    $stmtAdmin->execute();
                    $adminResult = $stmtAdmin->fetch(PDO::FETCH_ASSOC);
                    
                    if ($adminResult) {
                        $adminId = $adminResult['id'];
                        error_log("🔍 [DEBUG] verificar-viagem-em-andamento - Admin ID encontrado: " . $adminId);
                        
                        $sql = "SELECT v.* FROM viagens v
                               INNER JOIN rota_viagens rv ON v.id = rv.viagem_id
                               INNER JOIN solicitacoes_rotas sr ON rv.solicitacao_rota_id = sr.id
                               WHERE sr.motorista_id = ? AND v.data_fim IS NULL
                               ORDER BY v.data_inicio DESC LIMIT 1";
                        $stmt = $pdo->prepare($sql);
                        $stmt->execute([$adminId]);
                        error_log("🔍 [DEBUG] verificar-viagem-em-andamento - SQL executado para admin ID $adminId");
                    } else {
                        error_log("🔍 [DEBUG] verificar-viagem-em-andamento - Admin não encontrado na tabela motoristas");
                        $viagem = null;
                    }
                    } else {
                        // Buscar viagem em andamento por tecnico_id
                        $sql = "SELECT * FROM viagens WHERE tecnico_id = ? AND data_fim IS NULL ORDER BY data_inicio DESC LIMIT 1";
                        $stmt = $pdo->prepare($sql);
                        $stmt->execute([$tecnicoId]);
                    }
                    
                    $viagem = $stmt->fetch(PDO::FETCH_ASSOC);
                    
                    if ($viagem) {
                        resposta(true, $viagem, 'Viagem em andamento encontrada');
                    } else {
                        resposta(true, null, 'Nenhuma viagem em andamento encontrada');
                    }
                } catch (Exception $e) {
                    resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
                }
            } else {
                resposta(false, null, 'Método não permitido', 405);
            }
            break;
        
    case 'verificar-rota-em-andamento':
        $pdo = conectarBanco();
        if ($metodo === 'GET') {
            try {
                $tecnicoId = $_GET['tecnico_id'] ?? null;
                error_log("🔍 [DEBUG] verificar-rota-em-andamento - tecnicoId: " . $tecnicoId);
                
                if (!$tecnicoId) {
                    resposta(false, null, 'ID do técnico é obrigatório', 400);
                    break;
                }
                
                // Buscar rota em andamento para o técnico
                if ($tecnicoId === 'admin') {
                    error_log("🔍 [DEBUG] Admin detectado, buscando ID do admin");
                    
                    // Primeiro, buscar o ID do motorista admin
                    $sqlAdmin = "SELECT id FROM motoristas WHERE usuario = 'admin' LIMIT 1";
                    $stmtAdmin = $pdo->prepare($sqlAdmin);
                    $stmtAdmin->execute();
                    $adminResult = $stmtAdmin->fetch(PDO::FETCH_ASSOC);
                    
                    if ($adminResult) {
                        $adminId = $adminResult['id'];
                        error_log("🔍 [DEBUG] Admin ID encontrado: " . $adminId);
                        
                        // Buscar rotas do admin usando o ID correto
                        $sql = "SELECT sr.*, 
                               m.nome as motorista_nome, 
                               v.modelo as veiculo_modelo, 
                               v.placa as veiculo_placa
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                        WHERE sr.motorista_id = ? 
                        AND sr.status IN ('em_andamento', 'em_execucao')
                        ORDER BY sr.data_inicio_real DESC 
                        LIMIT 1";
                        
                        error_log("🔍 [DEBUG] SQL para admin ID $adminId: " . $sql);
                        $stmt = $pdo->prepare($sql);
                        $stmt->execute([$adminId]);
                        error_log("🔍 [DEBUG] SQL executado para admin ID $adminId");
                    } else {
                        error_log("🔍 [DEBUG] Admin não encontrado na tabela motoristas");
                        $rota = null;
                    }
                } else {
                    // Primeiro, buscar viagens em andamento do técnico
                    $sqlViagens = "SELECT DISTINCT rv.solicitacao_rota_id 
                                  FROM viagens v 
                                  INNER JOIN rota_viagens rv ON v.id = rv.viagem_id 
                                  WHERE v.tecnico_id = ? AND v.data_fim IS NULL";
                    
                    $stmtViagens = $pdo->prepare($sqlViagens);
                    $stmtViagens->execute([$tecnicoId]);
                    $rotasIds = $stmtViagens->fetchAll(PDO::FETCH_COLUMN);
                    
                    error_log("🔍 [DEBUG] Rotas IDs encontradas para técnico $tecnicoId: " . implode(', ', $rotasIds));
                    
                    if (empty($rotasIds)) {
                        // 🔧 CORREÇÃO: Se não encontrar viagens vinculadas, buscar diretamente rotas do técnico
                        $sqlDireto = "SELECT sr.*, 
                                     m.nome as motorista_nome, 
                                     v.modelo as veiculo_modelo, 
                                     v.placa as veiculo_placa
                              FROM solicitacoes_rotas sr
                              LEFT JOIN motoristas m ON sr.motorista_id = m.id
                              LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                              WHERE sr.motorista_id = ? 
                              AND sr.status IN ('em_andamento', 'em_execucao')
                              ORDER BY sr.data_inicio_real DESC 
                              LIMIT 1";
                        
                        $stmt = $pdo->prepare($sqlDireto);
                        $stmt->execute([$tecnicoId]);
                        error_log("🔍 [DEBUG] Buscando rota diretamente para técnico $tecnicoId");
                    } else {
                        // Buscar detalhes das rotas encontradas
                        $placeholders = str_repeat('?,', count($rotasIds) - 1) . '?';
                        $sql = "SELECT sr.*, 
                               m.nome as motorista_nome, 
                               v.modelo as veiculo_modelo, 
                               v.placa as veiculo_placa
                        FROM solicitacoes_rotas sr
                        LEFT JOIN motoristas m ON sr.motorista_id = m.id
                        LEFT JOIN veiculos v ON sr.veiculo_id = v.id
                        WHERE sr.id IN ($placeholders) 
                        AND sr.status IN ('em_andamento', 'em_execucao')
                        ORDER BY sr.data_inicio_real DESC 
                        LIMIT 1";
                        
                        $stmt = $pdo->prepare($sql);
                        $stmt->execute($rotasIds);
                        error_log("🔍 [DEBUG] Buscando rotas por IDs: " . implode(', ', $rotasIds));
                    }
                }
                $rota = $stmt->fetch(PDO::FETCH_ASSOC);
                error_log("🔍 [DEBUG] Resultado da busca: " . ($rota ? "Rota encontrada - ID: " . $rota['id'] : "Nenhuma rota encontrada"));
                
                if ($rota) {
                    resposta(true, $rota, 'Rota em andamento encontrada');
                } else {
                    resposta(true, null, 'Nenhuma rota em andamento encontrada');
                }
            } catch (Exception $e) {
                resposta(false, null, 'Erro: ' . $e->getMessage(), 500);
            }
        } else {
            resposta(false, null, 'Método não permitido', 405);
        }
        break;

    default:
        resposta(false, null, 'Endpoint não encontrado', 404);
    }
    
} catch (Exception $e) {
    resposta(false, null, 'Erro interno: ' . $e->getMessage(), 500);
}
?> 

