'use client'; import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { countTotalPatients, countTotalDoctors, countAppointmentsToday, getUpcomingAppointments, getAppointmentsByDateRange, getNewUsersLastDays, getPendingReports, getDisabledUsers, getDoctorsAvailabilityToday, getPatientById, getDoctorById, } from '@/lib/api'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { AlertCircle, Calendar, Users, Stethoscope, Clock, FileText, AlertTriangle, Plus, ArrowLeft } from 'lucide-react'; import Link from 'next/link'; import { PatientRegistrationForm } from '@/components/features/forms/patient-registration-form'; import { DoctorRegistrationForm } from '@/components/features/forms/doctor-registration-form'; interface DashboardStats { totalPatients: number; totalDoctors: number; appointmentsToday: number; } interface UpcomingAppointment { id: string; scheduled_at: string; status: string; doctor_id: string; patient_id: string; doctor?: { full_name?: string }; patient?: { full_name?: string }; } export default function DashboardPage() { const router = useRouter(); const [stats, setStats] = useState({ totalPatients: 0, totalDoctors: 0, appointmentsToday: 0, }); const [appointments, setAppointments] = useState([]); const [appointmentData, setAppointmentData] = useState([]); const [newUsers, setNewUsers] = useState([]); const [pendingReports, setPendingReports] = useState([]); const [disabledUsers, setDisabledUsers] = useState([]); const [doctors, setDoctors] = useState>(new Map()); const [patients, setPatients] = useState>(new Map()); const [loading, setLoading] = useState(true); // Estados para os modais de formulário const [showPatientForm, setShowPatientForm] = useState(false); const [showDoctorForm, setShowDoctorForm] = useState(false); const [editingPatientId, setEditingPatientId] = useState(null); const [editingDoctorId, setEditingDoctorId] = useState(null); useEffect(() => { loadDashboardData(); }, []); const loadDashboardData = async () => { try { setLoading(true); // 1. Carrega stats const [patientCount, doctorCount, todayCount] = await Promise.all([ countTotalPatients(), countTotalDoctors(), countAppointmentsToday(), ]); setStats({ totalPatients: patientCount, totalDoctors: doctorCount, appointmentsToday: todayCount, }); // 2. Carrega dados dos widgets em paralelo const [upcomingAppts, appointmentDataRange, newUsersList, pendingReportsList, disabledUsersList] = await Promise.all([ getUpcomingAppointments(5), getAppointmentsByDateRange(7), getNewUsersLastDays(7), getPendingReports(5), getDisabledUsers(5), ]); setAppointments(upcomingAppts); setAppointmentData(appointmentDataRange); setNewUsers(newUsersList); setPendingReports(pendingReportsList); setDisabledUsers(disabledUsersList); // 3. Busca detalhes de pacientes e médicos para as próximas consultas const doctorMap = new Map(); const patientMap = new Map(); for (const appt of upcomingAppts) { if (appt.doctor_id && !doctorMap.has(appt.doctor_id)) { const doctor = await getDoctorById(appt.doctor_id); if (doctor) doctorMap.set(appt.doctor_id, doctor); } if (appt.patient_id && !patientMap.has(appt.patient_id)) { const patient = await getPatientById(appt.patient_id); if (patient) patientMap.set(appt.patient_id, patient); } } setDoctors(doctorMap); setPatients(patientMap); } catch (err) { console.error('[Dashboard] Erro ao carregar dados:', err); } finally { setLoading(false); } }; const handlePatientFormSaved = () => { setShowPatientForm(false); setEditingPatientId(null); loadDashboardData(); }; const handleDoctorFormSaved = () => { setShowDoctorForm(false); setEditingDoctorId(null); loadDashboardData(); }; const formatDate = (dateStr: string) => { return new Date(dateStr).toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit', }); }; const getStatusBadge = (status: string) => { const statusMap: Record = { confirmed: { variant: 'default', label: 'Confirmado' }, completed: { variant: 'secondary', label: 'Concluído' }, cancelled: { variant: 'destructive', label: 'Cancelado' }, requested: { variant: 'outline', label: 'Solicitado' }, }; const s = statusMap[status] || { variant: 'outline', label: status }; return {s.label}; }; if (loading) { return (
{[1, 2, 3, 4].map(i => (
))}
); } // Se está exibindo formulário de paciente if (showPatientForm) { return (

{editingPatientId ? "Editar paciente" : "Novo paciente"}

{ setShowPatientForm(false); setEditingPatientId(null); }} />
); } // Se está exibindo formulário de médico if (showDoctorForm) { return (

{editingDoctorId ? "Editar Médico" : "Novo Médico"}

{ setShowDoctorForm(false); setEditingDoctorId(null); }} />
); } return (
{/* Header */}

Dashboard

Bem-vindo ao painel de controle

{/* 1. CARDS RESUMO */}

Total de Pacientes

{stats.totalPatients}

Total de Médicos

{stats.totalDoctors}

Consultas Hoje

{stats.appointmentsToday}

Relatórios Pendentes

{pendingReports.length}

{/* 6. AÇÕES RÁPIDAS */}

Ações Rápidas

{/* 2. PRÓXIMAS CONSULTAS */}

Próximas Consultas (7 dias)

{appointments.length > 0 ? (
{appointments.map(appt => (

{patients.get(appt.patient_id)?.full_name || 'Paciente desconhecido'}

Médico: {doctors.get(appt.doctor_id)?.full_name || 'Médico desconhecido'}

{formatDate(appt.scheduled_at)}

{getStatusBadge(appt.status)}
))}
) : (

Nenhuma consulta agendada para os próximos 7 dias

)}
{/* 5. RELATÓRIOS PENDENTES */}

Relatórios Pendentes

{pendingReports.length > 0 ? (
{pendingReports.map(report => (

{report.order_number}

{report.exam || 'Sem descrição'}

))}
) : (

Sem relatórios pendentes

)}
{/* 4. NOVOS USUÁRIOS */}

Novos Usuários (últimos 7 dias)

{newUsers.length > 0 ? (
{newUsers.map(user => (

{user.full_name || 'Sem nome'}

{user.email}

))}
) : (

Nenhum novo usuário nos últimos 7 dias

)}
{/* 8. ALERTAS */} {disabledUsers.length > 0 && (

Alertas - Usuários Desabilitados

{disabledUsers.map(user => ( {user.full_name} ({user.email}) está desabilitado ))}
)} {/* 11. LINK PARA RELATÓRIOS */}

Seção de Relatórios

Acesse a seção de relatórios médicos para gerenciar, visualizar e exportar documentos.

); }