import { useState, useEffect } from "react"; import toast from "react-hot-toast"; import { Search, FileText, Download, Plus, Eye, Edit2, X } from "lucide-react"; import jsPDF from "jspdf"; import html2canvas from "html2canvas"; import { reportService, type Report, patientService, type Patient, } from "../../services"; export function SecretaryReportList() { const [reports, setReports] = useState([]); const [loading, setLoading] = useState(false); const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState(""); const [showCreateModal, setShowCreateModal] = useState(false); const [showViewModal, setShowViewModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const [selectedReport, setSelectedReport] = useState(null); const [patients, setPatients] = useState([]); const [formData, setFormData] = useState({ patient_id: "", exam: "", diagnosis: "", conclusion: "", status: "draft" as "draft" | "completed" | "pending" | "cancelled", cid_code: "", requested_by: "", }); useEffect(() => { loadReports(); loadPatients(); }, []); const loadPatients = async () => { try { const data = await patientService.list(); setPatients(Array.isArray(data) ? data : []); } catch (error) { console.error("Erro ao carregar pacientes:", error); } }; const handleOpenCreateModal = () => { setFormData({ patient_id: "", exam: "", diagnosis: "", conclusion: "", status: "draft", cid_code: "", requested_by: "", }); setShowCreateModal(true); }; const handleViewReport = (report: Report) => { setSelectedReport(report); setShowViewModal(true); }; const handleOpenEditModal = (report: Report) => { setSelectedReport(report); setFormData({ patient_id: report.patient_id, exam: report.exam || "", diagnosis: report.diagnosis || "", conclusion: report.conclusion || "", status: report.status || "draft", cid_code: report.cid_code || "", requested_by: report.requested_by || "", }); setShowEditModal(true); }; const handleCreateReport = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.patient_id) { toast.error("Selecione um paciente"); return; } try { await reportService.create({ patient_id: formData.patient_id, exam: formData.exam, diagnosis: formData.diagnosis, conclusion: formData.conclusion, }); toast.success("Relatório criado com sucesso!"); setShowCreateModal(false); loadReports(); } catch (error) { console.error("Erro ao criar relatório:", error); toast.error("Erro ao criar relatório"); } }; const handleUpdateReport = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedReport?.id) { toast.error("Relatório não identificado"); return; } try { await reportService.update(selectedReport.id, { patient_id: formData.patient_id, exam: formData.exam || undefined, diagnosis: formData.diagnosis || undefined, conclusion: formData.conclusion || undefined, status: formData.status, cid_code: formData.cid_code || undefined, requested_by: formData.requested_by || undefined, }); toast.success("Relatório atualizado com sucesso!"); setShowEditModal(false); setSelectedReport(null); loadReports(); } catch (error) { console.error("Erro ao atualizar relatório:", error); toast.error("Erro ao atualizar relatório"); } }; const handleDownloadReport = async (report: Report) => { try { // Criar um elemento temporário para o relatório const reportElement = document.createElement("div"); reportElement.style.padding = "40px"; reportElement.style.backgroundColor = "white"; reportElement.style.width = "800px"; reportElement.style.fontFamily = "Arial, sans-serif"; reportElement.innerHTML = `

Relatório Médico

${report.order_number || "—"}

STATUS

${ report.status === "completed" ? "✅ Concluído" : report.status === "pending" ? "⏳ Pendente" : report.status === "draft" ? "📝 Rascunho" : "❌ Cancelado" }

DATA

${formatDate(report.created_at)}

${report.exam ? `

EXAME REALIZADO

${report.exam}

` : ""} ${report.cid_code ? `

CÓDIGO CID-10

${report.cid_code}

` : ""} ${report.requested_by ? `

SOLICITADO POR

${report.requested_by}

` : ""} ${report.diagnosis ? `

DIAGNÓSTICO

${report.diagnosis}

` : ""} ${report.conclusion ? `

CONCLUSÃO

${report.conclusion}

` : ""}

Documento gerado em ${new Date().toLocaleDateString("pt-BR", { day: "2-digit", month: "long", year: "numeric" })}

`; // Adicionar ao DOM temporariamente document.body.appendChild(reportElement); // Capturar como imagem const canvas = await html2canvas(reportElement, { scale: 2, backgroundColor: "#ffffff", logging: false, }); // Remover elemento temporário document.body.removeChild(reportElement); // Criar PDF const imgWidth = 210; // A4 width in mm const imgHeight = (canvas.height * imgWidth) / canvas.width; const pdf = new jsPDF("p", "mm", "a4"); const imgData = canvas.toDataURL("image/png"); pdf.addImage(imgData, "PNG", 0, 0, imgWidth, imgHeight); pdf.save(`relatorio-${report.order_number || "sem-numero"}.pdf`); toast.success("Relatório baixado com sucesso!"); } catch (error) { console.error("Erro ao gerar PDF:", error); toast.error("Erro ao gerar PDF do relatório"); } }; const loadReports = async () => { setLoading(true); try { const data = await reportService.list(); console.log("✅ Relatórios carregados:", data); setReports(Array.isArray(data) ? data : []); if (Array.isArray(data) && data.length === 0) { console.warn("⚠️ Nenhum relatório encontrado na API"); } } catch (error) { console.error("❌ Erro ao carregar relatórios:", error); toast.error("Erro ao carregar relatórios"); setReports([]); } finally { setLoading(false); } }; const handleSearch = () => { loadReports(); }; const handleClear = () => { setSearchTerm(""); setStatusFilter(""); loadReports(); }; const formatDate = (dateString: string) => { try { const date = new Date(dateString); return date.toLocaleDateString("pt-BR", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", }); } catch { return "—"; } }; return (
{/* Header */}

Relatórios

Visualize e baixe relatórios do sistema

{/* Search and Filters */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" />
Status:
{/* Table */}
{loading ? ( ) : reports.length === 0 ? ( ) : ( reports.map((report) => ( )) )}
Relatório Status Criado Em Solicitante Ações
Carregando relatórios...
Nenhum relatório encontrado

{report.order_number}

{report.exam || "Sem exame"}

{report.status === "completed" ? "Concluído" : report.status === "pending" ? "Pendente" : report.status === "draft" ? "Rascunho" : "Cancelado"} {formatDate(report.created_at)} {report.requested_by || "—"}
{/* Modal de Criar Relatório */} {showCreateModal && (

Novo Relatório

setFormData({ ...formData, exam: e.target.value }) } className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500" placeholder="Nome do exame realizado" />