import { useEffect, useMemo, useState } from "react"; import { showCompDocDraftSavedToast } from "@/app/(protected)/workorders/_components/comp-doc/comp-doc-draft-toast"; import { useLocationDetail } from "@/domain/locations/use-cases/use-location-detail"; import type { CompDocData, CompDocSaveStatus, DocFields, DocState, } from "@/domain/work-orders/types/completion-doc"; import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row"; import { getMockWoWizardLocationDetail } from "@/domain/work-orders/mocks/wo-wizard-mock-data"; import { buildDocHtml, printDoc } from "@/domain/work-orders/utils/completion-doc-html"; import { resolveCompDocSite } from "@/domain/work-orders/utils/completion-doc-site"; import { DOC_STATE_CFG, docStateOf, fmtDocNow, } from "@/domain/work-orders/utils/completion-doc-state"; type UseCompDocDialogParams = { row: WorkOrderTableRow; open: boolean; data?: CompDocData; onSave: (data: CompDocData, status: CompDocSaveStatus) => void; onDateCompletedChange?: (date: string) => void; }; export function useCompDocDialog({ row, open, data, onSave, onDateCompletedChange, }: UseCompDocDialogParams) { const locId = String(row.locationId || ""); const isMockLocation = locId.startsWith("mock-"); const { data: apiLocationDetail } = useLocationDetail( isMockLocation || !locId ? undefined : locId, ); const locationDetail = isMockLocation ? getMockWoWizardLocationDetail(locId) : apiLocationDetail; const site = useMemo(() => resolveCompDocSite(row, locationDetail), [row, locationDetail]); const [notes, setNotes] = useState(""); const [docState, setDocState] = useState("draft"); const [generatedAt, setGeneratedAt] = useState(""); const [editDateCompleted, setEditDateCompleted] = useState(""); useEffect(() => { if (!open) return; setNotes(data?.notes ?? ""); setDocState(docStateOf(row.docStatus)); setGeneratedAt(data?.generatedAt ?? ""); setEditDateCompleted(row.completedDate || ""); }, [open, row.id, row.docStatus, row.completedDate, data?.notes, data?.generatedAt]); const amazonRep = row.pocName || ""; const seaRep = row.tech || ""; const cfg = DOC_STATE_CFG[docState]; const isNotRequired = docState === "not-required"; const isGenerated = docState === "generated"; const docFields: DocFields = { street: site.street, city: site.city, state: site.state, zip: site.zip, dateCompleted: editDateCompleted, amazonRep, seaRep, }; function persist(extra: Partial, status: CompDocSaveStatus) { onSave({ notes, generatedAt, ...extra }, status); } function syncCompletedDateIfChanged() { if (editDateCompleted !== (row.completedDate || "")) { onDateCompletedChange?.(editDateCompleted); } } function handleMarkNotRequired() { setDocState("not-required"); persist({}, "NN"); } function handleUndo() { setDocState("draft"); persist({}, "No"); } function handleSaveDraft() { persist({}, "No"); syncCompletedDateIfChanged(); showCompDocDraftSavedToast(); } function handleGenerate() { const ts = fmtDocNow(); setGeneratedAt(ts); setDocState("generated"); persist({ generatedAt: ts }, "Yes"); syncCompletedDateIfChanged(); } function handleDownloadPdf() { printDoc(buildDocHtml(row, { notes, generatedAt }, docFields)); } return { site, notes, setNotes, docState, generatedAt, editDateCompleted, setEditDateCompleted, amazonRep, seaRep, cfg, isNotRequired, isGenerated, handleMarkNotRequired, handleUndo, handleSaveDraft, handleGenerate, handleDownloadPdf, }; }