import { useState, useEffect } from 'react' import { useParams, useNavigate, Link } from 'react-router-dom' import { useStorage } from '@/hooks/useStorage' import { Project, SiteStatus, ProcedureStatus } 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 Badge from '@/components/base/Badge' import { validateRequired, validateNumber, validateDate, validateDateRange } from '@/utils/validators' import './ProjectConfigurationPage.css' export default function ProjectConfigurationPage() { const { id } = useParams<{ id: string }>() const navigate = useNavigate() const { data, addEntity, updateEntity } = useStorage() const [formData, setFormData] = useState>({ name: '', startDate: '', endDate: '', treatmentSiteId: '', collectionSiteIds: [], numberOfModules: 1, transportBySite: false, administrativeProcedures: [], investments: [], }) const [errors, setErrors] = useState>({}) const projects = data?.projects || [] const treatmentSites = data?.treatmentSites || [] const wasteSites = data?.wasteSites || [] const wastes = data?.wastes || [] const administrativeProcedures = data?.administrativeProcedures || [] const investors = data?.investors || [] const isEditing = !!id const project = isEditing ? projects.find((p) => p.id === id) : null useEffect(() => { if (isEditing && project) { setFormData(project) } else { // Set default dates (10 years from today) const startDate = new Date().toISOString().split('T')[0] const endDate = new Date() endDate.setFullYear(endDate.getFullYear() + 10) setFormData({ ...formData, startDate, endDate: endDate.toISOString().split('T')[0], }) } }, [id, project]) const treatmentSiteOptions = treatmentSites.map((site) => ({ value: site.id, label: `${site.name} (${site.status})`, })) const wasteSiteOptions = wasteSites.map((site) => ({ value: site.id, label: site.name, })) const wasteOptions = wastes.map((waste) => ({ value: waste.id, label: waste.name, })) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() const newErrors: Record = {} newErrors.name = validateRequired(formData.name) newErrors.startDate = validateDate(formData.startDate) newErrors.endDate = validateDate(formData.endDate) newErrors.treatmentSiteId = validateRequired(formData.treatmentSiteId) newErrors.numberOfModules = validateNumber(formData.numberOfModules, 1) newErrors.dateRange = validateDateRange(formData.startDate, formData.endDate) setErrors(newErrors) if (Object.values(newErrors).some((error) => error !== undefined)) { return } const projectData: Project = { id: id || crypto.randomUUID(), name: formData.name!, startDate: formData.startDate!, endDate: formData.endDate!, treatmentSiteId: formData.treatmentSiteId!, collectionSiteIds: formData.collectionSiteIds || [], numberOfModules: formData.numberOfModules!, transportBySite: formData.transportBySite || false, wasteCharacteristicsOverride: formData.wasteCharacteristicsOverride, administrativeProcedures: formData.administrativeProcedures || [], investments: formData.investments || [], createdAt: isEditing && project ? project.createdAt : new Date().toISOString(), updatedAt: new Date().toISOString(), } if (isEditing) { updateEntity('projects', id!, projectData) } else { addEntity('projects', projectData) } navigate('/projects') } const addAdministrativeProcedure = () => { if (administrativeProcedures.length === 0) return const newProcedures = [...(formData.administrativeProcedures || [])] newProcedures.push({ procedureId: administrativeProcedures[0].id, status: 'toDo', }) setFormData({ ...formData, administrativeProcedures: newProcedures }) } const removeAdministrativeProcedure = (index: number) => { const newProcedures = [...(formData.administrativeProcedures || [])] newProcedures.splice(index, 1) setFormData({ ...formData, administrativeProcedures: newProcedures }) } const updateAdministrativeProcedure = (index: number, field: 'procedureId' | 'status', value: string) => { const newProcedures = [...(formData.administrativeProcedures || [])] newProcedures[index] = { ...newProcedures[index], [field]: value, } setFormData({ ...formData, administrativeProcedures: newProcedures }) } const addInvestment = () => { if (investors.length === 0) return const newInvestments = [...(formData.investments || [])] newInvestments.push({ investorId: investors[0].id, status: 'toBeApproached', amount: 0, }) setFormData({ ...formData, investments: newInvestments }) } const removeInvestment = (index: number) => { const newInvestments = [...(formData.investments || [])] newInvestments.splice(index, 1) setFormData({ ...formData, investments: newInvestments }) } const updateInvestment = (index: number, field: 'investorId' | 'status' | 'amount', value: string | number) => { const newInvestments = [...(formData.investments || [])] newInvestments[index] = { ...newInvestments[index], [field]: value, } setFormData({ ...formData, investments: newInvestments }) } return (

{isEditing ? 'Edit Project' : 'Create New Project'}

setFormData({ ...formData, name: e.target.value })} error={errors.name} /> setFormData({ ...formData, numberOfModules: parseInt(e.target.value) || 1 })} error={errors.numberOfModules} />
setFormData({ ...formData, startDate: e.target.value })} error={errors.startDate} /> setFormData({ ...formData, endDate: e.target.value })} error={errors.endDate || errors.dateRange} />
{ const currentIds = formData.collectionSiteIds || [] if (e.target.checked) { setFormData({ ...formData, collectionSiteIds: [...currentIds, option.value] }) } else { setFormData({ ...formData, collectionSiteIds: currentIds.filter((id) => id !== option.value) }) } }} /> {option.label} ))}
{wasteSiteOptions.length === 0 && (

No waste sites available. Create waste sites first.

)}
setFormData({ ...formData, transportBySite: e.target.checked })} /> Transport by site
setFormData({ ...formData, wasteCharacteristicsOverride: { ...formData.wasteCharacteristicsOverride, bmp: e.target.value ? parseFloat(e.target.value) : undefined, }, }) } /> setFormData({ ...formData, wasteCharacteristicsOverride: { ...formData.wasteCharacteristicsOverride, waterPercentage: e.target.value ? parseFloat(e.target.value) : undefined, }, }) } /> {formData.administrativeProcedures?.map((proc, index) => (
updateAdministrativeProcedure(index, 'status', e.target.value as ProcedureStatus)} options={[ { value: 'toDo', label: 'To Do' }, { value: 'done', label: 'Done' }, { value: 'na', label: 'N/A' }, ]} />
))}
{formData.investments?.map((inv, index) => (
updateInvestment(index, 'status', e.target.value as SiteStatus)} options={[ { value: 'toBeApproached', label: 'To be approached' }, { value: 'loiOk', label: 'LOI OK' }, { value: 'inProgress', label: 'In progress' }, { value: 'completed', label: 'Completed' }, ]} /> updateInvestment(index, 'amount', parseFloat(e.target.value) || 0)} />
))}
) }