# 📊 Guia de Personalização de Dashboard de Aba

Este guia mostra como personalizar o dashboard de aba para qualquer domínio no sistema PraFrota.

## 🎯 Visão Geral

O sistema de dashboard permite criar painéis personalizados para cada domínio, com:
- **KPIs automáticos** (Total, Ativos, Recentes)
- **KPIs customizados** (específicos do domínio)
- **Gráficos personalizados** (barras, linhas, pizza)
- **Itens recentes** (últimos registros)

## 🚀 Como Implementar

### 1. Habilitar Dashboard no DomainConfig

```typescript
protected override getDomainConfig(): DomainConfig {
  return {
    domain: 'tollparking',
    title: 'Pedágio & Estacionamento',
    showDashboardTab: true, // ✅ Habilitar dashboard
    dashboardConfig: {
      title: 'Dashboard de Pedágio & Estacionamento',
      showKPIs: true,
      showCharts: true,
      showRecentItems: true,
      customKPIs: this.getCustomKPIs(),      // ✅ KPIs personalizados
      customCharts: this.getCustomCharts()   // ✅ Gráficos personalizados
    },
    // ... resto da configuração
  };
}
```

### 2. Implementar KPIs Customizados

```typescript
private getCustomKPIs(): DashboardKPI[] {
  if (!this.entities || this.entities.length === 0) {
    return [];
  }

  // Calcular métricas específicas do domínio
  const last3MonthsData = this.getLast3MonthsData();
  const topVehiclesByValue = this.getTopVehiclesByValue(10);
  const monthlyEvolution = this.getMonthlyEvolution();

  return [
    {
      id: 'top-vehicle-value',
      label: 'Maior Gasto (Veículo)',
      value: `R$ ${topVehiclesByValue[0]?.totalValue.toLocaleString('pt-BR')}`,
      icon: 'fas fa-trophy',
      color: 'warning',
      trend: 'up',
      change: topVehiclesByValue[0]?.license_plate || '-'
    },
    {
      id: 'monthly-evolution',
      label: 'Evolução Mensal',
      value: monthlyEvolution.trend === 'up' ? '↗️' : '↘️',
      icon: 'fas fa-chart-line',
      color: monthlyEvolution.trend === 'up' ? 'success' : 'danger',
      trend: monthlyEvolution.trend,
      change: `${monthlyEvolution.percentage}%`
    }
    // ... mais KPIs
  ];
}
```

### 3. Implementar Gráficos Customizados

```typescript
private getCustomCharts(): DashboardChart[] {
  if (!this.entities || this.entities.length === 0) {
    return [];
  }

  const topVehicles = this.getTopVehiclesByValue(10);
  const monthlyData = this.getMonthlyEvolutionData();
  const typeDistribution = this.getTypeDistribution();

  return [
    {
      id: 'top-vehicles-chart',
      title: 'Top 10 Veículos por Valor Total',
      type: 'bar',
      data: topVehicles.map(v => ({
        label: v.license_plate,
        value: v.totalValue,
        count: v.count,
        avgValue: v.avgValue
      }))
    },
    {
      id: 'monthly-evolution-chart',
      title: 'Evolução dos Últimos 3 Meses',
      type: 'line',
      data: monthlyData
    },
    {
      id: 'type-distribution-chart',
      title: 'Distribuição por Tipo',
      type: 'pie',
      data: typeDistribution
    }
  ];
}
```

## 📈 Exemplo Completo: TollparkingComponent

O `TollparkingComponent` implementa um dashboard personalizado com:

### KPIs Implementados:
1. **Maior Gasto (Veículo)**: Mostra o veículo com maior gasto total
2. **Evolução Mensal**: Compara mês atual vs anterior com tendência
3. **Veículos Ativos**: Quantidade de veículos únicos nos últimos 3 meses
4. **Gasto Médio Mensal**: Média de gastos dos últimos 3 meses

### Gráficos Implementados:
1. **Top 10 Veículos por Valor**: Ranking dos veículos com maiores gastos
2. **Evolução dos Últimos 3 Meses**: Linha temporal de gastos
3. **Distribuição por Tipo**: Pizza mostrando pedágio vs estacionamento

### Métodos de Cálculo:
- `getLast3MonthsData()`: Dados dos últimos 90 dias
- `getCurrentMonthData()`: Dados do mês atual
- `getPreviousMonthData()`: Dados do mês anterior
- `getTopVehiclesByValue()`: Ranking de veículos por gasto
- `getMonthlyEvolution()`: Cálculo de tendência mensal
- `getTypeDistribution()`: Distribuição por categoria

## 🎨 Tipos de KPI

