"use client"; import { useState, useEffect } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Upload, FileText, Database, BarChart3, CheckCircle, Loader2, History, PlusCircle } from 'lucide-react'; import { UploadForm } from '@/app/components/uploadForm'; import { createCintasImportRecord, processCintasImportData } from '@/app/actions/cintas-workflow'; import { getImports } from '@/app/actions/imports'; interface FileData { id: string; filename: string; mimetype: string; size: number; createdAt: string; updatedAt: string; } interface CintasSummary { id: number; week: string; trrTotal: number; fourWkAverages: number; trrPlus4Wk: number; powerAdds: number; weekId: number; } interface ImportRecord { id: number; name: string; importDate: string; fileId: string | null; file?: { filename: string; createdAt: string; }; layout?: { name: string; }; cintasSummaries?: CintasSummary[]; } export default function CintasCalendarSummaryPage() { const [viewMode, setViewMode] = useState<'imports' | 'new-import' | 'summary'>('imports'); const [currentStep, setCurrentStep] = useState(1); const [uploadedFile, setUploadedFile] = useState(null); const [isProcessing, setIsProcessing] = useState(false); const [importRecord, setImportRecord] = useState(null); const [summaryData, setSummaryData] = useState([]); const [error, setError] = useState(null); const [summaryExists, setSummaryExists] = useState(false); const [priorImports, setPriorImports] = useState([]); const [selectedImport, setSelectedImport] = useState(null); const [loadingImports, setLoadingImports] = useState(true); useEffect(() => { loadPriorImports(); }, []); const loadPriorImports = async () => { try { setLoadingImports(true); const result = await getImports(); if (result.success && result.data) { // Map the data to match our ImportRecord interface const mappedData = result.data.map((item: any) => ({ id: item.id, name: item.name, importDate: item.importDate, fileId: item.fileId, file: item.file ? { filename: item.file.filename, createdAt: item.file.createdAt } : undefined, cintasSummaries: item.cintasSummaries || [] })); setPriorImports(mappedData); } else { setError(result.error || 'Failed to load prior imports'); setPriorImports([]); } } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load prior imports'); setPriorImports([]); } finally { setLoadingImports(false); } }; const handleFileUploaded = (file: FileData) => { setUploadedFile(file); setCurrentStep(2); setError(null); }; const handleCreateImportRecord = async () => { if (!uploadedFile) return; setIsProcessing(true); setError(null); try { const result = await createCintasImportRecord(uploadedFile.id, uploadedFile.filename); if (result.success) { setImportRecord(result.data); setCurrentStep(3); } else { setError(result.error || 'Failed to create import record'); } } catch (err) { setError(err instanceof Error ? err.message : 'Unknown error occurred'); } finally { setIsProcessing(false); } }; const handleProcessImportData = async () => { if (!importRecord) return; setIsProcessing(true); setError(null); try { const result = await processCintasImportData(importRecord.id); if (result.success) { setCurrentStep(4); } else { setError(result.error || 'Failed to process import data'); } } catch (err) { setError(err instanceof Error ? err.message : 'Unknown error occurred'); } finally { setIsProcessing(false); } }; const handleGenerateSummary = async () => { if (!importRecord) return; setIsProcessing(true); setError(null); try { const response = await fetch(`/api/imports/${importRecord.id}/summary`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, }); const data = await response.json(); if (response.ok) { setSummaryData(data.summary || []); setSummaryExists(true); if (data.summaryGenerated) { setCurrentStep(4); setViewMode('summary'); } } else { throw new Error(data.error || 'Failed to generate summary'); } } catch (err) { setError(err instanceof Error ? err.message : 'Failed to generate summary'); } finally { setIsProcessing(false); } }; const handleLoadImportSummary = async (importRecord: ImportRecord) => { try { setIsProcessing(true); setError(null); const response = await fetch(`/api/imports/${importRecord.id}/summary`); const data = await response.json(); if (response.ok) { setSelectedImport(importRecord); setSummaryData(data.summary?.cintasSummaries || []); setSummaryExists(data.summaryExists); setViewMode('summary'); } else { throw new Error(data.error || 'Failed to load summary'); } } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load summary'); } finally { setIsProcessing(false); } }; const handleStartNewImport = () => { setViewMode('new-import'); setCurrentStep(1); setUploadedFile(null); setImportRecord(null); setSummaryData([]); setSummaryExists(false); setError(null); }; const handleBackToImports = () => { setViewMode('imports'); setSelectedImport(null); setSummaryData([]); loadPriorImports(); }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); }; return (

Cintas Install Calendar Summary

View prior imports or create new ones to process installation calendar data

{error && (

{error}

)} {/* Navigation Buttons */}
{/* Prior Imports View */} {viewMode === 'imports' && ( Prior Imports Select an import to view its summary results {loadingImports ? (
) : priorImports.length === 0 ? (

No prior imports found

) : (
{priorImports.map((importRecord) => (
handleLoadImportSummary(importRecord)} >

{importRecord.name}

{formatDate(importRecord.importDate)}

{importRecord.file && (

File: {importRecord.file.filename}

)}
{importRecord.cintasSummaries?.length || 0} weeks
))}
)}
)} {/* New Import Workflow */} {viewMode === 'new-import' && (
{/* Workflow Steps */}
{[ { id: 1, title: 'Upload Excel File', description: 'Upload the Cintas Install Calendar Excel file', icon: Upload, status: currentStep >= 1 ? (uploadedFile ? 'completed' : 'pending') : 'pending', }, { id: 2, title: 'Create Import Record', description: 'Create import record with layout configuration', icon: FileText, status: currentStep >= 2 ? (importRecord ? 'completed' : 'pending') : 'disabled', }, { id: 3, title: 'Import Data', description: 'Process Excel file and import data', icon: Database, status: currentStep > 3 ? 'completed' : (currentStep === 3 ? 'pending' : 'disabled'), }, { id: 4, title: 'Generate Summary', description: 'Run summary calculations and display results', icon: BarChart3, status: currentStep >= 4 ? (summaryData.length > 0 ? 'completed' : 'pending') : 'disabled', }, ].map((step) => { const Icon = step.icon; const getStatusColor = (status: string) => { switch (status) { case 'completed': return 'text-green-600 bg-green-50 border-green-200'; case 'pending': return 'text-blue-600 bg-blue-50 border-blue-200'; case 'disabled': return 'text-gray-400 bg-gray-50 border-gray-200'; default: return 'text-gray-600 bg-gray-50 border-gray-200'; } }; return (
Step {step.id}: {step.title}
{step.description}
); })}
{/* Step Content */}
{currentStep === 1 && ( Step 1: Upload Excel File Upload your Cintas Install Calendar Excel file to begin processing
{uploadedFile && (

File uploaded successfully!

{uploadedFile.filename} ({(uploadedFile.size / 1024 / 1024).toFixed(2)} MB)

)}
)} {currentStep === 2 && ( Step 2: Create Import Record Creating import record with Cintas Install Calendar layout configuration

File: {uploadedFile?.filename}

)} {currentStep === 3 && ( Step 3: Import Data Processing Excel file and importing data into database

Import ID: {importRecord?.id}

)} {currentStep === 4 && ( Step 4: Generate Summary Running summary calculations and displaying results

Import ID: {importRecord?.id}

)}
)} {/* Summary Results View */} {viewMode === 'summary' && selectedImport && (
Summary Results {selectedImport.name} - {formatDate(selectedImport.importDate)}
{isProcessing ? (
) : summaryData.length === 0 ? (

No summary data available

) : (
{summaryData.map((item, index) => ( ))}
Week TRR Total 4 Week Avg TRR + 4Wk Power Adds
{item.week} {item.trrTotal} {item.fourWkAverages} {item.trrPlus4Wk} {item.powerAdds}
)}
)}
); }