'use client' import { useState } from 'react' import type { ReactNode } from 'react' import { useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '@/components/ui/dialog' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Avatar, AvatarFallback } from '@/components/ui/avatar' import { User, LogOut, Calendar, FileText, MessageCircle, UserCog, Home, Clock, FolderOpen, ChevronLeft, ChevronRight, MapPin, Stethoscope } from 'lucide-react' import { SimpleThemeToggle } from '@/components/simple-theme-toggle' import { UploadAvatar } from '@/components/ui/upload-avatar' import Link from 'next/link' import ProtectedRoute from '@/components/ProtectedRoute' import { useAuth } from '@/hooks/useAuth' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' // Simulação de internacionalização básica const strings = { dashboard: 'Dashboard', consultas: 'Consultas', exames: 'Exames & Laudos', mensagens: 'Mensagens', perfil: 'Perfil', sair: 'Sair', proximaConsulta: 'Próxima Consulta', ultimosExames: 'Últimos Exames', mensagensNaoLidas: 'Mensagens Não Lidas', agendar: 'Agendar', reagendar: 'Reagendar', cancelar: 'Cancelar', detalhes: 'Detalhes', adicionarCalendario: 'Adicionar ao calendário', visualizarLaudo: 'Visualizar Laudo', download: 'Download', compartilhar: 'Compartilhar', inbox: 'Caixa de Entrada', enviarMensagem: 'Enviar Mensagem', salvar: 'Salvar', editarPerfil: 'Editar Perfil', consentimentos: 'Consentimentos', notificacoes: 'Preferências de Notificação', vazio: 'Nenhum dado encontrado.', erro: 'Ocorreu um erro. Tente novamente.', carregando: 'Carregando...', sucesso: 'Salvo com sucesso!', erroSalvar: 'Erro ao salvar.', } export default function PacientePage() { const { logout, user } = useAuth() const [tab, setTab] = useState<'dashboard'|'consultas'|'exames'|'mensagens'|'perfil'>('dashboard') // Simulação de loaders, empty states e erro const [loading, setLoading] = useState(false) const [error, setError] = useState('') const [toast, setToast] = useState<{type: 'success'|'error', msg: string}|null>(null) // Acessibilidade: foco visível e ordem de tabulação garantidos por padrão nos botões e inputs const handleLogout = async () => { setLoading(true) setError('') try { await logout() } catch { setError(strings.erro) } finally { setLoading(false) } } // Estado para edição do perfil const [isEditingProfile, setIsEditingProfile] = useState(false) const [profileData, setProfileData] = useState({ id: user?.id || '', nome: "Maria Silva Santos", email: user?.email || "paciente@example.com", telefone: "(11) 99999-9999", endereco: "Rua das Flores, 123", cidade: "São Paulo", cep: "01234-567", biografia: "Paciente desde 2020. Histórico de consultas e exames regulares.", foto_url: user?.profile?.foto_url }) interface ProfileData { id: string; nome: string; email: string; telefone: string; endereco: string; cidade: string; cep: string; biografia: string; foto_url?: string; } const handleProfileChange = (field: keyof ProfileData | string, value: any) => { setProfileData((prev: ProfileData) => ({ ...prev, [field]: value })) } const handleSaveProfile = () => { setIsEditingProfile(false) setToast({ type: 'success', msg: strings.sucesso }) } const handleCancelEdit = () => { setIsEditingProfile(false) } function DashboardCards() { return (
{strings.proximaConsulta} 12/10/2025 {strings.ultimosExames} 2 {strings.mensagensNaoLidas} 1
) } // Consultas fictícias const [currentDate, setCurrentDate] = useState(new Date()) const consultasFicticias = [ { id: 1, medico: "Dr. Carlos Andrade", especialidade: "Cardiologia", local: "Clínica Coração Feliz", data: new Date().toISOString().split('T')[0], hora: "09:00", status: "Confirmada" }, { id: 2, medico: "Dra. Fernanda Lima", especialidade: "Dermatologia", local: "Clínica Pele Viva", data: new Date().toISOString().split('T')[0], hora: "14:30", status: "Pendente" }, { id: 3, medico: "Dr. João Silva", especialidade: "Ortopedia", local: "Hospital Ortopédico", data: (() => { let d = new Date(); d.setDate(d.getDate()+1); return d.toISOString().split('T')[0] })(), hora: "11:00", status: "Cancelada" }, ]; function formatDatePt(date: Date) { return date.toLocaleDateString('pt-BR', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }); } function navigateDate(direction: 'prev' | 'next') { const newDate = new Date(currentDate); newDate.setDate(newDate.getDate() + (direction === 'next' ? 1 : -1)); setCurrentDate(newDate); } function goToToday() { setCurrentDate(new Date()); } const todayStr = currentDate.toISOString().split('T')[0]; const consultasDoDia = consultasFicticias.filter(c => c.data === todayStr); function Consultas() { const router = useRouter() const [tipoConsulta, setTipoConsulta] = useState<'teleconsulta' | 'presencial'>('teleconsulta') const [especialidade, setEspecialidade] = useState('cardiologia') const [localizacao, setLocalizacao] = useState('') const [mostrarAgendadas, setMostrarAgendadas] = useState(false) const hoverPrimaryClass = "transition duration-200 hover:bg-[#2563eb] hover:text-white focus-visible:ring-2 focus-visible:ring-[#2563eb]/60 active:scale-[0.97]" const activeToggleClass = "w-full transition duration-200 focus-visible:ring-2 focus-visible:ring-[#2563eb]/60 active:scale-[0.97] bg-[#2563eb] text-white hover:bg-[#2563eb] hover:text-white" const inactiveToggleClass = "w-full transition duration-200 bg-slate-50 text-[#2563eb] border border-[#2563eb]/30 hover:bg-slate-100 hover:text-[#2563eb] dark:bg-white/5 dark:text-white dark:hover:bg-white/10 dark:border-white/20" const hoverPrimaryIconClass = "rounded-xl bg-white text-[#1e293b] border border-black/10 shadow-[0_2px_8px_rgba(0,0,0,0.03)] transition duration-200 hover:bg-[#2563eb] hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#2563eb] dark:bg-slate-800 dark:text-slate-100 dark:border-white/10 dark:shadow-none dark:hover:bg-[#2563eb] dark:hover:text-white" const today = new Date(); today.setHours(0, 0, 0, 0); const selectedDate = new Date(currentDate); selectedDate.setHours(0, 0, 0, 0); const isSelectedDateToday = selectedDate.getTime() === today.getTime() const handlePesquisar = () => { const params = new URLSearchParams({ tipo: tipoConsulta, especialidade, local: localizacao }) router.push(`/resultados?${params.toString()}`) } return (

