import { useState, useEffect } from 'react'; import { useRouter } from 'next/router'; import Link from 'next/link'; import Head from 'next/head'; import { CropBatch, GrowingRecipe, VerticalFarm } from '../../../lib/vertical-farming/types'; import BatchProgress from '../../../components/vertical-farm/BatchProgress'; import GrowthStageIndicator from '../../../components/vertical-farm/GrowthStageIndicator'; export default function BatchManagement() { const router = useRouter(); const { farmId } = router.query; const [farm, setFarm] = useState(null); const [batches, setBatches] = useState([]); const [recipes, setRecipes] = useState>(new Map()); const [selectedBatch, setSelectedBatch] = useState(null); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState<'all' | 'active' | 'completed'>('active'); useEffect(() => { if (farmId) { fetchData(); } }, [farmId]); const fetchData = async () => { try { const [farmRes, batchesRes, recipesRes] = await Promise.all([ fetch(`/api/vertical-farm/${farmId}`), fetch(`/api/vertical-farm/${farmId}/batches`), fetch('/api/vertical-farm/recipes'), ]); const farmData = await farmRes.json(); const batchesData = await batchesRes.json(); const recipesData = await recipesRes.json(); if (farmData.success) setFarm(farmData.farm); if (batchesData.success) setBatches(batchesData.batches); if (recipesData.success) { const recipeMap = new Map(); recipesData.recipes.forEach((r: GrowingRecipe) => recipeMap.set(r.id, r)); setRecipes(recipeMap); } } catch (error) { console.error('Error fetching data:', error); } finally { setLoading(false); } }; const filteredBatches = batches.filter(batch => { if (filter === 'active') { return batch.status !== 'completed' && batch.status !== 'failed'; } if (filter === 'completed') { return batch.status === 'completed' || batch.status === 'failed'; } return true; }); const handleHarvest = async (batch: CropBatch) => { const yieldKg = prompt('Enter actual yield in kg:', batch.expectedYieldKg.toString()); if (!yieldKg) return; const grade = prompt('Enter quality grade (A, B, C):', 'A'); if (!grade) return; try { const response = await fetch(`/api/vertical-farm/batch/${batch.id}/harvest`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ actualYieldKg: parseFloat(yieldKg), qualityGrade: grade, }), }); const data = await response.json(); if (data.success) { fetchData(); setSelectedBatch(null); } } catch (error) { console.error('Error completing harvest:', error); } }; if (loading) { return (
); } return (
Crop Batches - {farm?.name || 'Vertical Farm'}
{/* Filter Tabs */}
{(['active', 'completed', 'all'] as const).map(f => ( ))}
{/* Batch List */}
{filteredBatches.length === 0 ? (

No {filter} batches found

Start a new batch →
) : ( filteredBatches.map(batch => (
setSelectedBatch(batch)} className={`cursor-pointer transition ${ selectedBatch?.id === batch.id ? 'ring-2 ring-green-500' : '' }`} >
)) )}
{/* Batch Detail */}
{selectedBatch ? ( <>

{selectedBatch.cropType} {selectedBatch.variety && ` - ${selectedBatch.variety}`}

Batch ID

{selectedBatch.id}

Status

{selectedBatch.status}

Planted

{new Date(selectedBatch.plantingDate).toLocaleDateString()}

Expected Harvest

{new Date(selectedBatch.expectedHarvestDate).toLocaleDateString()}

Plant Count

{selectedBatch.plantCount.toLocaleString()}

Health Score

= 80 ? 'text-green-600' : selectedBatch.healthScore >= 60 ? 'text-yellow-600' : 'text-red-600' }`} > {selectedBatch.healthScore}%

{selectedBatch.actualHarvestDate && (

Harvest Results

Actual Yield

{selectedBatch.actualYieldKg?.toFixed(1)} kg

Quality Grade

{selectedBatch.qualityGrade}

)}
{/* Growth Stage Progress */} {recipes.get(selectedBatch.recipeId) && (

Growth Progress

)} {/* Issues */} {selectedBatch.issues.length > 0 && (

Issues ({selectedBatch.issues.filter(i => !i.resolvedAt).length} active)

{selectedBatch.issues.map(issue => (
{issue.type} {issue.severity}

{issue.description}

{issue.resolvedAt && (

Resolved: {issue.resolution}

)}
))}
)} {/* Actions */}

Actions

{selectedBatch.status === 'ready' && ( )}
) : (

Select a batch to view details

)}
); }