import Link from 'next/link' import { marketplaceFetchOrDefault } from '@/lib/api' import { getMarketplaceLanguage } from '@/lib/i18n.server' import ExploreVehicleGrid from './ExploreVehicleGrid' interface Vehicle { id: string make: string model: string year: number category: string dailyRate: number photos: string[] availability?: boolean | null availabilityStatus?: 'AVAILABLE' | 'RESERVED' | 'MAINTENANCE' | 'UNAVAILABLE' nextAvailableAt?: string | null company: { slug: string brand: { displayName: string logoUrl: string | null subdomain: string marketplaceRating: number | null } | null } } interface Offer { id: string title: string discountValue: number validUntil: string company: { brand: { displayName: string subdomain: string } | null } } interface CompanyCard { id: string brand: { displayName: string subdomain: string publicCity: string | null marketplaceRating: number | null } | null _count: { vehicles: number } } export default async function ExplorePage({ searchParams }: { searchParams?: Record }) { const language = getMarketplaceLanguage() const dict = { en: { kicker: 'Discovery only', title: 'Find your next rental from trusted local companies.', body: 'Browse, filter, and reserve — the company confirms and contacts you directly.', city: 'City or location', allCategories: 'All categories', anyTransmission: 'Any transmission', makePlaceholder: 'Make (e.g. Toyota)', modelPlaceholder: 'Model (e.g. Corolla)', search: 'Search', currentDeals: 'Current deals', featuredOffers: 'Featured marketplace offers', company: 'Company', validUntil: 'Valid until', offersUnavailable: 'Marketplace offers are unavailable right now.', availableVehicles: 'Available vehicles', listings: 'listings', rentalCompany: 'Rental company', checkAvailability: 'Check availability', available: 'Available', reserved: 'Reserved', maintenance: 'In maintenance', unavailableStatus: 'Unavailable', from: 'From', bookNow: 'Reserve', availableFrom: 'Available from', reserveAfterDate: 'This vehicle can only be reserved starting', unavailableNoDate: 'This vehicle is temporarily unavailable for new reservations.', details: 'Details', vehicleUnavailable: 'Vehicle listings are unavailable right now.', browseByCategory: 'Browse by category', browseByCompany: 'Browse by company', marketplacePartners: 'Marketplace partners', marketplacePartner: 'Marketplace partner', rating: 'Rating', new: 'New', publishedVehicles: 'published vehicles', viewFleet: 'View fleet', categories: ['Economy', 'Compact', 'SUV', 'Luxury', 'Van', 'Truck', 'Electric'], // modal reserveVehicle: 'Reserve this vehicle', pickupDate: 'Pick-up date', returnDate: 'Return date', firstName: 'First name', lastName: 'Last name', email: 'Email address', phone: 'Phone number (optional)', notes: 'Additional notes (optional)', cancel: 'Cancel', submitRequest: 'Send reservation request', submitting: 'Sending…', successTitle: 'Request sent!', successBody: 'Your reservation request has been received. Check your inbox for a confirmation email — the company will contact you shortly.', close: 'Close', errorUnavailable: 'This vehicle is no longer available for the selected dates. Please choose different dates.', errorGeneric: 'Something went wrong. Please try again.', }, fr: { kicker: 'Découverte uniquement', title: "Trouvez votre prochaine location auprès d'entreprises locales fiables.", body: "Parcourez, filtrez et réservez — l'entreprise confirme et vous contacte directement.", city: 'Ville ou emplacement', allCategories: 'Toutes les catégories', anyTransmission: 'Toute transmission', makePlaceholder: 'Marque (ex. Toyota)', modelPlaceholder: 'Modèle (ex. Corolla)', search: 'Rechercher', currentDeals: 'Offres du moment', featuredOffers: 'Offres marketplace mises en avant', company: 'Entreprise', validUntil: "Valable jusqu'au", offersUnavailable: 'Les offres marketplace sont indisponibles pour le moment.', availableVehicles: 'Véhicules disponibles', listings: 'annonces', rentalCompany: 'Société de location', checkAvailability: 'Vérifier la disponibilité', available: 'Disponible', reserved: 'Réservé', maintenance: 'En maintenance', unavailableStatus: 'Indisponible', from: 'À partir de', bookNow: 'Réserver', availableFrom: 'Disponible à partir du', reserveAfterDate: 'Ce véhicule ne peut être réservé qu’à partir du', unavailableNoDate: 'Ce véhicule est temporairement indisponible pour les nouvelles réservations.', details: 'Détails', vehicleUnavailable: 'Les annonces véhicules sont indisponibles pour le moment.', browseByCategory: 'Parcourir par catégorie', browseByCompany: 'Parcourir par entreprise', marketplacePartners: 'Partenaires marketplace', marketplacePartner: 'Partenaire marketplace', rating: 'Note', new: 'Nouveau', publishedVehicles: 'véhicules publiés', viewFleet: 'Voir la flotte', categories: ['Économie', 'Compacte', 'SUV', 'Luxe', 'Van', 'Camion', 'Électrique'], reserveVehicle: 'Réserver ce véhicule', pickupDate: 'Date de prise en charge', returnDate: 'Date de retour', firstName: 'Prénom', lastName: 'Nom', email: 'Adresse e-mail', phone: 'Numéro de téléphone (optionnel)', notes: 'Notes supplémentaires (optionnel)', cancel: 'Annuler', submitRequest: 'Envoyer la demande', submitting: 'Envoi…', successTitle: 'Demande envoyée !', successBody: "Votre demande de réservation a été reçue. Vérifiez votre boîte mail — l'entreprise vous contactera prochainement.", close: 'Fermer', errorUnavailable: "Ce véhicule n'est plus disponible pour les dates sélectionnées.", errorGeneric: 'Une erreur est survenue. Veuillez réessayer.', }, ar: { kicker: 'للاستكشاف فقط', title: 'اعثر على سيارتك القادمة من شركات محلية موثوقة.', body: 'تصفّح وابحث واحجز — تؤكد الشركة وتتواصل معك مباشرةً.', city: 'المدينة أو الموقع', allCategories: 'كل الفئات', anyTransmission: 'أي ناقل حركة', makePlaceholder: 'الماركة (مثل Toyota)', modelPlaceholder: 'الموديل (مثل Corolla)', search: 'بحث', currentDeals: 'العروض الحالية', featuredOffers: 'عروض السوق المميزة', company: 'شركة', validUntil: 'صالح حتى', offersUnavailable: 'عروض السوق غير متاحة حالياً.', availableVehicles: 'السيارات المتاحة', listings: 'إعلانات', rentalCompany: 'شركة تأجير', checkAvailability: 'تحقق من التوفر', available: 'متاح', reserved: 'محجوز', maintenance: 'قيد الصيانة', unavailableStatus: 'غير متاح', from: 'ابتداءً من', bookNow: 'احجز', availableFrom: 'متاح ابتداءً من', reserveAfterDate: 'يمكن حجز هذه السيارة ابتداءً من', unavailableNoDate: 'هذه السيارة غير متاحة مؤقتاً للحجوزات الجديدة.', details: 'التفاصيل', vehicleUnavailable: 'قوائم السيارات غير متاحة حالياً.', browseByCategory: 'تصفح حسب الفئة', browseByCompany: 'تصفح حسب الشركة', marketplacePartners: 'شركاء السوق', marketplacePartner: 'شريك في السوق', rating: 'التقييم', new: 'جديد', publishedVehicles: 'سيارات منشورة', viewFleet: 'عرض الأسطول', categories: ['اقتصادية', 'مدمجة', 'SUV', 'فاخرة', 'فان', 'شاحنة', 'كهربائية'], reserveVehicle: 'احجز هذه السيارة', pickupDate: 'تاريخ الاستلام', returnDate: 'تاريخ الإرجاع', firstName: 'الاسم الأول', lastName: 'اسم العائلة', email: 'البريد الإلكتروني', phone: 'رقم الهاتف (اختياري)', notes: 'ملاحظات إضافية (اختياري)', cancel: 'إلغاء', submitRequest: 'إرسال طلب الحجز', submitting: 'جارٍ الإرسال…', successTitle: 'تم إرسال الطلب!', successBody: 'تم استلام طلب الحجز. تحقق من بريدك الإلكتروني — ستتواصل معك الشركة قريباً.', close: 'إغلاق', errorUnavailable: 'السيارة غير متاحة في التواريخ المحددة. يرجى اختيار تواريخ أخرى.', errorGeneric: 'حدث خطأ ما. يرجى المحاولة مرة أخرى.', }, }[language] const city = typeof searchParams?.city === 'string' ? searchParams.city : '' const category = typeof searchParams?.category === 'string' ? searchParams.category : '' const transmission = typeof searchParams?.transmission === 'string' ? searchParams.transmission : '' const make = typeof searchParams?.make === 'string' ? searchParams.make : '' const model = typeof searchParams?.model === 'string' ? searchParams.model : '' const query = new URLSearchParams() if (city) query.set('city', city) if (category) query.set('category', category) if (transmission) query.set('transmission', transmission) if (make) query.set('make', make) if (model) query.set('model', model) query.set('pageSize', '24') const [offers, vehicles, companies] = await Promise.all([ marketplaceFetchOrDefault('/marketplace/offers', []), marketplaceFetchOrDefault(`/marketplace/search?${query.toString()}`, []), marketplaceFetchOrDefault('/marketplace/companies?pageSize=8', []), ]) return (

{dict.kicker}

{dict.title}

{dict.body}

{dict.currentDeals}

{dict.featuredOffers}

{offers.map((offer) => (

{offer.company.brand?.displayName ?? dict.company}

{offer.title}

{offer.discountValue}%

{dict.validUntil} {new Date(offer.validUntil).toLocaleDateString()}

))} {offers.length === 0 &&
{dict.offersUnavailable}
}

{dict.browseByCategory}

{dict.categories.map((categoryName, index) => ( {categoryName} ))}

{dict.browseByCompany}

{dict.marketplacePartners}

{companies.map((company) => (

{company.brand?.publicCity ?? dict.marketplacePartner}

{company.brand?.displayName ?? dict.rentalCompany}

{dict.rating} {company.brand?.marketplaceRating?.toFixed(1) ?? dict.new}

{company._count.vehicles} {dict.publishedVehicles}

{dict.viewFleet} ))}
) }