'use client' import { useState } from 'react' import { marketplacePost } from '@/lib/api' import { useMarketplacePreferences } from '@/components/MarketplaceShell' type Props = { vehicleId: string companySlug: string dailyRate: number } const copy = { en: { title: 'Reserve this vehicle', firstName: 'First name', lastName: 'Last name', email: 'Email', phone: 'Phone', startDate: 'Pick-up date', endDate: 'Return date', notes: 'Notes (optional)', submit: 'Request reservation', submitting: 'Sending…', successTitle: 'Request received!', successBody: 'Your reservation request has been sent. The company will review it and contact you shortly.', invalidDates: 'Return date must be after pick-up date.', required: 'Please fill in all required fields.', perDay: '/ day', estimatedTotal: 'Estimated total', days: 'day(s)', genericError: 'Something went wrong. Please try again.', }, fr: { title: 'Réserver ce véhicule', firstName: 'Prénom', lastName: 'Nom', email: 'E-mail', phone: 'Téléphone', startDate: 'Date de départ', endDate: 'Date de retour', notes: 'Notes (optionnelles)', submit: 'Demander une réservation', submitting: 'Envoi…', successTitle: 'Demande reçue !', successBody: "Votre demande de réservation a été envoyée. L’entreprise va l’examiner et vous contactera prochainement.", invalidDates: 'La date de retour doit être après la date de départ.', required: 'Veuillez remplir tous les champs obligatoires.', perDay: '/ jour', estimatedTotal: 'Total estimé', days: 'jour(s)', genericError: 'Une erreur est survenue. Veuillez réessayer.', }, ar: { title: 'احجز هذه السيارة', firstName: 'الاسم الأول', lastName: 'اسم العائلة', email: 'البريد الإلكتروني', phone: 'الهاتف', startDate: 'تاريخ الاستلام', endDate: 'تاريخ الإرجاع', notes: 'ملاحظات (اختيارية)', submit: 'طلب حجز', submitting: 'جارٍ الإرسال…', successTitle: 'تم استلام الطلب!', successBody: 'تم إرسال طلب الحجز. ستراجعه الشركة وستتواصل معك قريباً.', invalidDates: 'يجب أن يكون تاريخ الإعادة بعد تاريخ الاستلام.', required: 'يرجى تعبئة جميع الحقول المطلوبة.', perDay: '/ يوم', estimatedTotal: 'الإجمالي التقديري', days: 'يوم', genericError: 'حدث خطأ ما. يرجى المحاولة مرة أخرى.', }, } as const export default function BookingForm({ vehicleId, companySlug, dailyRate }: Props) { const { language } = useMarketplacePreferences() const t = copy[language] const [firstName, setFirstName] = useState('') const [lastName, setLastName] = useState('') const [email, setEmail] = useState('') const [phone, setPhone] = useState('') const [startDate, setStartDate] = useState('') const [endDate, setEndDate] = useState('') const [notes, setNotes] = useState('') const [submitting, setSubmitting] = useState(false) const [error, setError] = useState(null) const [success, setSuccess] = useState(false) const totalDays = startDate && endDate ? Math.max(0, Math.ceil((new Date(endDate).getTime() - new Date(startDate).getTime()) / 86_400_000)) : 0 async function handleSubmit(e: React.FormEvent) { e.preventDefault() setError(null) if (!firstName.trim() || !lastName.trim() || !email.trim() || !phone.trim() || !startDate || !endDate) { setError(t.required) return } const start = new Date(startDate) const end = new Date(endDate) if (end <= start) { setError(t.invalidDates) return } setSubmitting(true) try { await marketplacePost('/marketplace/reservations', { vehicleId, companySlug, firstName: firstName.trim(), lastName: lastName.trim(), email: email.trim(), phone: phone.trim(), startDate: start.toISOString(), endDate: end.toISOString(), notes: notes.trim() || undefined, language, }) setSuccess(true) } catch (err: any) { setError(err.message ?? t.genericError) } finally { setSubmitting(false) } } if (success) { return (

{t.successTitle}

{t.successBody}

) } return (

{t.title}

{error ? (

{error}

) : null}
setFirstName(e.target.value)} className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 text-sm text-stone-900 outline-none focus:border-stone-400 dark:border-blue-800 dark:bg-[#162038] dark:text-stone-100 dark:focus:border-stone-500" />
setLastName(e.target.value)} className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 text-sm text-stone-900 outline-none focus:border-stone-400 dark:border-blue-800 dark:bg-[#162038] dark:text-stone-100 dark:focus:border-stone-500" />
setEmail(e.target.value)} className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 text-sm text-stone-900 outline-none focus:border-stone-400 dark:border-blue-800 dark:bg-[#162038] dark:text-stone-100 dark:focus:border-stone-500" />
setPhone(e.target.value)} className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 text-sm text-stone-900 outline-none focus:border-stone-400 dark:border-blue-800 dark:bg-[#162038] dark:text-stone-100 dark:focus:border-stone-500" />
setStartDate(e.target.value)} className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 text-sm text-stone-900 outline-none focus:border-stone-400 dark:border-blue-800 dark:bg-[#162038] dark:text-stone-100 dark:focus:border-stone-500" />
setEndDate(e.target.value)} className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 text-sm text-stone-900 outline-none focus:border-stone-400 dark:border-blue-800 dark:bg-[#162038] dark:text-stone-100 dark:focus:border-stone-500" />
{totalDays > 0 ? (

{t.estimatedTotal}:{' '} {(dailyRate * totalDays).toLocaleString()} MAD {' '} ({totalDays} {t.days})

) : null}