Agende sua próxima consulta

Escolha o formato ideal, selecione a especialidade e encontre o profissional perfeito para você.

setLocalizacao(event.target.value)} placeholder="Cidade ou estado" className="pl-9" />
setMostrarAgendadas(open)}> Consultas agendadas Gerencie suas consultas confirmadas, pendentes ou canceladas.
{formatDatePt(currentDate)} {isSelectedDateToday && ( )}
{consultasDoDia.length} consulta{consultasDoDia.length !== 1 ? 's' : ''} agendada{consultasDoDia.length !== 1 ? 's' : ''}
{consultasDoDia.length === 0 ? (

Nenhuma consulta agendada para este dia

Use a busca para marcar uma nova consulta.

) : ( consultasDoDia.map(consulta => (
{consulta.medico}

{consulta.especialidade} • {consulta.local}

{consulta.hora}
{consulta.status}
{consulta.status !== 'Cancelada' && ( )} {consulta.status !== 'Cancelada' && ( )}
)) )}
) } // Exames e laudos fictícios const examesFicticios = [ { id: 1, nome: "Hemograma Completo", data: "2025-09-20", status: "Disponível", prontuario: "Paciente apresenta hemograma dentro dos padrões de normalidade. Sem alterações significativas.", }, { id: 2, nome: "Raio-X de Tórax", data: "2025-08-10", status: "Disponível", prontuario: "Exame radiológico sem evidências de lesões pulmonares. Estruturas cardíacas normais.", }, { id: 3, nome: "Eletrocardiograma", data: "2025-07-05", status: "Disponível", prontuario: "Ritmo sinusal, sem arritmias. Exame dentro da normalidade.", }, ]; const laudosFicticios = [ { id: 1, nome: "Laudo Hemograma Completo", data: "2025-09-21", status: "Assinado", laudo: "Hemoglobina, hematócrito, leucócitos e plaquetas dentro dos valores de referência. Sem anemias ou infecções detectadas.", }, { id: 2, nome: "Laudo Raio-X de Tórax", data: "2025-08-11", status: "Assinado", laudo: "Radiografia sem alterações. Parênquima pulmonar preservado. Ausência de derrame pleural.", }, { id: 3, nome: "Laudo Eletrocardiograma", data: "2025-07-06", status: "Assinado", laudo: "ECG normal. Não há sinais de isquemia ou sobrecarga.", }, ]; const [exameSelecionado, setExameSelecionado] = useState(null) const [laudoSelecionado, setLaudoSelecionado] = useState(null) function ExamesLaudos() { return (

