# 🎯 Filtros Avançados + 3 Consultas Específicas - Mercado Live

## ✨ Implementação Completa

O componente `MercadoLiveComponent` foi **completamente atualizado** com:

### 🚛 **1. Lógica das 3 Consultas Específicas** (Implementado)
- **3 consultas simultâneas** ao servidor usando `forkJoin`:
  - `first_mile` → Mapeamento específico para FirstMileRoute
  - `line_haul` → Mapeamento específico para LineHaulRoute  
  - `last_mile` → Mapeamento específico para LastMileRoute
- **Unificação**: Todos os resultados em uma única lista
- **Ordenação**: Por quantidade de pacotes (decrescente)
- **Paginação client-side**: Performance otimizada

### 🔍 **2. Filtros Avançados** (Substitui "Filtros de Requisição")

#### 8 Filtros Especiais Configurados:

1. **ID da Rota** 
   - Tipo: `custom-select` com texto livre
   - Permite busca por ID específico

2. **Tipo de Rota**
   - Tipo: `custom-select`
   - Opções: First Mile, Line Haul, Last Mile

3. **Status**
   - Tipo: `custom-select` 
   - Opções: Pendente, Em Trânsito, Entregue, Cancelado

4. **Data de Entrega**
   - Tipo: `date-range`
   - Filtragem por período

5. **Cliente**
   - Tipo: `multi-search`
   - Busca inteligente com mínimo 2 caracteres

6. **Motorista**
   - Tipo: `multi-search`
   - Busca por nome do motorista (mín. 2 chars)

7. **Placa do Veículo**
   - Tipo: `multi-search`
   - Formato AAA-0000 (mín. 3 chars)

8. **Quantidade de Pacotes**
   - Tipo: `number-range`
   - Faixa: 0 a 10.000 pacotes

## 🗺️ **Mapeamento Específico por Tipo**

### First Mile Route → MercadoLiveRoute
```typescript
private mapFirstMileRoute(route: FirstMileRoute): MercadoLiveRoute {
  return {
    id: route.id.toString(),
    type: 'First Mile',
    customerName: route.carrierName,
    estimatedPackages: route.estimatedPackages,
    driverName: route.driverName,
    vehiclePlate: route.vehicleName || route.vehicleLicensePlate,
    status: this.mapStatus(route.status), // active → in_transit
    priority: route.warnings?.length > 0 ? 'high' : 'medium',
    DepartureDate: this.convertToDate(route.initDate), // timestamp → Date
    // ... outros campos
  };
}
```

### Line Haul Route → MercadoLiveRoute
```typescript
private mapLineHaulRoute(route: LineHaulRoute): MercadoLiveRoute {
  const facilityName = route.steps?.[0]?.origin?.facility || 'N/A';
  const destinationName = route.steps?.[0]?.destination?.facility || 'N/A';
  
  return {
    id: route.id?.toString() || `lh_${Date.now()}`,
    type: 'Line Haul',
    customerName: route.carrier || route.site_id,
    address: `${facilityName} → ${destinationName}`, // Rota origem → destino
    estimatedPackages: route.stops?.[0]?.total_packages || 0,
    driverName: route.drivers?.[0]?.name || 'N/A',
    // ... outros campos
  };
}
```

### Last Mile Route → MercadoLiveRoute
```typescript
private mapLastMileRoute(route: LastMileRoute): MercadoLiveRoute {
  return {
    id: route.id || `lm_${Date.now()}`,
    type: 'Last Mile',
    customerName: route.carrier,
    estimatedPackages: route.counters?.total || route.shipmentData?.spr || 0,
    driverName: route.driver?.driverName,
    vehiclePlate: route.vehicle?.license,
    hasAmbulance: route.hasAmbulance || false, // Campo específico Last Mile
    priority: route.routePerformanceScore === 'NOT_OK' ? 'high' : 'medium',
    // ... outros campos
  };
}
```

## 🔄 **Fluxo de Dados Unificado**

```typescript
private load3TypesOfRoutes(page: number, pageSize: number, filters: any) {
  const types = ['last_mile', 'first_mile', 'line_haul'];
  
  // ✨ 3 consultas simultâneas usando forkJoin
  const requests = types.map(type => 
    this.mercadoLivreService.getMercadoLiveRoutes(1, 1, type, filters).pipe(
      map(response => {
        const datapack = JSON.parse(response.data[0].data_string);
        return this.mapRoutesToInterface(datapack, type); // Mapeamento específico
      })
    )
  );

  return forkJoin(requests).pipe(
    map(allResults => {
      const allRoutes = allResults.flat(); // 🔗 Unificar todas as rotas
      
      // 📊 Ordenar por estimatedPackages decrescente
      allRoutes.sort((a, b) => (b.estimatedPackages || 0) - (a.estimatedPackages || 0));
      
      // 📄 Paginação client-side
      const totalCount = allRoutes.length;
      const data = allRoutes.slice(startIndex, endIndex);
      
      return { data, totalCount, pageCount, currentPage: page };
    })
  );
}
```

