'use client'; import { useState, useEffect, useCallback } from 'react'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { format } from 'date-fns'; import { useToast } from '@/hooks/use-toast'; import { getImportById, calculateCintasSummaries, triggerImportProcess } from '@/app/actions/imports'; interface CintasSummary { id: number; week: string; trrTotal: number; fourWkAverages: number; trrPlus4Wk: number; powerAdds: number; weekId: number; importId: number; } interface ImportDetail { id: number; name: string; importDate: Date; layout: { id: number; name: string; sections: Array<{ id: number; name: string; tableName: string; fields: Array<{ id: number; name: string; createdAt: Date; updatedAt: Date; layoutSectionId: number; cellPosition: string; dataType: string; dataTypeFormat: string | null; importTableColumnName: string; importColumnOrderNumber: number; }>; }>; }; cintasSummaries: CintasSummary[]; file?: { id: string; filename: string; size: number; contentType: string; }; } interface ImportDetailDialogProps { open: boolean; onOpenChange: (open: boolean) => void; importId: number; } export function ImportDetailDialog({ open, onOpenChange, importId }: ImportDetailDialogProps) { const [importDetail, setImportDetail] = useState(null); const [loading, setLoading] = useState(true); const [calculating, setCalculating] = useState(false); const [processing, setProcessing] = useState(false); const [importStatus, setImportStatus] = useState<'idle' | 'processing' | 'completed' | 'failed'>('idle'); const { toast } = useToast(); const loadImportDetail = useCallback(async () => { try { const result = await getImportById(importId); if (result.success && result.data) { setImportDetail(result.data); } else { toast({ title: 'Error', description: result.error || 'Failed to load import details', variant: 'destructive', }); setImportDetail(null); } } catch { toast({ title: 'Error', description: 'Failed to load import details', variant: 'destructive', }); setImportDetail(null); } finally { setLoading(false); } }, [importId, toast]); useEffect(() => { if (open && importId) { loadImportDetail(); } }, [open, importId, loadImportDetail]); async function handleCalculateSummaries() { setCalculating(true); try { const result = await calculateCintasSummaries(importId); if (result.success) { toast({ title: 'Success', description: 'Cintas summaries calculated successfully', }); loadImportDetail(); } else { toast({ title: 'Error', description: result.error || 'Failed to calculate summaries', variant: 'destructive', }); } } catch { toast({ title: 'Error', description: 'Failed to calculate summaries', variant: 'destructive', }); } finally { setCalculating(false); } } async function handleTriggerImport() { if (!importDetail?.file) { toast({ title: 'Error', description: 'No file attached to this import', variant: 'destructive', }); return; } setProcessing(true); setImportStatus('processing'); try { const result = await triggerImportProcess(importId); if (result.success) { toast({ title: 'Success', description: result.message || 'Import process started successfully', }); // For now, we'll simulate the processing completion // In a real implementation, you might use polling or WebSocket setTimeout(() => { setImportStatus('completed'); setProcessing(false); toast({ title: 'Import Complete', description: 'Import process completed successfully', }); loadImportDetail(); }, 2000); } else { toast({ title: 'Error', description: result.error || 'Failed to start import process', variant: 'destructive', }); setProcessing(false); setImportStatus('failed'); } } catch { toast({ title: 'Error', description: 'Failed to trigger import process', variant: 'destructive', }); setProcessing(false); setImportStatus('failed'); } } if (loading) { return ( Loading Import Details Please wait while we load the import information...
); } if (!importDetail) return null; return ( Import Details View detailed information about this import
Import Information
Name: {importDetail.name}
Layout: {importDetail.layout.name}
Import Date: {format(importDetail.importDate, 'PPpp')}
{importDetail.file && (
File: {importDetail.file.filename}
)}
Layout Configuration
{importDetail.layout.sections.map((section) => (

{section.name}

Table: {section.tableName}

{section.fields.map((field) => (
{field.name}: {field.importTableColumnName}
))}
))}
Import Actions
{importStatus === 'processing' && (
Import is currently processing...
)} {importStatus === 'completed' && (
Import completed successfully!
)} {importStatus === 'failed' && (
Import failed. Please check the logs for details.
)} {!importDetail.file && (
No file attached. Please upload a file before starting import.
)}
Cintas Summaries {importDetail.cintasSummaries.length === 0 ? (

No summaries calculated yet

) : (
{importDetail.cintasSummaries.map((summary) => ( ))}
Week TRR Total 4WK Averages TRR + 4WK Power Adds
{summary.week} {summary.trrTotal} {summary.fourWkAverages} {summary.trrPlus4Wk} {summary.powerAdds}
)}
); }