"use client"; import React, { useState, useRef, useEffect } from "react"; import SignatureCanvas from "react-signature-canvas"; import Link from "next/link"; import ProtectedRoute from "@/components/ProtectedRoute"; import { useAuth } from "@/hooks/useAuth"; import { buscarPacientes } from "@/lib/api"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { SimpleThemeToggle } from "@/components/simple-theme-toggle"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Avatar, AvatarImage, AvatarFallback } from "@/components/ui/avatar"; import { User, FolderOpen, X, Users, MessageSquare, ClipboardList, Plus, Edit, Trash2, ChevronLeft, ChevronRight, Clock, FileCheck, Upload, Download, Eye, History, Stethoscope, Pill, Activity, Search, } from "lucide-react"; import { Calendar as CalendarIcon, FileText, Settings } from "lucide-react"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import dynamic from "next/dynamic"; import dayGridPlugin from "@fullcalendar/daygrid"; import timeGridPlugin from "@fullcalendar/timegrid"; import interactionPlugin from "@fullcalendar/interaction"; import ptBrLocale from "@fullcalendar/core/locales/pt-br"; const FullCalendar = dynamic(() => import("@fullcalendar/react"), { ssr: false, }); const pacientes = [ { nome: "Ana Souza", cpf: "123.456.789-00", idade: 42, statusLaudo: "Finalizado", }, { nome: "Bruno Lima", cpf: "987.654.321-00", idade: 33, statusLaudo: "Pendente", }, { nome: "Carla Menezes", cpf: "111.222.333-44", idade: 67, statusLaudo: "Rascunho", }, ]; const medico = { nome: "Dr. Carlos Andrade", identificacao: "CRM 000000 • Cardiologia e Dermatologia", fotoUrl: "", }; const colorsByType = { Rotina: "#4dabf7", Cardiologia: "#f76c6c", Otorrino: "#f7b84d", Pediatria: "#6cf78b", Dermatologia: "#9b59b6", Oftalmologia: "#2ecc71", }; const ProfissionalPage = () => { const { logout, user } = useAuth(); const [activeSection, setActiveSection] = useState("calendario"); const [pacienteSelecionado, setPacienteSelecionado] = useState(null); // Estados para edição de laudo const [isEditingLaudoForPatient, setIsEditingLaudoForPatient] = useState(false); const [patientForLaudo, setPatientForLaudo] = useState(null); // Estados para o perfil do médico const [isEditingProfile, setIsEditingProfile] = useState(false); const [profileData, setProfileData] = useState({ nome: "Dr. Carlos Andrade", email: user?.email || "carlos.andrade@hospital.com", telefone: "(11) 99999-9999", endereco: "Rua das Flores, 123 - Centro", cidade: "São Paulo", cep: "01234-567", crm: "CRM 000000", especialidade: "Cardiologia e Dermatologia", biografia: "Médico especialista em cardiologia e dermatologia com mais de 15 anos de experiência em tratamentos clínicos e cirúrgicos.", }); // Estados para relatórios médicos const [relatorioMedico, setRelatorioMedico] = useState({ pacienteNome: "", pacienteCpf: "", pacienteIdade: "", profissionalNome: medico.nome, profissionalCrm: medico.identificacao, motivoRelatorio: "", historicoClinico: "", sinaisSintomas: "", examesRealizados: "", resultadosExames: "", diagnosticos: "", prognostico: "", tratamentosRealizados: "", recomendacoes: "", dataRelatorio: new Date().toISOString().split("T")[0], }); const [relatoriosMedicos, setRelatoriosMedicos] = useState([]); const [editandoRelatorio, setEditandoRelatorio] = useState(null); // Estados para funcionalidades do prontuário const [consultasRegistradas, setConsultasRegistradas] = useState([]); const [historicoMedico, setHistoricoMedico] = useState([]); const [prescricoesMedicas, setPrescricoesMedicas] = useState([]); const [examesSolicitados, setExamesSolicitados] = useState([]); const [diagnosticos, setDiagnosticos] = useState([]); const [evolucaoQuadro, setEvolucaoQuadro] = useState([]); const [anexos, setAnexos] = useState([]); const [abaProntuarioAtiva, setAbaProntuarioAtiva] = useState("nova-consulta"); // Estados para campos principais da consulta const [consultaAtual, setConsultaAtual] = useState({ dataConsulta: new Date().toISOString().split("T")[0], anamnese: "", exameFisico: "", hipotesesDiagnosticas: "", condutaMedica: "", prescricoes: "", retornoAgendado: "", cid10: "", }); const [events, setEvents] = useState([ { id: 1, title: "Ana Souza", type: "Cardiologia", time: "09:00", date: new Date().toISOString().split("T")[0], pacienteId: "123.456.789-00", color: colorsByType.Cardiologia, }, { id: 2, title: "Bruno Lima", type: "Cardiologia", time: "10:30", date: new Date().toISOString().split("T")[0], pacienteId: "987.654.321-00", color: colorsByType.Cardiologia, }, { id: 3, title: "Carla Menezes", type: "Dermatologia", time: "14:00", date: new Date().toISOString().split("T")[0], pacienteId: "111.222.333-44", color: colorsByType.Dermatologia, }, ]); const [editingEvent, setEditingEvent] = useState(null); const [showPopup, setShowPopup] = useState(false); const [showActionModal, setShowActionModal] = useState(false); const [step, setStep] = useState(1); const [newEvent, setNewEvent] = useState({ title: "", type: "", time: "", pacienteId: "", }); const [selectedDate, setSelectedDate] = useState(null); const [selectedEvent, setSelectedEvent] = useState(null); const [currentCalendarDate, setCurrentCalendarDate] = useState(new Date()); const handleSave = (event: React.MouseEvent) => { event.preventDefault(); console.log("Laudo salvo!"); window.scrollTo({ top: 0, behavior: "smooth" }); }; const handleAbrirProntuario = (paciente: any) => { setPacienteSelecionado(paciente); const pacienteLaudo = document.getElementById( "pacienteLaudo", ) as HTMLInputElement; if (pacienteLaudo) pacienteLaudo.value = paciente.nome; const destinatario = document.getElementById( "destinatario", ) as HTMLInputElement; if (destinatario) destinatario.value = `${paciente.nome} - ${paciente.cpf}`; const prontuarioSection = document.getElementById("prontuario-paciente"); if (prontuarioSection) { prontuarioSection.scrollIntoView({ behavior: "smooth" }); } }; const handleFecharProntuario = () => { setPacienteSelecionado(null); }; const handleEditarLaudo = (paciente: any) => { setPatientForLaudo(paciente); setIsEditingLaudoForPatient(true); setActiveSection("laudos"); }; const navigateDate = (direction: "prev" | "next") => { const newDate = new Date(currentCalendarDate); newDate.setDate(newDate.getDate() + (direction === "next" ? 1 : -1)); setCurrentCalendarDate(newDate); }; const goToToday = () => { setCurrentCalendarDate(new Date()); }; const formatDate = (date: Date) => { return date.toLocaleDateString("pt-BR", { weekday: "long", day: "numeric", month: "long", year: "numeric", }); }; // Filtrar eventos do dia atual const getTodayEvents = () => { const today = currentCalendarDate.toISOString().split("T")[0]; return events .filter((event) => event.date === today) .sort((a, b) => a.time.localeCompare(b.time)); }; const getStatusColor = (type: string) => { return colorsByType[type as keyof typeof colorsByType] || "#4dabf7"; }; // Funções para o perfil const handleProfileChange = (field: string, value: string) => { setProfileData((previous) => ({ ...previous, [field]: value, })); }; const handleSaveProfile = () => { setIsEditingProfile(false); alert("Perfil atualizado com sucesso!"); }; const handleCancelEdit = () => { setIsEditingProfile(false); }; // Funções para relatórios médicos const handleRelatorioChange = (field: string, value: string) => { setRelatorioMedico((previous) => ({ ...previous, [field]: value, })); }; const handleSalvarRelatorio = () => { if (!relatorioMedico.pacienteNome || !relatorioMedico.motivoRelatorio) { alert( "Por favor, preencha pelo menos o nome do paciente e o motivo do relatório.", ); return; } const novoRelatorio = { ...relatorioMedico, id: Date.now(), dataGeracao: new Date().toLocaleString(), }; if (editandoRelatorio) { setRelatoriosMedicos((previous) => previous.map((rel) => rel.id === editandoRelatorio.id ? novoRelatorio : rel, ), ); setEditandoRelatorio(null); alert("Relatório médico atualizado com sucesso!"); } else { setRelatoriosMedicos((previous) => [novoRelatorio, ...previous]); alert("Relatório médico salvo com sucesso!"); } // Limpar formulário setRelatorioMedico({ pacienteNome: "", pacienteCpf: "", pacienteIdade: "", profissionalNome: medico.nome, profissionalCrm: medico.identificacao, motivoRelatorio: "", historicoClinico: "", sinaisSintomas: "", examesRealizados: "", resultadosExames: "", diagnosticos: "", prognostico: "", tratamentosRealizados: "", recomendacoes: "", dataRelatorio: new Date().toISOString().split("T")[0], }); }; const handleEditarRelatorio = (relatorio: any) => { setRelatorioMedico(relatorio); setEditandoRelatorio(relatorio); }; const handleExcluirRelatorio = (id: number) => { if (confirm("Tem certeza que deseja excluir este relatório médico?")) { setRelatoriosMedicos((previous) => previous.filter((rel) => rel.id !== id), ); alert("Relatório médico excluído com sucesso!"); } }; const handleCancelarEdicaoRelatorio = () => { setEditandoRelatorio(null); setRelatorioMedico({ pacienteNome: "", pacienteCpf: "", pacienteIdade: "", profissionalNome: medico.nome, profissionalCrm: medico.identificacao, motivoRelatorio: "", historicoClinico: "", sinaisSintomas: "", examesRealizados: "", resultadosExames: "", diagnosticos: "", prognostico: "", tratamentosRealizados: "", recomendacoes: "", dataRelatorio: new Date().toISOString().split("T")[0], }); }; const handleDateClick = (argument: any) => { setSelectedDate(argument.dateStr); setNewEvent({ title: "", type: "", time: "", pacienteId: "" }); setStep(1); setEditingEvent(null); setShowPopup(true); }; const handleAddEvent = () => { const paciente = pacientes.find((p) => p.nome === newEvent.title); const eventToAdd = { id: Date.now(), title: newEvent.title, type: newEvent.type, time: newEvent.time, date: selectedDate || currentCalendarDate.toISOString().split("T")[0], pacienteId: paciente ? paciente.cpf : "", color: colorsByType[newEvent.type as keyof typeof colorsByType] || "#4dabf7", }; setEvents((previous) => [...previous, eventToAdd]); setShowPopup(false); }; const handleEditEvent = () => { setEvents((previousEvents) => previousEvents.map((event_) => event_.id.toString() === editingEvent.id.toString() ? { ...event_, title: newEvent.title, type: newEvent.type, time: newEvent.time, color: colorsByType[newEvent.type as keyof typeof colorsByType] || "#4dabf7", } : event_, ), ); setEditingEvent(null); setShowPopup(false); setShowActionModal(false); }; const handleNextStep = () => { if (step < 3) setStep(step + 1); else editingEvent ? handleEditEvent() : handleAddEvent(); }; const handleEventClick = (clickInfo: any) => { setSelectedEvent(clickInfo.event); setShowActionModal(true); }; const handleDeleteEvent = () => { if (!selectedEvent) return; setEvents((previousEvents) => previousEvents.filter( (event_: any) => event_.id.toString() !== selectedEvent.id.toString(), ), ); setShowActionModal(false); }; const handleStartEdit = () => { if (!selectedEvent) return; setEditingEvent(selectedEvent); setNewEvent({ title: selectedEvent.title, type: selectedEvent.extendedProps.type, time: selectedEvent.extendedProps.time, pacienteId: selectedEvent.extendedProps.pacienteId || "", }); setStep(1); setShowActionModal(false); setShowPopup(true); }; const renderEventContent = (eventInfo: any) => { const bg = eventInfo.event.backgroundColor || eventInfo.event.extendedProps?.color || "#4dabf7"; return (
{eventInfo.event.title} {eventInfo.event.extendedProps.type} {eventInfo.event.extendedProps.time}
); }; const renderCalendarioSection = () => { const todayEvents = getTodayEvents(); return (

Agenda do Dia

{/* Navegação de Data */}

{formatDate(currentCalendarDate)}

{todayEvents.length} consulta{todayEvents.length !== 1 ? "s" : ""}{" "} agendada{todayEvents.length !== 1 ? "s" : ""}
{/* Lista de Pacientes do Dia */}
{todayEvents.length === 0 ? (

Nenhuma consulta agendada para este dia

Agenda livre para este dia

) : ( todayEvents.map((appointment) => { const paciente = pacientes.find( (p) => p.nome === appointment.title, ); return (
{appointment.title}
{paciente && (
CPF: {paciente.cpf} • {paciente.idade} anos
)}
{appointment.time}
{appointment.type}
Ver informações do paciente
); }) )}
); }; function PacientesSection({ handleAbrirProntuario, setActiveSection, }: { handleAbrirProntuario: (paciente: any) => void; setActiveSection: (section: string) => void; }) { return (

Gerenciamento de Pacientes

{/* Tabela de pacientes padrão */}

Pacientes Recentes

Paciente CPF Idade Status do laudo Ações {pacientes.map((paciente) => ( {paciente.nome} {paciente.cpf} {paciente.idade} {paciente.statusLaudo}
Ver informações do paciente
))}
); } const renderProntuarioSection = () => (

Prontuário do Paciente

{/* Informações do Paciente Selecionado */} {pacienteSelecionado && (

Dados do Paciente

Nome:

{pacienteSelecionado.nome}

CPF:

{pacienteSelecionado.cpf}

Idade:

{pacienteSelecionado.idade} anos

)} {/* Seletor de Paciente */} {!pacienteSelecionado && (

Selecionar Paciente

Escolha um paciente para visualizar o prontuário completo

{/* Cards de pacientes para seleção rápida */}

Ou selecione rapidamente:

{pacientes.map((paciente) => (
setPacienteSelecionado(paciente)} className="border rounded-lg p-4 hover:shadow-md hover:border-primary transition-all cursor-pointer group" >

{paciente.nome}

CPF: {paciente.cpf}

{paciente.idade} anos

{paciente.statusLaudo}
))}
)} {/* Tabs de Navegação do Prontuário */} {pacienteSelecionado && (
)} {/* Conteúdo das Abas */} {pacienteSelecionado && (
{abaProntuarioAtiva === "nova-consulta" && renderNovaConsultaTab()} {abaProntuarioAtiva === "consultas" && renderConsultasTab()} {abaProntuarioAtiva === "historico" && renderHistoricoTab()} {abaProntuarioAtiva === "prescricoes" && renderPrescricoesTab()} {abaProntuarioAtiva === "exames" && renderExamesTab()} {abaProntuarioAtiva === "diagnosticos" && renderDiagnosticosTab()} {abaProntuarioAtiva === "evolucao" && renderEvolucaoTab()} {abaProntuarioAtiva === "anexos" && renderAnexosTab()}
)}
); // Função para alterar campos da consulta atual const handleConsultaChange = (field: string, value: string) => { setConsultaAtual((previous) => ({ ...previous, [field]: value, })); }; // Função para salvar a consulta const handleSalvarConsulta = () => { if (!consultaAtual.anamnese || !consultaAtual.exameFisico) { alert("Por favor, preencha os campos que são obrigatórios."); return; } const novaConsulta = { ...consultaAtual, id: Date.now(), paciente: pacienteSelecionado?.nome, dataCriacao: new Date().toLocaleString(), profissional: medico.nome, }; setConsultasRegistradas((previous) => [novaConsulta, ...previous]); setConsultaAtual({ dataConsulta: new Date().toISOString().split("T")[0], anamnese: "", exameFisico: "", hipotesesDiagnosticas: "", condutaMedica: "", prescricoes: "", retornoAgendado: "", cid10: "", }); alert("Consulta registrada com sucesso!"); }; // Funções para renderizar cada aba do prontuário const renderNovaConsultaTab = () => (

Registrar Nova Consulta

{/* Data da Consulta */}
handleConsultaChange("dataConsulta", e.target.value) } className="w-full" />
handleConsultaChange("cid10", e.target.value)} placeholder="Ex: I10, E11, etc." className="w-full" />
{/* Anamnese */}