Exames

Meus Exames

{examesFicticios.map(exame => (
{exame.nome}
Data: {new Date(exame.data).toLocaleDateString('pt-BR')}
))}

Laudos

Meus Laudos

{laudosFicticios.map(laudo => (
{laudo.nome}
Data: {new Date(laudo.data).toLocaleDateString('pt-BR')}
))}
{/* Modal Prontuário Exame */} !open && setExameSelecionado(null)}> Prontuário do Exame {exameSelecionado && ( <>
{exameSelecionado.nome}
Data: {new Date(exameSelecionado.data).toLocaleDateString('pt-BR')}
{exameSelecionado.prontuario}
)}
{/* Modal Visualizar Laudo */} !open && setLaudoSelecionado(null)}> Laudo Médico {laudoSelecionado && ( <>
{laudoSelecionado.nome}
Data: {new Date(laudoSelecionado.data).toLocaleDateString('pt-BR')}
{laudoSelecionado.laudo}
)}
) } // Mensagens fictícias recebidas do médico const mensagensFicticias = [ { id: 1, medico: "Dr. Carlos Andrade", data: "2025-10-06T15:30:00", conteudo: "Olá Maria, seu exame de hemograma está normal. Parabéns por manter seus exames em dia!", lida: false }, { id: 2, medico: "Dra. Fernanda Lima", data: "2025-09-21T10:15:00", conteudo: "Maria, seu laudo de Raio-X já está disponível no sistema. Qualquer dúvida, estou à disposição.", lida: true }, { id: 3, medico: "Dr. João Silva", data: "2025-08-12T09:00:00", conteudo: "Bom dia! Lembre-se de agendar seu retorno para acompanhamento da ortopedia.", lida: true }, ]; function Mensagens() { return (

Mensagens Recebidas

{mensagensFicticias.length === 0 ? (

Nenhuma mensagem recebida

Você ainda não recebeu mensagens dos seus médicos.

) : ( mensagensFicticias.map(msg => (
{msg.medico} {!msg.lida && Nova}
{new Date(msg.data).toLocaleString('pt-BR')}
{msg.conteudo}
)) )}
) } function Perfil() { return (

Meu Perfil

{!isEditingProfile ? ( ) : (
)}
{/* Informações Pessoais */}

Informações Pessoais

{profileData.nome}

Este campo não pode ser alterado
{isEditingProfile ? ( handleProfileChange('email', e.target.value)} /> ) : (

{profileData.email}

)}
{isEditingProfile ? ( handleProfileChange('telefone', e.target.value)} /> ) : (

{profileData.telefone}

)}
{/* Endereço e Contato */}

Endereço

{isEditingProfile ? ( handleProfileChange('endereco', e.target.value)} /> ) : (

{profileData.endereco}

)}
{isEditingProfile ? ( handleProfileChange('cidade', e.target.value)} /> ) : (

{profileData.cidade}

)}
{isEditingProfile ? ( handleProfileChange('cep', e.target.value)} /> ) : (

{profileData.cep}

)}
{isEditingProfile ? (