## ⚙️ **Configurações Aplicadas**

```typescript
filterConfig: {
  companyFilter: true, // Mantém filtro de empresa
  defaultFilters: [
    {
      field: 'status',
      operator: 'in', 
      value: ['pending', 'in_transit'] // Padrão: rotas ativas
    }
  ]
}
```

## 📊 **Colunas da Tabela**

- **ID**: Identificador único da rota
- **Tipo**: 🚛 First Mile | 🚚 Line Haul | 📦 Last Mile  
- **Cliente**: Nome da transportadora/cliente
- **Localização**: Facility/Site ID
- **Pacotes**: Quantidade formatada (ex: 1.250)
- **Status**: Chips coloridos (Pendente, Em Trânsito, etc.)
- **Dt Início**: Data/hora de partida formatada
- **Motorista**: Nome do motorista responsável
- **Placa**: Placa do veículo
- **Tipo Veículo**: Descrição do tipo de veículo
- **Ambulância**: 🚑 Sim | Não (específico Last Mile)

## 📊 **Side Card Configurado**

- **Posição**: Direita
- **Largura**: 400px 
- **Conteúdo**: Resumo da rota selecionada
- **Campos**: Tipo, Status, Cliente, Pacotes, Motorista, Veículo

## 🎛️ **Eventos de Filtros**

### Captura Detalhada
```typescript
onAdvancedFiltersChanged(filters: any): void {
  console.log('🎯 FILTROS AVANÇADOS APLICADOS:');
  console.log('- Filtros simples:', filters.simple || {});
  console.log('- Filtros de intervalo:', filters.ranges || {});
  console.log('- Filtros de busca:', filters.searches || {});
  console.log('- Filtros de seleção:', filters.selects || {});
}
```

## ✅ **Status da Implementação**

- ✅ **3 consultas simultâneas** (forkJoin)
- ✅ **Mapeamento específico** por tipo de rota
- ✅ **Unificação** em lista única
- ✅ **Ordenação** por quantidade de pacotes
- ✅ **Paginação client-side** 
- ✅ **8 filtros especiais** configurados
- ✅ **Compilação bem-sucedida**  
- ✅ **Template responsivo** 
- ✅ **Estilos com status chips**
- ✅ **Side Card** com resumo
- ✅ **Logs detalhados** no console

## 🚀 **Diferencial Específico**

### ⚡ **Performance Otimizada**
- **forkJoin**: 3 consultas simultâneas (não sequenciais)
- **Client-side pagination**: Evita múltiplas consultas de paginação
- **Mapeamento inteligente**: Cada tipo tem seu próprio mapper
- **Unificação eficiente**: `.flat()` para combinar resultados

### 🎯 **Funcionalidades Preservadas**
- **Tipos específicos**: FirstMile, LineHaul, LastMile
- **Campos únicos**: `hasAmbulance` (Last Mile), `warnings` (First Mile)
- **Status normalization**: Mapeamento inteligente por tipo
- **Timestamps**: Conversão automática de timestamps para Date

## 🚀 **Como Testar**

1. **Navegue até**: `/mercado-live`
2. **Observe**: 
   - Console mostrará: "🔄 Carregadas X rotas do tipo Y"
   - Dados reais das 3 APIs unificados
   - Filtros avançados substituindo "Filtros de Requisição"
3. **Teste filtros**: Todos os 8 tipos disponíveis
4. **Verifique paginação**: Client-side com ordenação por pacotes
5. **Side Card**: Resume a rota selecionada

## 🎯 **Resultado Final**

Os **"Filtros de Requisição" foram completamente substituídos** pelos **Filtros Avançados**, mantendo **integralmente** a lógica específica das **3 consultas simultâneas** com **mapeamento dedicado** por tipo de rota, proporcionando:

- **🚀 Performance**: 3 consultas paralelas com forkJoin
- **🗺️ Mapeamento**: Específico para cada estrutura de dados
- **🔗 Unificação**: Lista única ordenada por pacotes  
- **🎯 Filtros**: 8 filtros avançados intuitivos
- **📊 UX**: Side Card + Status chips + Logs detalhados

---
🎉 **Implementação das 3 Consultas + Filtros Avançados: CONCLUÍDA!** 