import { Head, Link, router } from '@inertiajs/react';
import { ArrowRight } from 'lucide-react';
import { useState } from 'react';
import PageIntro from '@/components/booking/page-intro';
import TripSummaryBar from '@/components/booking/trip-summary-bar';
import VehicleCard from '@/components/booking/vehicle-card';
import type { Vehicle, VehicleSort } from '@/components/booking/vehicles';
import { sortOptions, sortVehicles } from '@/components/booking/vehicles';
import SiteFooter from '@/components/home/site-footer';
import SiteHeader from '@/components/home/site-header';
import InputError from '@/components/input-error';
import { cn } from '@/lib/utils';
import { details } from '@/routes/booking';
import { select } from '@/routes/booking/vehicle';
import type { TripSummary } from '@/types/booking';

type Props = {
    trip: TripSummary;
    vehicles: Vehicle[];
    selectedVehicle: string | null;
};

export default function BookingVehicles({
    trip,
    vehicles,
    selectedVehicle,
}: Props) {
    const [sort, setSort] = useState<VehicleSort>('recommended');
    const [processingId, setProcessingId] = useState<string | null>(null);
    const [error, setError] = useState<string>();

    const visibleVehicles = sortVehicles(vehicles, sort);
    const selected = vehicles.find(
        (vehicle) => vehicle.id === selectedVehicle && vehicle.fits,
    );
    const title = trip.destination
        ? `${trip.pickup} to ${trip.destination}`
        : trip.pickup;

    const choose = (vehicle: Vehicle) => {
        router.put(
            select.url(),
            { vehicle: vehicle.id },
            {
                preserveScroll: true,
                onStart: () => {
                    setProcessingId(vehicle.id);
                    setError(undefined);
                },
                onFinish: () => setProcessingId(null),
                onError: (errors) => setError(errors.vehicle),
            },
        );
    };

    return (
        <>
            <Head title="Select Vehicle" />
            <div className="min-h-screen bg-mist font-google text-navy dark:bg-ink dark:text-white">
                <SiteHeader variant="solid" />

                <main className="mx-auto max-w-7xl px-4 pt-10 pb-20 sm:px-6 lg:px-10 lg:pt-16">
                    <PageIntro
                        title="Select Vehicle"
                        breadcrumbs={['Booking', title]}
                    />

                    <TripSummaryBar trip={trip} />

                    <div className="mt-8 flex [scrollbar-width:none] gap-2 overflow-x-auto pb-1">
                        {sortOptions.map((option) => (
                            <button
                                key={option.id}
                                type="button"
                                onClick={() => setSort(option.id)}
                                aria-pressed={sort === option.id}
                                className={cn(
                                    'shrink-0 rounded-full border px-5 py-2.5 text-sm font-medium transition-colors',
                                    sort === option.id
                                        ? 'border-gold bg-gold text-white'
                                        : 'border-navy/15 bg-[#f4f1ee] hover:border-gold dark:border-white/30 dark:bg-transparent',
                                )}
                            >
                                {option.label}
                            </button>
                        ))}
                    </div>

                    {vehicles.some((vehicle) => vehicle.is_estimate) && (
                        <p className="mt-4 text-sm text-navy/70 dark:text-white/70">
                            Starting fares shown. Pick your addresses from the
                            suggestions to get an exact fixed fare.
                        </p>
                    )}

                    <InputError message={error} className="mt-4" />

                    <div className="mt-10 space-y-5">
                        {visibleVehicles.map((vehicle) => (
                            <VehicleCard
                                key={vehicle.id}
                                vehicle={vehicle}
                                selected={selectedVehicle === vehicle.id}
                                processing={processingId === vehicle.id}
                                onSelect={() => choose(vehicle)}
                            />
                        ))}
                        {visibleVehicles.length === 0 && (
                            <p className="rounded-2xl bg-white p-8 text-center text-navy/70 dark:bg-ocean dark:text-white/80">
                                No vehicles match this filter.
                            </p>
                        )}
                    </div>
                </main>

                {selected && (
                    <div className="sticky bottom-0 z-20 border-t border-navy/10 bg-white/95 px-4 py-3 shadow-[0_-8px_30px_-16px_rgba(11,31,51,0.3)] backdrop-blur sm:px-6 dark:border-white/10 dark:bg-ink/95">
                        <div className="mx-auto flex max-w-7xl items-center justify-between gap-4 lg:px-4">
                            <div className="min-w-0">
                                <p className="truncate text-sm font-semibold sm:text-base">
                                    {selected.name}
                                </p>
                                <p className="text-sm text-navy/70 dark:text-white/70">
                                    {selected.is_estimate && 'From '}
                                    {selected.price}
                                </p>
                            </div>
                            <Link
                                href={details()}
                                className="flex shrink-0 items-center gap-2 rounded-lg bg-gold px-6 py-3 text-sm font-semibold text-white transition-colors hover:bg-gold-dark sm:px-8 sm:text-base"
                            >
                                Continue
                                <ArrowRight className="size-4" />
                            </Link>
                        </div>
                    </div>
                )}

                <SiteFooter className="bg-mist dark:bg-ink" />
            </div>
        </>
    );
}
