"use client";
// import { useAuth } from '@/hooks/useAuth' // removido duplicado
import { useState } 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 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({
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((previous) => ({ ...previous, [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 todayString = currentDate.toISOString().split("T")[0];
const consultasDoDia = consultasFicticias.filter(
(c) => c.data === todayString,
);
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 (
Tipo de consulta
setTipoConsulta('teleconsulta')}
>
Teleconsulta
setTipoConsulta('presencial')}
>
Consulta no local
Especialidade
Cardiologia
Pediatria
Dermatologia
Ortopedia
Ginecologia
Pesquisar
setMostrarAgendadas(true)}
>
Ver consultas agendadas
setMostrarAgendadas(open)}>
Consultas agendadas
Gerencie suas consultas confirmadas, pendentes ou canceladas.
navigateDate('prev')}
aria-label="Dia anterior"
className={`group shadow-sm ${hoverPrimaryIconClass}`}
>
{formatDatePt(currentDate)}
navigateDate('next')}
aria-label="Próximo dia"
className={`group shadow-sm ${hoverPrimaryIconClass}`}
>
{isSelectedDateToday && (
Hoje
)}
{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}
Detalhes
{consulta.status !== 'Cancelada' && (
Reagendar
)}
{consulta.status !== 'Cancelada' && (
Cancelar
)}
))
)}
setMostrarAgendadas(false)} className="w-full sm:w-auto">
Fechar
);
}
// 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 | (typeof examesFicticios)[0]
>(null);
const [laudoSelecionado, setLaudoSelecionado] = useState<
null | (typeof laudosFicticios)[0]
>(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((message) => (
{message.medico}
{!message.lida && (
Nova
)}
{new Date(message.data).toLocaleString("pt-BR")}
{message.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" && }
)}
);
}