import { useState } from 'react' import { useStorage } from '@/hooks/useStorage' import { Waste } from '@/types' import Card from '@/components/base/Card' import Button from '@/components/base/Button' import Input from '@/components/base/Input' import Select from '@/components/base/Select' import Table from '@/components/base/Table' import Badge from '@/components/base/Badge' import { formatDate } from '@/utils/formatters' import { validateRequired, validateNumber, validatePercentage } from '@/utils/validators' import './WasteConfigurationPage.css' export default function WasteConfigurationPage() { const { data, addEntity, updateEntity, deleteEntity } = useStorage() const [editingId, setEditingId] = useState(null) const [formData, setFormData] = useState>({ name: '', originType: 'animals', originSubType: '', originUnitsPer1000m3Methane: 0, bmp: 0, waterPercentage: 75, regulationNeeds: [], maxStorageDuration: 30, }) const [errors, setErrors] = useState>({}) const wastes = data?.wastes || [] const originTypeOptions = [ { value: 'animals', label: 'Animals' }, { value: 'markets', label: 'Markets' }, { value: 'restaurants', label: 'Restaurants' }, { value: 'other', label: 'Other' }, ] const handleSubmit = (e: React.FormEvent) => { e.preventDefault() const newErrors: Record = {} newErrors.name = validateRequired(formData.name) newErrors.bmp = validateNumber(formData.bmp, 0.1, 1.0) newErrors.waterPercentage = validatePercentage(formData.waterPercentage) newErrors.originUnitsPer1000m3Methane = validateNumber(formData.originUnitsPer1000m3Methane, 0) newErrors.maxStorageDuration = validateNumber(formData.maxStorageDuration, 1) setErrors(newErrors) if (Object.values(newErrors).some((error) => error !== undefined)) { return } const waste: Waste = { id: editingId || crypto.randomUUID(), name: formData.name!, originType: formData.originType!, originSubType: formData.originSubType, originUnitsPer1000m3Methane: formData.originUnitsPer1000m3Methane!, bmp: formData.bmp!, waterPercentage: formData.waterPercentage!, regulationNeeds: formData.regulationNeeds || [], regulatoryCharacteristics: formData.regulatoryCharacteristics, maxStorageDuration: formData.maxStorageDuration!, createdAt: editingId ? wastes.find((w) => w.id === editingId)?.createdAt || new Date().toISOString() : new Date().toISOString(), updatedAt: new Date().toISOString(), } if (editingId) { updateEntity('wastes', editingId, waste) } else { addEntity('wastes', waste) } resetForm() } const resetForm = () => { setFormData({ name: '', originType: 'animals', originSubType: '', originUnitsPer1000m3Methane: 0, bmp: 0, waterPercentage: 75, regulationNeeds: [], maxStorageDuration: 30, }) setEditingId(null) setErrors({}) } const handleEdit = (waste: Waste) => { setFormData(waste) setEditingId(waste.id) } const handleDelete = (id: string) => { if (confirm('Are you sure you want to delete this waste type?')) { deleteEntity('wastes', id) } } const tableColumns = [ { key: 'name', header: 'Name', render: (waste: Waste) => waste.name, }, { key: 'originType', header: 'Origin Type', render: (waste: Waste) => {waste.originType}, }, { key: 'bmp', header: 'BMP (Nm³ CH₄/kg VS)', render: (waste: Waste) => waste.bmp.toFixed(3), }, { key: 'waterPercentage', header: 'Water %', render: (waste: Waste) => `${waste.waterPercentage}%`, }, { key: 'maxStorageDuration', header: 'Max Storage (days)', render: (waste: Waste) => waste.maxStorageDuration, }, { key: 'actions', header: 'Actions', render: (waste: Waste) => (
), }, ] return (

Waste Configuration

setFormData({ ...formData, name: e.target.value })} error={errors.name} placeholder="Enter waste name" /> setFormData({ ...formData, originSubType: e.target.value })} placeholder="Enter sub type (optional)" />
setFormData({ ...formData, bmp: parseFloat(e.target.value) || 0 })} error={errors.bmp} helpText="Biochemical Methane Potential (0.1 - 1.0)" /> setFormData({ ...formData, waterPercentage: parseFloat(e.target.value) || 0 })} error={errors.waterPercentage} helpText="Water content percentage (0-100%)" />
setFormData({ ...formData, originUnitsPer1000m3Methane: parseFloat(e.target.value) || 0 })} error={errors.originUnitsPer1000m3Methane} /> setFormData({ ...formData, maxStorageDuration: parseInt(e.target.value) || 0 })} error={errors.maxStorageDuration} />
{editingId && ( )}
) }