'use client'
// import { useAuth } from '@/hooks/useAuth' // removido duplicado
import { useState } from 'react'
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 Link from 'next/link'
import ProtectedRoute from '@/components/ProtectedRoute'
import { useAuth } from '@/hooks/useAuth'
// 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({
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.",
})
const handleProfileChange = (field: string, value: string) => {
setProfileData(prev => ({ ...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(dateStr: string) {
const date = new Date(dateStr);
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() {
return (
Minhas Consultas
{/* Navegação de Data */}
navigateDate('prev')} className="p-2">
{formatDatePt(todayStr)}
navigateDate('next')} className="p-2">
Hoje
{consultasDoDia.length} consulta{consultasDoDia.length !== 1 ? 's' : ''} agendada{consultasDoDia.length !== 1 ? 's' : ''}
{/* Lista de Consultas do Dia */}
{consultasDoDia.length === 0 ? (
Nenhuma consulta agendada para este dia
Você pode agendar uma nova consulta
Agendar Consulta
) : (
consultasDoDia.map(consulta => (
{consulta.medico}
{consulta.especialidade} • {consulta.local}
{consulta.hora}
Detalhes
{consulta.status !== 'Cancelada' && Reagendar }
{consulta.status !== 'Cancelada' && Cancelar }
))
)}
)
}
// 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')}
setExameSelecionado(exame)}>Ver Prontuário
Download
))}
Laudos
Meus Laudos
{laudosFicticios.map(laudo => (
{laudo.nome}
Data: {new Date(laudo.data).toLocaleDateString('pt-BR')}
setLaudoSelecionado(laudo)}>Visualizar
Compartilhar
))}
{/* Modal Prontuário Exame */}
!open && setExameSelecionado(null)}>
Prontuário do Exame
{exameSelecionado && (
<>
{exameSelecionado.nome}
Data: {new Date(exameSelecionado.data).toLocaleDateString('pt-BR')}
{exameSelecionado.prontuario}
>
)}
setExameSelecionado(null)}>Fechar
{/* Modal Visualizar Laudo */}
!open && setLaudoSelecionado(null)}>
Laudo Médico
{laudoSelecionado && (
<>
{laudoSelecionado.nome}
Data: {new Date(laudoSelecionado.data).toLocaleDateString('pt-BR')}
{laudoSelecionado.laudo}
>
)}
setLaudoSelecionado(null)}>Fechar
)
}
// 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 ? (
setIsEditingProfile(true)} className="flex items-center gap-2">
Editar Perfil
) : (
Salvar
Cancelar
)}
{/* Informações Pessoais */}
Informações Pessoais
Nome Completo
{profileData.nome}
Este campo não pode ser alterado
Email
{isEditingProfile ? (
handleProfileChange('email', e.target.value)} />
) : (
{profileData.email}
)}
Telefone
{isEditingProfile ? (
handleProfileChange('telefone', e.target.value)} />
) : (
{profileData.telefone}
)}
{/* Endereço e Contato */}
Endereço
Endereço
{isEditingProfile ? (
handleProfileChange('endereco', e.target.value)} />
) : (
{profileData.endereco}
)}
Cidade
{isEditingProfile ? (
handleProfileChange('cidade', e.target.value)} />
) : (
{profileData.cidade}
)}
CEP
{isEditingProfile ? (
handleProfileChange('cep', e.target.value)} />
) : (
{profileData.cep}
)}
Biografia
{isEditingProfile ? (
{/* Foto do Perfil */}
Foto do Perfil
{profileData.nome.split(' ').map(n => n[0]).join('').toUpperCase()}
{isEditingProfile && (
Alterar Foto
Formatos aceitos: JPG, PNG (máx. 2MB)
)}
)
}
// Renderização principal
return (
{/* Header só com título e botão de sair */}
{/* Sidebar vertical */}
setTab('dashboard')} className="justify-start"> {strings.dashboard}
setTab('consultas')} className="justify-start"> {strings.consultas}
setTab('exames')} className="justify-start"> {strings.exames}
setTab('mensagens')} className="justify-start"> {strings.mensagens}
setTab('perfil')} className="justify-start"> {strings.perfil}
{/* Conteúdo principal */}
{/* Toasts de feedback */}
{toast && (
{toast.msg}
)}
{/* Loader global */}
{loading &&
{strings.carregando}
}
{error &&
{error}
}
{/* Conteúdo principal */}
{!loading && !error && (
{tab==='dashboard' && }
{tab==='consultas' && }
{tab==='exames' && }
{tab==='mensagens' && }
{tab==='perfil' && }
)}
)
}