### Cores Disponíveis:
- `primary`: Azul (padrão do sistema)
- `success`: Verde (positivo, crescimento)
- `warning`: Amarelo (atenção, destaque)
- `danger`: Vermelho (crítico, decréscimo)
- `info`: Azul claro (informativo)

### Tendências:
- `up`: Crescimento (seta para cima)
- `down`: Decréscimo (seta para baixo)
- `stable`: Estável (seta horizontal)

### Ícones Recomendados:
- `fas fa-trophy`: Rankings, destaques
- `fas fa-chart-line`: Evolução, tendências
- `fas fa-car`: Veículos
- `fas fa-calculator`: Cálculos, médias
- `fas fa-dollar-sign`: Valores financeiros
- `fas fa-users`: Usuários, motoristas
- `fas fa-clock`: Tempo, recentes

## 🎯 Tipos de Gráfico

### Disponíveis:
- `bar`: Gráfico de barras (comparações)
- `line`: Gráfico de linha (evolução temporal)
- `pie`: Gráfico de pizza (distribuições)

### Estrutura de Dados:
```typescript
// Para gráficos de barra e linha
data: [
  {
    label: 'ABC-1234',
    value: 1500.50,
    count: 15,
    // ... outros campos
  }
]

// Para gráfico de pizza
data: [
  {
    label: 'Pedágio',
    value: 5000,
    count: 50,
    percentage: '60.5'
  }
]
```

## 🔧 Métodos Auxiliares Comuns

### Filtrar por Período:
```typescript
private getDataByPeriod(startDate: Date, endDate: Date) {
  return this.entities.filter((item: any) => {
    const itemDate = new Date(item.date || item.created_at);
    return itemDate >= startDate && itemDate <= endDate;
  });
}
```

### Agrupar por Campo:
```typescript
private groupByField(field: string) {
  const groups = new Map();
  
  this.entities.forEach((item: any) => {
    const key = item[field];
    if (!groups.has(key)) {
      groups.set(key, {
        key,
        items: [],
        totalValue: 0,
        count: 0
      });
    }
    
    const group = groups.get(key);
    group.items.push(item);
    group.totalValue += Number(item.value) || 0;
    group.count += 1;
  });

  return Array.from(groups.values());
}
```

### Calcular Tendência:
```typescript
private calculateTrend(current: number, previous: number) {
  if (previous === 0) return 'stable';
  
  const change = ((current - previous) / previous) * 100;
  
  return change > 5 ? 'up' : change < -5 ? 'down' : 'stable';
}
```

## 📱 Responsividade

O dashboard é automaticamente responsivo:
- **Desktop**: Grid de 3-4 colunas
- **Tablet**: Grid de 2 colunas
- **Mobile**: Grid de 1 coluna

## 🎯 Boas Práticas

### KPIs:
1. **Máximo 6 KPIs**: Para não sobrecarregar a tela
2. **Valores relevantes**: Focar nas métricas mais importantes
3. **Atualização dinâmica**: KPIs devem refletir dados atuais
4. **Formatação adequada**: Usar formatação brasileira para números

### Gráficos:
1. **Máximo 3 gráficos**: Para performance e usabilidade
2. **Dados suficientes**: Verificar se há dados antes de renderizar
3. **Títulos descritivos**: Títulos claros e objetivos
4. **Cores consistentes**: Usar paleta de cores do sistema

### Performance:
1. **Cache de cálculos**: Evitar recalcular a cada render
2. **Lazy loading**: Carregar dados sob demanda
3. **Debounce**: Para atualizações em tempo real

## 🔄 Atualização Automática

O dashboard é atualizado automaticamente quando:
- Dados são carregados (`entities` mudança)
- Filtros são aplicados
- Aba é reaberta

## 📊 Exemplo de Uso

```typescript
// No component do domínio
export class MyDomainComponent extends BaseDomainComponent<MyEntity> {
  
  protected override getDomainConfig(): DomainConfig {
    return {
      // ... configuração básica
      showDashboardTab: true,
      dashboardConfig: {
        customKPIs: this.getMyKPIs(),
        customCharts: this.getMyCharts()
      }
    };
  }

  private getMyKPIs(): DashboardKPI[] {
    // Implementar KPIs específicos do domínio
  }

  private getMyCharts(): DashboardChart[] {
    // Implementar gráficos específicos do domínio
  }
}
```

## 🎉 Resultado

Com essa implementação, você terá um dashboard personalizado que:
- ✅ Mostra métricas relevantes do domínio
- ✅ Apresenta evolução temporal dos dados
- ✅ Destaca informações importantes
- ✅ É responsivo e performático
- ✅ Segue padrões visuais do sistema

---

**💡 Dica**: Use o `TollparkingComponent` como referência para implementar dashboards em outros domínios!
