"use client"; import { use, useState } from "react"; import { notFound, useRouter, useSearchParams } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { ArrowLeft, Download, FileText, Loader2, Pencil, Upload, X } from "lucide-react"; import Link from "next/link"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { RevisionHistory } from "@/components/drawings/revision-history"; import { format } from "date-fns"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { contractDrawingService } from "@/lib/services/contract-drawing.service"; import { shopDrawingService } from "@/lib/services/shop-drawing.service"; import { asBuiltDrawingService } from "@/lib/services/asbuilt-drawing.service"; import { useUpdateContractDrawing, useUploadRevision } from "@/hooks/use-drawing"; type DrawingType = "CONTRACT" | "SHOP" | "AS_BUILT"; interface FetchedDrawing { _type: DrawingType; uuid: string; contractDrawingNo?: string; drawingNumber?: string; title?: string; volumePage?: number; createdAt?: string; updatedAt?: string; currentRevision?: { title?: string; revisionNumber?: string; legacyDrawingNumber?: string }; revisions?: { revisionId?: number; uuid: string; revisionNumber: string; title?: string; legacyDrawingNumber?: string; revisionDate: string; revisionDescription?: string; revisedByName: string; fileUrl: string; isCurrent: boolean | null; createdBy?: number; updatedBy?: number }[]; } async function fetchDrawingByUuid(uuid: string): Promise { try { const result = await contractDrawingService.getByUuid(uuid); if (result?.data) return { ...result.data, _type: "CONTRACT" as const }; } catch { /* not found */ } try { const result = await shopDrawingService.getByUuid(uuid); if (result?.data) return { ...result.data, _type: "SHOP" as const }; } catch { /* not found */ } try { const result = await asBuiltDrawingService.getByUuid(uuid); if (result?.data) return { ...result.data, _type: "AS_BUILT" as const }; } catch { /* not found */ } return null; } export default function DrawingDetailPage({ params, }: { params: Promise<{ uuid: string }>; }) { const { uuid } = use(params); const router = useRouter(); const searchParams = useSearchParams(); const isEditMode = searchParams.get("edit") === "true"; const isUploadMode = searchParams.get("upload") === "true"; const { data: drawing, isLoading } = useQuery({ queryKey: ["drawing-detail", uuid], queryFn: () => fetchDrawingByUuid(uuid), enabled: !!uuid, }); if (!uuid) { notFound(); } if (isLoading) { return (
); } if (!drawing) { return (

Drawing Not Found

The drawing with UUID {uuid} could not be found.

); } const drawingNumber = drawing.contractDrawingNo || drawing.drawingNumber || "N/A"; const title = drawing.title || drawing.currentRevision?.title || "Untitled"; const revisions = drawing.revisions || []; return (
{/* Header */}

{drawingNumber}

{title}

{!isEditMode && !isUploadMode && ( <> {drawing._type !== "CONTRACT" && ( )} )} {(isEditMode || isUploadMode) && ( )}
{/* Edit Detail Form */} {isEditMode && ( router.push(`/drawings/${uuid}`)} /> )} {/* Upload Revision Form */} {isUploadMode && drawing._type !== "CONTRACT" && ( router.push(`/drawings/${uuid}`)} /> )} {/* Detail View (shown when not in edit/upload mode) */} {!isEditMode && !isUploadMode && (
Drawing Details {drawing._type}

Drawing Number

{drawingNumber}

Type

{drawing._type}

{drawing.volumePage && (

Volume Page

{drawing.volumePage}

)}

Created

{drawing.createdAt ? format(new Date(drawing.createdAt), "dd MMM yyyy") : "N/A"}

Preview

PDF Preview Placeholder

)}
); } /* ─── Edit Detail Form ─── */ function EditDetailForm({ drawing, uuid, onDone, }: { drawing: FetchedDrawing; uuid: string; onDone: () => void; }) { const updateMutation = useUpdateContractDrawing(); const queryClient = useQueryClient(); const [formTitle, setFormTitle] = useState(drawing.title || drawing.currentRevision?.title || ""); const [formDrawingNo, setFormDrawingNo] = useState(drawing.contractDrawingNo || drawing.drawingNumber || ""); const [formVolumePage, setFormVolumePage] = useState(drawing.volumePage?.toString() || ""); const handleSave = () => { if (drawing._type === "CONTRACT") { updateMutation.mutate( { uuid, data: { title: formTitle, contractDrawingNo: formDrawingNo, volumePage: formVolumePage ? parseInt(formVolumePage, 10) : undefined, }, }, { onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["drawing-detail", uuid] }); onDone(); }, } ); } }; return (

Edit Drawing Details

setFormDrawingNo(e.target.value)} />
setFormTitle(e.target.value)} />
{drawing._type === "CONTRACT" && (
setFormVolumePage(e.target.value)} />
)}
); } /* ─── Upload Revision Form ─── */ function UploadRevisionForm({ drawingType, uuid, onDone, }: { drawingType: DrawingType; uuid: string; onDone: () => void; }) { const uploadMutation = useUploadRevision(drawingType); const queryClient = useQueryClient(); const [revisionLabel, setRevisionLabel] = useState(""); const [revTitle, setRevTitle] = useState(""); const [description, setDescription] = useState(""); const [legacyNo, setLegacyNo] = useState(""); const handleUpload = () => { if (!revisionLabel || !revTitle) return; uploadMutation.mutate( { uuid, data: { revisionLabel, title: revTitle, description: description || undefined, legacyDrawingNumber: legacyNo || undefined, revisionDate: new Date().toISOString(), }, }, { onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["drawing-detail", uuid] }); onDone(); }, } ); }; return (

Upload New Revision

setRevisionLabel(e.target.value)} />
setLegacyNo(e.target.value)} />
setRevTitle(e.target.value)} />