"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 (
);
}
// 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.
)}
);
}