'use client'; import { useState, useEffect, useCallback } from 'react'; import { FileText, Fuel, Upload, Database, BarChart3, CheckCircle, Loader2, History, PlusCircle } from 'lucide-react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { UploadForm } from '@/app/components/uploadForm'; import { createTerraTechImportRecord, processTerraTechImportData } from '@/app/actions/terratech-workflow'; import { getImportsByLayoutName, getTerraTechFacilitySummary } from '@/app/actions/imports'; import { TerraTechImportsTable } from '@/app/components/terratech/TerraTechImportsTable'; import { TerraTechSummaryDialog } from '@/app/components/terratech/TerraTechSummaryDialog'; import { useToast } from '@/hooks/use-toast'; interface FileData { id: string; filename: string; mimetype: string; size: number; createdAt: string; updatedAt: string; } interface Import { id: number; name: string; importDate: string; layoutId: number; layout: { id: number; name: string; }; } interface RawImportData { id: number; name: string; importDate: Date | string; layoutId: number; layout: { id: number; name: string; }; } interface SummaryData { importId: number; importName: string; layoutName: string; rows: any[]; } const LAYOUT_NAME = 'TerraTech - GasOilWater Summary'; export default function TerraTechFacilitySummariesPage() { const [imports, setImports] = useState([]); const [loading, setLoading] = useState(true); const [summaryDialogOpen, setSummaryDialogOpen] = useState(false); const [selectedImportId, setSelectedImportId] = useState(null); const { toast } = useToast(); // Workflow state 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(null); const [error, setError] = useState(null); const [selectedSummaryImport, setSelectedSummaryImport] = useState(null); const loadImports = useCallback(async () => { try { setLoading(true); setError(null); const result = await getImportsByLayoutName(LAYOUT_NAME); if (result.success && result.data) { const transformedImports = result.data.map((item: RawImportData) => ({ id: item.id, name: item.name, importDate: item.importDate instanceof Date ? item.importDate.toISOString() : String(item.importDate), layoutId: item.layoutId, layout: { id: item.layout.id, name: item.layout.name, }, })); setImports(transformedImports); } else { toast({ title: 'Error', description: result.error || 'Failed to load imports', variant: 'destructive', }); setImports([]); } } catch { toast({ title: 'Error', description: 'Failed to load imports', variant: 'destructive', }); } finally { setLoading(false); } }, [toast]); useEffect(() => { loadImports(); }, [loadImports]); // Workflow handlers const handleFileUploaded = (file: FileData) => { setUploadedFile(file); setCurrentStep(2); setError(null); }; const handleCreateImportRecord = async () => { if (!uploadedFile) return; setIsProcessing(true); setError(null); try { const result = await createTerraTechImportRecord(uploadedFile.id, uploadedFile.filename); if (result.success && result.data) { const importData = result.data; const importRecordData: Import = { id: importData.id, name: importData.name, importDate: importData.importDate instanceof Date ? importData.importDate.toISOString() : String(importData.importDate), layoutId: importData.layoutId, layout: { id: importData.layout?.id || 0, name: importData.layout?.name || LAYOUT_NAME, }, }; setImportRecord(importRecordData); 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 processTerraTechImportData(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 result = await getTerraTechFacilitySummary(importRecord.id); if (result.success && result.data) { setSummaryData(result.data); setSelectedSummaryImport(importRecord); setViewMode('summary'); } else { setError(result.error || 'Failed to generate summary'); } } catch (err) { setError(err instanceof Error ? err.message : 'Failed to generate summary'); } finally { setIsProcessing(false); } }; const handleStartNewImport = () => { setViewMode('new-import'); setCurrentStep(1); setUploadedFile(null); setImportRecord(null); setSummaryData(null); setError(null); }; const handleBackToImports = () => { setViewMode('imports'); setSelectedSummaryImport(null); setSummaryData(null); loadImports(); }; function handleViewSummary(importRecord: Import) { setSelectedSummaryImport(importRecord); setSelectedImportId(importRecord.id); setSummaryDialogOpen(true); } const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); }; if (loading && viewMode === 'imports') { return (
); } return (

TerraTech Facility Summaries

View Gas, Oil, and Water production summaries for imported data

{error && (

{error}

)} {/* Navigation Buttons */}
{/* Prior Imports View */} {viewMode === 'imports' && ( <> {imports.length === 0 ? (

No imports found

No imports using the "{LAYOUT_NAME}" layout configuration were found.
Import data using this layout to see it here.

) : (
)} )} {/* New Import Workflow */} {viewMode === 'new-import' && (
{/* Workflow Steps */}
{[ { id: 1, title: 'Upload Excel File', description: 'Upload the TerraTech GasOilWater 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 ? '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-amber-600 bg-amber-50 border-amber-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 TerraTech GasOilWater 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 TerraTech - GasOilWater Summary layout configuration

File: {uploadedFile?.filename}

Layout: {LAYOUT_NAME}

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

Import ID: {importRecord?.id}

Import Name: {importRecord?.name}

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

Import ID: {importRecord?.id}

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

No summary data available

) : (
{summaryData.rows.slice(0, 50).map((row, index) => ( ))}
Well Name CorpID Facility ID Gas Oil Water State County
{row.wellName || '-'} {row.corpId || '-'} {row.facilityId || '-'} {row.gas !== null ? row.gas.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : '-'} {row.oil !== null ? row.oil.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : '-'} {row.water !== null ? row.water.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : '-'} {row.state || '-'} {row.county || '-'}
{summaryData.rows.length > 50 && (

Showing 50 of {summaryData.rows.length} records. Use the dialog to view all records.

)}
)}
)}
); }