"use client"; import type React from "react"; import { useState, useEffect } from "react"; import DoctorLayout from "@/components/doctor-layout"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Clock, Calendar as CalendarIcon, MapPin, Phone, User, X, RefreshCw } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { toast } from "sonner"; // IMPORTAR O COMPONENTE CALENDÁRIO DA SHADCN import { Calendar } from "@/components/ui/calendar"; import { format } from "date-fns"; // Usaremos o date-fns para formatação e comparação de datas const APPOINTMENTS_STORAGE_KEY = "clinic-appointments"; // --- TIPAGEM DA CONSULTA SALVA NO LOCALSTORAGE --- interface LocalStorageAppointment { id: number; patientName: string; doctor: string; specialty: string; date: string; // Data no formato YYYY-MM-DD time: string; // Hora no formato HH:MM status: "agendada" | "confirmada" | "cancelada" | "realizada"; location: string; phone: string; } const LOGGED_IN_DOCTOR_NAME = "Dr. João Santos"; // Função auxiliar para comparar se duas datas (Date objects) são o mesmo dia const isSameDay = (date1: Date, date2: Date) => { return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate(); }; // --- COMPONENTE PRINCIPAL --- export default function DoctorAppointmentsPage() { const [allAppointments, setAllAppointments] = useState([]); const [filteredAppointments, setFilteredAppointments] = useState([]); const [isLoading, setIsLoading] = useState(true); // NOVO ESTADO 1: Armazena os dias com consultas (para o calendário) const [bookedDays, setBookedDays] = useState([]); // NOVO ESTADO 2: Armazena a data selecionada no calendário const [selectedCalendarDate, setSelectedCalendarDate] = useState(new Date()); useEffect(() => { loadAppointments(); }, []); // Efeito para filtrar a lista sempre que o calendário ou a lista completa for atualizada useEffect(() => { if (selectedCalendarDate) { const dateString = format(selectedCalendarDate, 'yyyy-MM-dd'); // Filtra a lista completa de agendamentos pela data selecionada const todayAppointments = allAppointments .filter(app => app.date === dateString) .sort((a, b) => a.time.localeCompare(b.time)); // Ordena por hora setFilteredAppointments(todayAppointments); } else { // Se nenhuma data estiver selecionada (ou se for limpa), mostra todos (ou os de hoje) const todayDateString = format(new Date(), 'yyyy-MM-dd'); const todayAppointments = allAppointments .filter(app => app.date === todayDateString) .sort((a, b) => a.time.localeCompare(b.time)); setFilteredAppointments(todayAppointments); } }, [allAppointments, selectedCalendarDate]); const loadAppointments = () => { setIsLoading(true); try { const storedAppointmentsRaw = localStorage.getItem(APPOINTMENTS_STORAGE_KEY); const allAppts: LocalStorageAppointment[] = storedAppointmentsRaw ? JSON.parse(storedAppointmentsRaw) : []; // ***** NENHUM FILTRO POR MÉDICO AQUI (Como solicitado) ***** const appointmentsToShow = allAppts; // 1. EXTRAI E PREPARA AS DATAS PARA O CALENDÁRIO const uniqueBookedDates = Array.from(new Set(appointmentsToShow.map(app => app.date))); // Converte YYYY-MM-DD para objetos Date, garantindo que o tempo seja meia-noite (00:00:00) const dateObjects = uniqueBookedDates.map(dateString => new Date(dateString + 'T00:00:00')); setAllAppointments(appointmentsToShow); setBookedDays(dateObjects); toast.success("Agenda atualizada com sucesso!"); } catch (error) { console.error("Erro ao carregar a agenda do LocalStorage:", error); toast.error("Não foi possível carregar sua agenda."); } finally { setIsLoading(false); } }; const getStatusVariant = (status: LocalStorageAppointment['status']) => { // ... (código mantido) switch (status) { case "confirmada": case "agendada": return "default"; case "realizada": return "secondary"; case "cancelada": return "destructive"; default: return "outline"; } }; const handleCancel = (id: number) => { // ... (código mantido para cancelamento) const storedAppointmentsRaw = localStorage.getItem(APPOINTMENTS_STORAGE_KEY); const allAppts: LocalStorageAppointment[] = storedAppointmentsRaw ? JSON.parse(storedAppointmentsRaw) : []; const updatedAppointments = allAppts.map(app => app.id === id ? { ...app, status: "cancelada" as const } : app ); localStorage.setItem(APPOINTMENTS_STORAGE_KEY, JSON.stringify(updatedAppointments)); loadAppointments(); toast.info(`Consulta cancelada com sucesso.`); }; const handleReSchedule = (id: number) => { toast.info(`Reagendamento da Consulta ID: ${id}. Navegar para a página de agendamento.`); }; const displayDate = selectedCalendarDate ? new Date(selectedCalendarDate).toLocaleDateString("pt-BR", { weekday: 'long', day: '2-digit', month: 'long' }) : "Selecione uma data"; return (

Agenda Médica Centralizada

Todas as consultas do sistema são exibidas aqui ({LOGGED_IN_DOCTOR_NAME})

Consultas para: {displayDate}

{/* NOVO LAYOUT DE DUAS COLUNAS */}
{/* COLUNA 1: CALENDÁRIO */}
Calendário

Dias em azul possuem agendamentos.

{/* COLUNA 2: LISTA DE CONSULTAS FILTRADAS */}
{isLoading ? (

Carregando a agenda...

) : filteredAppointments.length === 0 ? (

Nenhuma consulta encontrada para a data selecionada.

) : ( filteredAppointments.map((appointment) => { const showActions = appointment.status === "agendada" || appointment.status === "confirmada"; return ( {appointment.patientName} {appointment.status} {/* Detalhes e Ações... (mantidos) */}
Médico: {appointment.doctor}
{new Date(appointment.date).toLocaleDateString("pt-BR", { timeZone: "UTC" })}
{appointment.time}
{appointment.location}
{appointment.phone || "N/A"}
{showActions && (
)}
); }) )}
); }