"use client"; import type React from "react"; import { useState, useEffect, useCallback } from "react"; import { agendamentosApi, Appointment } from "@/services/agendamentosApi"; import { Patient } from "@/services/pacientesApi"; import { Doctor } from "@/services/medicosApi"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Clock, Calendar as CalendarIcon, MapPin, Phone, User, X, RefreshCw, Loader2 } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { toast } from "sonner"; import { Calendar } from "@/components/ui/calendar"; import { format, parseISO, isSameDay } from "date-fns"; // Interface corrigida para incluir os tipos completos de Patient e Doctor interface AppointmentWithDetails extends Appointment { patients: Patient; doctors: Doctor; } export default function DoctorAppointmentsPage() { const [allAppointments, setAllAppointments] = useState([]); const [filteredAppointments, setFilteredAppointments] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [bookedDays, setBookedDays] = useState([]); const [selectedCalendarDate, setSelectedCalendarDate] = useState(new Date()); const fetchAppointments = useCallback(async () => { setIsLoading(true); setError(null); try { // A camada de serviço deve ser ajustada para buscar os dados aninhados // Ex: api.get('/rest/v1/appointments?select=*,patients(*),doctors(*)') const data = await agendamentosApi.list() as AppointmentWithDetails[]; setAllAppointments(data || []); const uniqueBookedDates = Array.from(new Set(data.map(app => app.scheduled_at.split('T')[0]))); const dateObjects = uniqueBookedDates.map(dateString => parseISO(dateString)); setBookedDays(dateObjects); toast.success("Agenda atualizada com sucesso!"); } catch (e) { console.error("Erro ao carregar a agenda:", e); setError("Não foi possível carregar sua agenda. Verifique a conexão."); setAllAppointments([]); } finally { setIsLoading(false); } }, []); useEffect(() => { fetchAppointments(); }, [fetchAppointments]); useEffect(() => { if (selectedCalendarDate) { const todayAppointments = allAppointments .filter(app => isSameDay(parseISO(app.scheduled_at), selectedCalendarDate)) .sort((a, b) => a.scheduled_at.localeCompare(b.scheduled_at)); setFilteredAppointments(todayAppointments); } else { const todayAppointments = allAppointments .filter(app => isSameDay(parseISO(app.scheduled_at), new Date())) .sort((a, b) => a.scheduled_at.localeCompare(b.scheduled_at)); setFilteredAppointments(todayAppointments); } }, [allAppointments, selectedCalendarDate]); const getStatusVariant = (status: Appointment['status']) => { switch (status) { case "confirmed": case "requested": return "default"; case "completed": return "secondary"; case "cancelled": return "destructive"; default: return "outline"; } }; const handleCancel = async (id: string) => { try { await agendamentosApi.update(id, { status: "cancelled" }); toast.info(`Consulta cancelada com sucesso.`); await fetchAppointments(); } catch (error) { console.error("Erro ao cancelar consulta:", error); toast.error("Não foi possível cancelar a consulta."); } }; const handleReSchedule = (id: string) => { toast.info(`Reagendamento da Consulta ID: ${id}. Navegar para a página de agendamento.`); }; const displayDate = selectedCalendarDate ? format(selectedCalendarDate, "EEEE, dd 'de' MMMM") : "Selecione uma data"; return (

Agenda Médica

Visualize e gerencie todas as suas consultas.

Consultas para: {displayDate}

Calendário

Dias em azul possuem agendamentos.

{isLoading ? (
Carregando a agenda...
) : error ? (
{error}
) : filteredAppointments.length === 0 ? (

Nenhuma consulta encontrada para a data selecionada.

) : ( filteredAppointments.map((appointment) => { const showActions = appointment.status === "requested" || appointment.status === "confirmed"; return ( {appointment.patients?.full_name || 'Paciente não informado'} {appointment.status}
Médico: {appointment.doctors?.full_name || 'N/A'}
{format(parseISO(appointment.scheduled_at), 'dd/MM/yyyy')}
{format(parseISO(appointment.scheduled_at), 'HH:mm')}
{appointment.appointment_type || 'N/A'}
{appointment.patients?.phone_mobile || "N/A"}
{showActions && (
)}
); }) )}
); }