'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 { Calendar, Users, Clock, DollarSign, TrendingUp, LogOut } from 'lucide-react' import { format } from 'date-fns' import { es } from 'date-fns/locale' import { useAuth } from '@/lib/auth/context' /** @description Admin dashboard component for managing salon operations including bookings, staff, resources, reports, and permissions. */ export default function ApertureDashboard() { const { user, loading: authLoading, signOut } = useAuth() const router = useRouter() const [activeTab, setActiveTab] = useState<'dashboard' | 'staff' | '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 }) useEffect(() => { if (!authLoading && !user) { router.push('/booking/login?redirect=/aperture') } }, [user, authLoading, router]) if (authLoading) { return (

Cargando...

) } if (!user) { return null } useEffect(() => { if (activeTab === 'dashboard') { fetchBookings() fetchStats() } 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 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() // Refresh } catch (error) { console.error('Error toggling permission:', error) } } const handleLogout = () => { localStorage.removeItem('admin_enrollment_key') window.location.href = '/' } return (

Aperture - Admin

Citas Hoy

{stats.completedToday}

Completadas

Ingresos Hoy

${stats.totalRevenue.toLocaleString()}

Ingresos

Pendientes

{stats.upcomingToday}

Por iniciar

Total Mes

{stats.totalBookings}

Este mes

{activeTab === 'dashboard' && ( Dashboard Resumen de operaciones del día {pageLoading ? (
Cargando...
) : (
{bookings.length === 0 ? (

No hay citas para hoy

) : ( bookings.map((booking) => (

{booking.customer?.first_name} {booking.customer?.last_name}

{booking.service?.name}

{format(new Date(booking.start_time_utc), 'HH:mm', { locale: es })} - {format(new Date(booking.end_time_utc), 'HH:mm', { locale: es })}

{booking.status}
)) )}
)}
)} {activeTab === 'staff' && ( Gestión de Staff Administra horarios y disponibilidad del equipo {pageLoading ? (

Cargando staff...

) : (
{staff.map((member) => (

{member.display_name}

{member.role}

))}
)}
)} {activeTab === 'resources' && ( Gestión de Recursos Administra estaciones y asignación {pageLoading ? (

Cargando recursos...

) : (
{resources.map((resource) => (

{resource.name}

{resource.type} - {resource.location_name}

{resource.is_available ? 'Disponible' : 'Ocupado'}
))}
)}
)} {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

)}
)}
)}
)}
) }