'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; publicId: string; contractDrawingNo?: string; drawingNumber?: string; title?: string; volumePage?: number; createdAt?: string; updatedAt?: string; currentRevision?: { title?: string; revisionNumber?: string; legacyDrawingNumber?: string }; revisions?: { revisionId?: number; publicId: 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 ID {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 ? Number(formVolumePage) : 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)} />