'use client' import { useState, useEffect } from 'react' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Calendar, Clock, MapPin, User, DollarSign } from 'lucide-react' import { format } from 'date-fns' import { es } from 'date-fns/locale' /** @description Customer appointments management page component for viewing and managing existing bookings. */ export default function MisCitasPage() { const [bookings, setBookings] = useState([]) const [loading, setLoading] = useState(false) const [filter, setFilter] = useState<'all' | 'upcoming' | 'past'>('all') useEffect(() => { loadBookings() }, []) const loadBookings = async () => { setLoading(true) try { // En una implementación real, esto vendría de la API // Por ahora, simulamos algunas citas del cliente const mockBookings = [ { id: 'booking-1', short_id: 'ABC123', status: 'confirmed', start_time_utc: '2024-01-20T10:00:00Z', end_time_utc: '2024-01-20T11:30:00Z', service: { name: 'Corte y Estilismo', duration_minutes: 90, base_price: 2500 }, staff: { display_name: 'Ana López' }, location: { name: 'Anchor:23 Saltillo' }, notes: 'Corte moderno con degradado' }, { id: 'booking-2', short_id: 'DEF456', status: 'pending', start_time_utc: '2024-01-25T14:30:00Z', end_time_utc: '2024-01-25T15:45:00Z', service: { name: 'Manicure de Precisión', duration_minutes: 75, base_price: 1200 }, staff: { display_name: 'Carlos Martínez' }, location: { name: 'Anchor:23 Saltillo' }, notes: null }, { id: 'booking-3', short_id: 'GHI789', status: 'completed', start_time_utc: '2024-01-15T09:00:00Z', end_time_utc: '2024-01-15T10:30:00Z', service: { name: 'Peinado y Maquillaje', duration_minutes: 90, base_price: 3500 }, staff: { display_name: 'Sofia Ramírez' }, location: { name: 'Anchor:23 Saltillo' }, notes: 'Evento especial - boda' } ] setBookings(mockBookings) } catch (error) { console.error('Error loading bookings:', error) } finally { setLoading(false) } } const filteredBookings = bookings.filter(booking => { const now = new Date() const bookingDate = new Date(booking.start_time_utc) switch (filter) { case 'upcoming': return bookingDate >= now case 'past': return bookingDate < now default: return true } }) const getStatusBadge = (status: string, startTime: string) => { const now = new Date() const bookingDate = new Date(startTime) const isPast = bookingDate < now const statuses = { pending: { label: 'Pendiente', color: 'bg-yellow-100 text-yellow-800' }, confirmed: { label: 'Confirmada', color: 'bg-green-100 text-green-800' }, completed: { label: 'Completada', color: 'bg-blue-100 text-blue-800' }, cancelled: { label: 'Cancelada', color: 'bg-red-100 text-red-800' }, no_show: { label: 'No Show', color: 'bg-gray-100 text-gray-800' } } const statusInfo = statuses[status as keyof typeof statuses] || statuses.pending // Si es pasado y no completado, mostrar como completado if (isPast && status !== 'completed' && status !== 'cancelled') { return { label: 'Completada', color: 'bg-blue-100 text-blue-800' } } return statusInfo } const handleCancelBooking = async (bookingId: string) => { if (!confirm('¿Estás seguro de que quieres cancelar esta cita?')) { return } try { // En una implementación real, esto haría una llamada a la API // Por ahora, simulamos la cancelación setBookings(bookings.map(b => b.id === bookingId ? { ...b, status: 'cancelled' } : b )) alert('Cita cancelada exitosamente') } catch (error) { console.error('Error cancelling booking:', error) alert('Error al cancelar la cita') } } return (

Mis Citas

Gestiona tus reservas y citas programadas

{loading ? (

Cargando tus citas...

) : filteredBookings.length === 0 ? (

{filter === 'all' ? 'No tienes citas' : filter === 'upcoming' ? 'No tienes citas próximas' : 'No tienes citas pasadas'}

{filter === 'all' ? 'Programa tu primera cita con nosotros' : 'Programa una nueva cita'}

) : (
{filteredBookings.map((booking) => { const statusInfo = getStatusBadge(booking.status, booking.start_time_utc) const bookingDate = new Date(booking.start_time_utc) const now = new Date() const isUpcoming = bookingDate >= now const canCancel = booking.status === 'pending' || booking.status === 'confirmed' return (

{booking.service?.name}

{format(bookingDate, 'EEEE, d MMMM yyyy', { locale: es })}
{format(new Date(booking.start_time_utc), 'HH:mm', { locale: es })} - {format(new Date(booking.end_time_utc), 'HH:mm', { locale: es })}
{booking.staff?.display_name}
{booking.location?.name}
{booking.notes && (

"{booking.notes}"

)}
{statusInfo.label}
${booking.service?.base_price?.toLocaleString()}
Código: {booking.short_id}
{isUpcoming && canCancel && ( )}
) })}
)}
) }