'use client' import { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { StatsCard } from '@/components/ui/stats-card' import { Table, TableHeader, TableBody, TableHead, TableRow, TableCell } from '@/components/ui/table' import { Avatar } from '@/components/ui/avatar' import { Calendar, Users, Clock, DollarSign, TrendingUp, LogOut, Trophy } from 'lucide-react' import { format } from 'date-fns' import { es } from 'date-fns/locale' import { useAuth } from '@/lib/auth/context' import CalendarView from '@/components/calendar-view' import StaffManagement from '@/components/staff-management' import ResourcesManagement from '@/components/resources-management' import PayrollManagement from '@/components/payroll-management' /** * @description Admin dashboard component for managing salon operations including bookings, staff, resources, reports, and permissions. */ export default function ApertureDashboard() { const { user, signOut } = useAuth() const router = useRouter() const [activeTab, setActiveTab] = useState<'dashboard' | 'calendar' | 'staff' | 'payroll' | 'resources' | 'reports' | 'permissions'>('dashboard') const [reportType, setReportType] = useState<'sales' | 'payments' | 'payroll'>('sales') const [bookings, setBookings] = useState([]) const [staff, setStaff] = useState([]) const [resources, setResources] = useState([]) const [reports, setReports] = useState({}) const [permissions, setPermissions] = useState([]) const [pageLoading, setPageLoading] = useState(false) const [stats, setStats] = useState({ totalBookings: 0, totalRevenue: 0, completedToday: 0, upcomingToday: 0 }) const [customers, setCustomers] = useState({ total: 0, newToday: 0, newMonth: 0 }) const [topPerformers, setTopPerformers] = useState([]) const [activityFeed, setActivityFeed] = useState([]) useEffect(() => { if (activeTab === 'dashboard') { fetchBookings() fetchStats() fetchDashboardData() } else if (activeTab === 'staff') { fetchStaff() } else if (activeTab === 'resources') { fetchResources() } else if (activeTab === 'reports') { fetchReports() } else if (activeTab === 'permissions') { fetchPermissions() } }, [activeTab, reportType]) const fetchBookings = async () => { setPageLoading(true) try { const today = format(new Date(), 'yyyy-MM-dd') const response = await fetch(`/api/aperture/dashboard?start_date=${today}&end_date=${today}`) const data = await response.json() if (data.success) { setBookings(data.bookings) } } catch (error) { console.error('Error fetching bookings:', error) } finally { setPageLoading(false) } } const fetchStats = async () => { try { const response = await fetch('/api/aperture/stats') const data = await response.json() if (data.success) { setStats(data.stats) } } catch (error) { console.error('Error fetching stats:', error) } } const fetchDashboardData = async () => { try { const response = await fetch('/api/aperture/dashboard?include_customers=true&include_top_performers=true&include_activity=true') const data = await response.json() if (data.success) { if (data.customers) { setCustomers(data.customers) } if (data.topPerformers) { setTopPerformers(data.topPerformers) } if (data.activityFeed) { setActivityFeed(data.activityFeed) } } } catch (error) { console.error('Error fetching dashboard data:', error) } } const fetchStaff = async () => { setPageLoading(true) try { const response = await fetch('/api/aperture/staff') const data = await response.json() if (data.success) { setStaff(data.staff) } } catch (error) { console.error('Error fetching staff:', error) } finally { setPageLoading(false) } } const fetchResources = async () => { setPageLoading(true) try { const response = await fetch('/api/aperture/resources') const data = await response.json() if (data.success) { setResources(data.resources) } } catch (error) { console.error('Error fetching resources:', error) } finally { setPageLoading(false) } } const fetchReports = async () => { setPageLoading(true) try { let endpoint = '' if (reportType === 'sales') endpoint = '/api/aperture/reports/sales' else if (reportType === 'payments') endpoint = '/api/aperture/reports/payments' else if (reportType === 'payroll') endpoint = '/api/aperture/reports/payroll' if (endpoint) { const response = await fetch(endpoint) const data = await response.json() if (data.success) { setReports(data) } } } catch (error) { console.error('Error fetching reports:', error) } finally { setPageLoading(false) } } const fetchPermissions = async () => { setPageLoading(true) try { const response = await fetch('/api/aperture/permissions') const data = await response.json() if (data.success) { setPermissions(data.permissions) } } catch (error) { console.error('Error fetching permissions:', error) } finally { setPageLoading(false) } } const togglePermission = async (roleId: string, permId: string) => { try { await fetch('/api/aperture/permissions', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ roleId, permId }) }) fetchPermissions() } catch (error) { console.error('Error toggling permission:', error) } } const handleLogout = async () => { await signOut() router.push('/aperture/login') } if (!user) { return null } return (

Aperture - Admin

} title="Citas Hoy" value={stats.completedToday} /> } title="Ingresos Hoy" value={`$${stats.totalRevenue.toLocaleString()}`} /> } title="Pendientes" value={stats.upcomingToday} /> } title="Total Mes" value={stats.totalBookings} />
{activeTab === 'calendar' && ( )} {activeTab === 'dashboard' && (
Top Performers Staff con mejor rendimiento este mes {pageLoading || topPerformers.length === 0 ? (

Cargando performers...

) : ( # Staff Role Citas Horas Ingresos {topPerformers.map((performer, index) => ( {index < 3 && (
)} {index + 1}
n[0]).join('').toUpperCase().slice(0, 2)} /> {performer.displayName}
{performer.role} {performer.totalBookings} {performer.totalHours.toFixed(1)}h ${performer.totalRevenue.toLocaleString()}
))}
)}
Actividad Reciente Últimas acciones en el sistema {pageLoading || activityFeed.length === 0 ? (

Cargando actividad...

) : (
{activityFeed.map((activity) => (

{activity.action === 'completed' && 'Cita completada'} {activity.action === 'confirmed' && 'Cita confirmada'} {activity.action === 'cancelled' && 'Cita cancelada'} {activity.action === 'created' && 'Nueva cita'}

{format(new Date(activity.timestamp), 'HH:mm', { locale: es })}

{activity.customerName} - {activity.serviceName}

{activity.staffName && (

Staff: {activity.staffName}

)}
))}
)}
)} {activeTab === 'staff' && ( )} {activeTab === 'payroll' && ( )} {activeTab === 'resources' && ( )} {activeTab === 'permissions' && ( Gestión de Permisos Asignar permisos dependiendo del perfil {pageLoading ? (

Cargando permisos...

) : (
{permissions.map((role: any) => (

{role.name}

{role.permissions.map((perm: any) => (
togglePermission(role.id, perm.id)} /> {perm.name}
))}
))}
)}
)} {activeTab === 'reports' && (
Reportes Estadísticas y reportes del negocio
{pageLoading ? (

Cargando reportes...

) : (
{reportType === 'sales' && (

Ventas Totales

${reports.totalSales || 0}

Citas Completadas

{reports.completedBookings || 0}

Promedio por Servicio

${reports.avgServicePrice || 0}

{reports.salesByService && (

Ventas por Servicio

{reports.salesByService.map((item: any) => (
{item.service} ${item.total}
))}
)}
)} {reportType === 'payments' && (

Pagos Recientes

{reports.payments && reports.payments.length > 0 ? (
{reports.payments.map((payment: any) => (
{payment.customer} ${payment.amount}

{payment.date} - {payment.status}

))}
) : (

No hay pagos recientes

)}
)} {reportType === 'payroll' && (

Nómina Semanal

{reports.payroll && reports.payroll.length > 0 ? (
{reports.payroll.map((staff: any) => (
{staff.name} ${staff.weeklyPay}

Horas: {staff.hours}, Comisión: ${staff.commission}

))}
) : (

No hay datos de nómina

)}
)}
)}
)}
) }