"use client"; import { useEffect, useMemo, useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { MoreHorizontal, Plus, Search, Eye, Edit, Trash2, ArrowLeft } from "lucide-react"; import { Paciente, Endereco, listarPacientes, buscarPacientePorId, excluirPaciente } from "@/lib/api"; import { PatientRegistrationForm } from "@/components/forms/patient-registration-form"; function normalizePaciente(p: any): Paciente { const endereco: Endereco = { cep: p.endereco?.cep ?? p.cep ?? "", logradouro: p.endereco?.logradouro ?? p.logradouro ?? "", numero: p.endereco?.numero ?? p.numero ?? "", complemento: p.endereco?.complemento ?? p.complemento ?? "", bairro: p.endereco?.bairro ?? p.bairro ?? "", cidade: p.endereco?.cidade ?? p.cidade ?? "", estado: p.endereco?.estado ?? p.estado ?? "", }; return { id: String(p.id ?? p.uuid ?? p.paciente_id ?? ""), nome: p.nome ?? "", nome_social: p.nome_social ?? null, cpf: p.cpf ?? "", rg: p.rg ?? null, sexo: p.sexo ?? null, data_nascimento: p.data_nascimento ?? null, telefone: p.telefone ?? "", email: p.email ?? "", endereco, observacoes: p.observacoes ?? null, foto_url: p.foto_url ?? null, }; } export default function PacientesPage() { const [patients, setPatients] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [search, setSearch] = useState(""); const [showForm, setShowForm] = useState(false); const [editingId, setEditingId] = useState(null); const [viewingPatient, setViewingPatient] = useState(null); async function loadAll() { try { setLoading(true); const data = await listarPacientes({ page: 1, limit: 20 }); setPatients((data ?? []).map(normalizePaciente)); setError(null); } catch (e: any) { setPatients([]); setError(e?.message || "Erro ao carregar pacientes."); } finally { setLoading(false); } } useEffect(() => { loadAll(); }, []); const filtered = useMemo(() => { if (!search.trim()) return patients; const q = search.toLowerCase(); const qDigits = q.replace(/\D/g, ""); return patients.filter((p) => { const byName = (p.nome || "").toLowerCase().includes(q); const byCPF = (p.cpf || "").replace(/\D/g, "").includes(qDigits); const byId = String(p.id || "").includes(qDigits); return byName || byCPF || byId; }); }, [patients, search]); function handleAdd() { setEditingId(null); setShowForm(true); } function handleEdit(id: string) { setEditingId(id); setShowForm(true); } function handleView(patient: Paciente) { setViewingPatient(patient); } async function handleDelete(id: string) { if (!confirm("Excluir este paciente?")) return; try { await excluirPaciente(id); setPatients((prev) => prev.filter((x) => String(x.id) !== String(id))); } catch (e: any) { alert(e?.message || "Não foi possível excluir."); } } function handleSaved(p: Paciente) { const saved = normalizePaciente(p); setPatients((prev) => { const i = prev.findIndex((x) => String(x.id) === String(saved.id)); if (i < 0) return [saved, ...prev]; const clone = [...prev]; clone[i] = saved; return clone; }); setShowForm(false); } async function handleBuscarServidor() { const q = search.trim(); if (!q) return loadAll(); if (/^\d+$/.test(q)) { try { setLoading(true); const one = await buscarPacientePorId(q); setPatients(one ? [normalizePaciente(one)] : []); setError(one ? null : "Paciente não encontrado."); } catch (e: any) { setPatients([]); setError(e?.message || "Paciente não encontrado."); } finally { setLoading(false); } return; } await loadAll(); setTimeout(() => setSearch(q), 0); } if (loading) return

Carregando pacientes...

; if (error) return

{error}

; if (showForm) { return (

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

setShowForm(false)} />
); } return (

Pacientes

Gerencie os pacientes

setSearch(e.target.value)} onKeyDown={(e) => e.key === "Enter" && handleBuscarServidor()} />
Nome CPF Telefone Cidade Estado Ações {filtered.length > 0 ? ( filtered.map((p) => ( {p.nome || "(sem nome)"} {p.cpf || "-"} {p.telefone || "-"} {p.endereco?.cidade || "-"} {p.endereco?.estado || "-"} handleView(p)}> Ver handleEdit(String(p.id))}> Editar handleDelete(String(p.id))} className="text-destructive"> Excluir )) ) : ( Nenhum paciente encontrado )}
{viewingPatient && ( setViewingPatient(null)}> Detalhes do Paciente Informações detalhadas de {viewingPatient.nome}.
{viewingPatient.nome}
{viewingPatient.cpf}
{viewingPatient.telefone}
{`${viewingPatient.endereco?.logradouro || ''}, ${viewingPatient.endereco?.numero || ''} - ${viewingPatient.endereco?.bairro || ''}, ${viewingPatient.endereco?.cidade || ''} - ${viewingPatient.endereco?.estado || ''}`}
{viewingPatient.observacoes || "Nenhuma"}
)}
Mostrando {filtered.length} de {patients.length}
); }