'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { createVehicle, updateVehicle, type VehicleResponse, type VehicleCreateData, } from '@/lib/vehicles'; const VEHICLE_TYPES = ['lkw', 'pkw', 'baumaschine', 'stapler', 'transporter']; const CONDITIONS = ['new', 'used']; const AVAILABILITY = ['available', 'reserved', 'sold']; const FUEL_TYPES = ['Diesel', 'Petrol', 'Electric', 'Hybrid', 'Gas']; const TRANSMISSIONS = ['Manual', 'Automatic', 'Semi-Automatic']; const HOURS_UNITS = ['h', 'min']; interface VehicleFormProps { vehicle?: VehicleResponse; mode?: 'create' | 'edit'; } interface FormErrors { [key: string]: string | undefined; } export function VehicleForm({ vehicle, mode = 'create' }: VehicleFormProps) { const router = useRouter(); const [loading, setLoading] = useState(false); const [errors, setErrors] = useState({}); const [submitError, setSubmitError] = useState(null); const [formData, setFormData] = useState({ make: vehicle?.make || '', model: vehicle?.model || '', fin: vehicle?.fin || '', year: vehicle?.year, first_registration: vehicle?.first_registration, power_kw: vehicle?.power_kw, fuel_type: vehicle?.fuel_type, transmission: vehicle?.transmission, color: vehicle?.color, condition: vehicle?.condition || 'used', location: vehicle?.location, availability: vehicle?.availability || 'available', price: vehicle?.price || 0, vehicle_type: vehicle?.vehicle_type || 'lkw', lkw_type: vehicle?.lkw_type, machine_type: vehicle?.machine_type, body_type: vehicle?.body_type, operating_hours: vehicle?.operating_hours, operating_hours_unit: vehicle?.operating_hours_unit, mileage_km: vehicle?.mileage_km, description: vehicle?.description, }); const validate = (): boolean => { const newErrors: FormErrors = {}; if (!formData.make || formData.make.trim().length === 0) { newErrors.make = 'Make is required'; } if (!formData.model || formData.model.trim().length === 0) { newErrors.model = 'Model is required'; } if (!formData.fin) { newErrors.fin = 'FIN is required'; } else if (formData.fin.length !== 17) { newErrors.fin = 'FIN must be exactly 17 characters'; } if (!formData.price || formData.price <= 0) { newErrors.price = 'Price must be greater than 0'; } if (!formData.vehicle_type) { newErrors.vehicle_type = 'Vehicle type is required'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleChange = (field: keyof VehicleCreateData, value: string | number | undefined) => { setFormData(prev => ({ ...prev, [field]: value })); if (errors[field]) { setErrors(prev => { const next = { ...prev }; delete next[field]; return next; }); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validate()) return; setLoading(true); setSubmitError(null); try { if (mode === 'edit' && vehicle) { await updateVehicle(vehicle.id, formData); router.push(`/de/fahrzeuge/${vehicle.id}`); } else { const created = await createVehicle(formData); router.push(`/de/fahrzeuge/${created.id}`); } } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setSubmitError(apiErr?.error?.message || 'Failed to save vehicle'); } finally { setLoading(false); } }; const inputClass = 'w-full px-3 py-2 border rounded-lg bg-surface text-text border-border focus:outline-none focus:ring-2 focus:ring-primary'; return (
{submitError && (
{submitError}
)}
handleChange('make', e.target.value)} error={errors.make} /> handleChange('model', e.target.value)} error={errors.model} />
handleChange('fin', e.target.value.toUpperCase())} error={errors.fin} />
{errors.vehicle_type &&

{errors.vehicle_type}

}
handleChange('price', parseFloat(e.target.value) || 0)} error={errors.price} />
handleChange('year', e.target.value ? parseInt(e.target.value) : undefined)} /> handleChange('first_registration', e.target.value || undefined)} /> handleChange('power_kw', e.target.value ? parseInt(e.target.value) : undefined)} />
handleChange('color', e.target.value || undefined)} /> handleChange('location', e.target.value || undefined)} />
{formData.vehicle_type === 'lkw' && ( handleChange('lkw_type', e.target.value || undefined)} /> )} {formData.vehicle_type === 'baumaschine' && ( handleChange('machine_type', e.target.value || undefined)} /> )}
handleChange('mileage_km', e.target.value ? parseInt(e.target.value) : undefined)} />
handleChange('operating_hours', e.target.value ? parseFloat(e.target.value) : undefined)} />