import { Form } from "@remix-run/react"; import { useState, useEffect } from "react"; import { Input } from "~/components/ui/Input"; import { AutocompleteInput } from "~/components/ui/AutocompleteInput"; import { Button } from "~/components/ui/Button"; import { Flex } from "~/components/layout/Flex"; import { TRANSMISSION_TYPES, FUEL_TYPES, USE_TYPES, VALIDATION } from "~/lib/constants"; import type { Vehicle } from "~/types/database"; interface VehicleFormProps { vehicle?: Vehicle; customers: { id: number; name: string; phone?: string | null }[]; onCancel: () => void; errors?: Record; isLoading: boolean; } export function VehicleForm({ vehicle, customers, onCancel, errors = {}, isLoading, }: VehicleFormProps) { const [formData, setFormData] = useState({ plateNumber: vehicle?.plateNumber || "", bodyType: vehicle?.bodyType || "", manufacturer: vehicle?.manufacturer || "", model: vehicle?.model || "", trim: vehicle?.trim || "", year: vehicle?.year?.toString() || "", transmission: vehicle?.transmission || "", fuel: vehicle?.fuel || "", cylinders: vehicle?.cylinders?.toString() || "", engineDisplacement: vehicle?.engineDisplacement?.toString() || "", useType: vehicle?.useType || "", ownerId: vehicle?.ownerId?.toString() || "", }); // Car dataset state const [manufacturers, setManufacturers] = useState([]); const [models, setModels] = useState<{model: string; bodyType: string}[]>([]); const [isLoadingManufacturers, setIsLoadingManufacturers] = useState(false); const [isLoadingModels, setIsLoadingModels] = useState(false); // Autocomplete state const [manufacturerSearchValue, setManufacturerSearchValue] = useState(vehicle?.manufacturer || ""); const [modelSearchValue, setModelSearchValue] = useState(vehicle?.model || ""); const [ownerSearchValue, setOwnerSearchValue] = useState(() => { if (vehicle?.ownerId) { const owner = customers.find(c => c.id === vehicle.ownerId); return owner ? owner.name : ""; } return ""; }); // Load manufacturers on component mount useEffect(() => { const loadManufacturers = async () => { setIsLoadingManufacturers(true); try { const response = await fetch('/api/car-dataset?action=manufacturers'); const result = await response.json(); if (result.success) { setManufacturers(result.data); } } catch (error) { console.error('Error loading manufacturers:', error); } finally { setIsLoadingManufacturers(false); } }; loadManufacturers(); }, []); // Load models when manufacturer changes useEffect(() => { if (formData.manufacturer) { const loadModels = async () => { setIsLoadingModels(true); try { const response = await fetch(`/api/car-dataset?action=models&manufacturer=${encodeURIComponent(formData.manufacturer)}`); const result = await response.json(); if (result.success) { setModels(result.data); } } catch (error) { console.error('Error loading models:', error); } finally { setIsLoadingModels(false); } }; loadModels(); } else { setModels([]); } }, [formData.manufacturer]); // Create autocomplete options const manufacturerOptions = manufacturers.map(manufacturer => ({ value: manufacturer, label: manufacturer, data: manufacturer })); const modelOptions = models.map(item => ({ value: item.model, label: item.model, data: item })); const ownerOptions = customers.map(customer => ({ value: customer.name, label: `${customer.name}${customer.phone ? ` - ${customer.phone}` : ''}`, data: customer })); // Handle manufacturer selection const handleManufacturerSelect = (option: any) => { const manufacturer = option.data; setManufacturerSearchValue(manufacturer); setFormData(prev => ({ ...prev, manufacturer, model: "", // Reset model when manufacturer changes bodyType: "" // Reset body type when manufacturer changes })); setModelSearchValue(""); // Reset model search }; // Handle model selection const handleModelSelect = (option: any) => { const modelData = option.data; setModelSearchValue(modelData.model); setFormData(prev => ({ ...prev, model: modelData.model, bodyType: modelData.bodyType // Auto-set body type from dataset })); }; // Handle owner selection from autocomplete const handleOwnerSelect = (option: any) => { const customer = option.data; setOwnerSearchValue(customer.name); setFormData(prev => ({ ...prev, ownerId: customer.id.toString() })); }; // Reset form data when vehicle changes useEffect(() => { if (vehicle) { const owner = customers.find(c => c.id === vehicle.ownerId); setFormData({ plateNumber: vehicle.plateNumber || "", bodyType: vehicle.bodyType || "", manufacturer: vehicle.manufacturer || "", model: vehicle.model || "", trim: vehicle.trim || "", year: vehicle.year?.toString() || "", transmission: vehicle.transmission || "", fuel: vehicle.fuel || "", cylinders: vehicle.cylinders?.toString() || "", engineDisplacement: vehicle.engineDisplacement?.toString() || "", useType: vehicle.useType || "", ownerId: vehicle.ownerId?.toString() || "", }); setManufacturerSearchValue(vehicle.manufacturer || ""); setModelSearchValue(vehicle.model || ""); setOwnerSearchValue(owner ? owner.name : ""); } else { setFormData({ plateNumber: "", bodyType: "", manufacturer: "", model: "", trim: "", year: "", transmission: "", fuel: "", cylinders: "", engineDisplacement: "", useType: "", ownerId: "", }); setManufacturerSearchValue(""); setModelSearchValue(""); setOwnerSearchValue(""); } }, [vehicle, customers]); const handleInputChange = (field: string, value: string) => { setFormData(prev => ({ ...prev, [field]: value, })); }; const isEditing = !!vehicle; const currentYear = new Date().getFullYear(); return (
{isEditing && ( )}
{/* Plate Number */}
handleInputChange("plateNumber", e.target.value)} placeholder="أدخل رقم اللوحة" error={errors.plateNumber} required disabled={isLoading} dir="ltr" /> {errors.plateNumber && (

{errors.plateNumber}

)}
{/* Manufacturer with Autocomplete */}
{/* Hidden input for form submission */} {formData.manufacturer && manufacturerSearchValue && (

✓ تم اختيار الشركة المصنعة: {manufacturerSearchValue}

)}
{/* Model with Autocomplete */}
{/* Hidden input for form submission */} {formData.model && modelSearchValue && (

✓ تم اختيار الموديل: {modelSearchValue}

)} {!formData.manufacturer && (

يرجى اختيار الشركة المصنعة أولاً

)}
{/* Body Type (Auto-filled, Read-only) */}
{formData.bodyType && (

ℹ️ تم تعبئة نوع الهيكل تلقائياً من قاعدة البيانات

)} {errors.bodyType && (

{errors.bodyType}

)}
{/* Trim */}
handleInputChange("trim", e.target.value)} placeholder="أدخل الفئة (اختياري)" error={errors.trim} disabled={isLoading} /> {errors.trim && (

{errors.trim}

)}
{/* Year */}
handleInputChange("year", e.target.value)} placeholder={`${VALIDATION.MIN_YEAR} - ${currentYear}`} error={errors.year} required disabled={isLoading} /> {errors.year && (

{errors.year}

)}
{/* Transmission */}
{errors.transmission && (

{errors.transmission}

)}
{/* Fuel */}
{errors.fuel && (

{errors.fuel}

)}
{/* Cylinders */}
handleInputChange("cylinders", e.target.value)} placeholder="عدد الأسطوانات (اختياري)" error={errors.cylinders} disabled={isLoading} /> {errors.cylinders && (

{errors.cylinders}

)}
{/* Engine Displacement */}
handleInputChange("engineDisplacement", e.target.value)} placeholder="سعة المحرك (اختياري)" error={errors.engineDisplacement} disabled={isLoading} /> {errors.engineDisplacement && (

{errors.engineDisplacement}

)}
{/* Use Type */}
{errors.useType && (

{errors.useType}

)}
{/* Owner with Autocomplete */}
{/* Hidden input for form submission */} {formData.ownerId && ownerSearchValue && (

✓ تم اختيار المالك: {ownerSearchValue}

)} {!formData.ownerId && ownerSearchValue && (

يرجى اختيار المالك من القائمة المنسدلة

)}
{/* Form Actions */}
); }