"use client"; import { useAuth } from "@/hooks/useAuth"; import { useReservas } from "@/hooks/useReservas"; import { useMesas } from "@/hooks/useMesas"; import { useStaff } from "@/hooks/useStaff"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { OverviewChart } from "@/components/dashboard/OverviewChart"; import { OccupancyPieChart } from "@/components/dashboard/OccupancyPieChart"; import { Users, CalendarCheck, Clock, TrendingUp, UserCheck } from "lucide-react"; export default function DashboardHomePage() { const { user } = useAuth(); const { reservas, loading: loadingReservas } = useReservas(); const { mesas, loading: loadingMesas } = useMesas(); const { staff } = useStaff(); // Guard against missing user data if (!user) { return (
A carregar...
); } // 1. Calculate top stats const todayStr = new Date().toISOString().split('T')[0]; const todayReservas = reservas.filter(r => r.data === todayStr || r.estado.startsWith("Confirmada")); const activeReservas = todayReservas.filter(r => r.estado.startsWith("Confirmada")).length; const pendingReservas = todayReservas.filter(r => r.estado === "Pendente").length; const totalMesas = mesas.length; const occupiedMesas = mesas.filter(m => m.estado === "Ocupada").length; const reservedMesas = mesas.filter(m => m.estado === "Reservada").length; const freeMesas = totalMesas - occupiedMesas - reservedMesas; const occupancyRate = totalMesas > 0 ? Math.round(((occupiedMesas + reservedMesas) / totalMesas) * 100) : 0; const stats = [ { name: "Reservas Hoje", value: todayReservas.length.toString(), icon: CalendarCheck, trend: `+${pendingReservas} pendentes` }, { name: "Mesas Ocupadas", value: `${occupiedMesas} / ${totalMesas}`, icon: Clock, trend: `${freeMesas} livres` }, { name: "Staff Ativo", value: staff.length.toString(), icon: UserCheck, trend: "Equipa total" }, { name: "Ocupação", value: `${occupancyRate}%`, icon: TrendingUp, trend: "Tempo real" }, ]; // 2. Process data for Overview Chart (Last 7 days) const last7Days = Array.from({ length: 7 }, (_, i) => { const d = new Date(); d.setDate(d.getDate() - i); return d.toISOString().split('T')[0]; }).reverse(); const chartData = last7Days.map(date => { // Usar formato YYYY/MM/DD para compatibilidade total entre browsers const safeDate = date.replace(/-/g, '/'); const dayLabel = new Date(safeDate).toLocaleDateString('pt-PT', { weekday: 'short' }); const count = reservas.filter(r => r.data === date).length; return { name: dayLabel, total: count }; }); // 3. Process data for Pie Chart const pieData = [ { name: "Livre", value: freeMesas, color: "#2A261E" }, { name: "Ocupada", value: occupiedMesas, color: "#D4891A" }, { name: "Reservada", value: reservedMesas, color: "#E8A832" }, ]; return (

Bem-vindo, {user?.establishmentName || "Restaurante"}

Monitorize o desempenho do seu estabelecimento em tempo real.

{stats.map((stat) => ( {stat.name}
{loadingReservas || loadingMesas ? "..." : stat.value}

{stat.trend}

))}
Volume de Reservas Fluxo de clientes nos últimos 7 dias Ocupação das Mesas Estado atual do restaurante
Últimas Reservas Atividade mais recente {reservas.length > 0 ? (
{reservas.slice(0, 5).map((r) => (

{r.clienteEmail}

{r.data} às {r.hora} • {r.pessoas} pessoas

{r.estado}
))}
) : (

Nenhuma atividade registada.

)}
Mesas Críticas Mesas que requerem atenção {mesas.filter(m => m.estado !== "Livre").length > 0 ? (
{mesas.filter(m => m.estado !== "Livre").map((m) => (
Mesa {m.numero}
))}
) : (

Todas as mesas estão livres.

)}
); }