'use client'; import { useState, useCallback } from 'react'; import { Button } from '@/components/ui/Button'; import { comparePrices, type PriceCompareResponse, type ComparableListing } from '@/lib/retouch'; interface PriceComparisonProps { vehicleId?: string; } export function PriceComparison({ vehicleId }: PriceComparisonProps) { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [data, setData] = useState(null); const [inputVehicleId, setInputVehicleId] = useState(vehicleId || ''); const handleCompare = useCallback(async () => { const vid = inputVehicleId.trim(); if (!vid) { setError('Please enter a vehicle ID'); return; } setLoading(true); setError(null); try { const result = await comparePrices(vid); setData(result); } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setError(apiErr?.error?.message || 'Price comparison failed'); setData(null); } finally { setLoading(false); } }, [inputVehicleId]); const formatPrice = (price: number) => { return new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0, }).format(price); }; return (
setInputVehicleId(e.target.value)} placeholder="Enter vehicle UUID" className="w-full px-3 py-2 border border-border rounded-lg text-text focus:outline-none focus:ring-2 focus:ring-primary" data-testid="price-compare-vehicle-input" />
{error && (
{error}
)} {loading && (
Searching comparable listings...
)} {data && !loading && (
{/* Summary */}

Comparable Listings

{data.listing_count}

Average Price

{data.average_price !== null ? formatPrice(data.average_price) : 'N/A'}

{/* Listings table */} {data.comparable_listings.length > 0 ? (
{data.comparable_listings.map((listing: ComparableListing, idx: number) => ( ))}
Title Price Mileage Location Source
{listing.url ? ( {listing.title} ) : ( listing.title )} {formatPrice(listing.price)} {listing.mileage_km !== null && listing.mileage_km !== undefined ? `${listing.mileage_km.toLocaleString('de-DE')} km` : '-'} {listing.location || '-'} {listing.source}
) : (
No comparable listings found.
)}
)}
); }