import { Head, Link } from '@inertiajs/react';
import { useMemo, useState } from 'react';
import {
    ArrowLeft,
    ArrowRight,
    CalendarDays,
    CheckCircle2,
    Clock3,
    Download,
    History,
    Search,
} from 'lucide-react';
import SiteFooter from '@/components/home/site-footer';
import SiteHeader from '@/components/home/site-header';
import { home } from '@/routes';
import { confirmation } from '@/routes/booking';
import type { BookingSummary } from '@/types/booking';

type Props = { trips: BookingSummary[] };
type Filter = 'upcoming' | 'active' | 'completed' | 'cancelled';

const cardClass =
    'rounded-2xl border border-navy/10 bg-white shadow-[0_8px_30px_-18px_rgba(11,31,51,0.24)] dark:border-white/10 dark:bg-ocean';

export default function Bookings({ trips }: Props) {
    const [filter, setFilter] = useState<Filter>('upcoming');
    const [query, setQuery] = useState('');
    const now = new Date();

    const counts = useMemo(() => ({
        upcoming: trips.filter((trip) => trip.status === 'confirmed' && new Date(trip.pickup_at_iso) >= now).length,
        active: trips.filter((trip) => trip.status === 'confirmed' && new Date(trip.pickup_at_iso) < now).length,
        completed: trips.filter((trip) => trip.status === 'completed').length,
        cancelled: trips.filter((trip) => trip.status === 'cancelled').length,
    }), [trips, now]);

    const visibleTrips = trips.filter((trip) => {
        const matchesFilter =
            filter === 'upcoming'
                ? trip.status === 'confirmed' && new Date(trip.pickup_at_iso) >= now
                : filter === 'active'
                  ? trip.status === 'confirmed' && new Date(trip.pickup_at_iso) < now
                  : trip.status === filter;
        const text = `${trip.reference} ${trip.pickup} ${trip.destination ?? ''} ${trip.vehicle}`.toLowerCase();
        return matchesFilter && text.includes(query.toLowerCase());
    });

    const tabs: { id: Filter; label: string; count: number; icon: typeof Clock3 }[] = [
        { id: 'upcoming', label: 'Upcoming', count: counts.upcoming, icon: Clock3 },
        { id: 'active', label: 'Active', count: counts.active, icon: CalendarDays },
        { id: 'completed', label: 'Completed', count: counts.completed, icon: CheckCircle2 },
        { id: 'cancelled', label: 'Cancelled', count: counts.cancelled, icon: History },
    ];

    return (
        <>
            <Head title="My Journeys & Bookings" />
            <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-14">
                    <Link href={home()} className="inline-flex items-center gap-2 rounded-lg bg-sand px-5 py-3 text-sm font-semibold hover:bg-gold/20 dark:bg-ocean">
                        <ArrowLeft className="size-4" /> Go back
                    </Link>

                    <div className="mt-10 flex flex-col gap-6 lg:flex-row lg:items-end lg:justify-between">
                        <div>
                            <h1 className="text-4xl font-semibold tracking-tight sm:text-5xl">My Journeys &amp; Bookings</h1>
                            <p className="mt-4 max-w-2xl text-sm leading-6 text-navy/65 dark:text-white/65">
                                Manage your upcoming rides, track active journeys, and review your complete booking history.
                            </p>
                        </div>
                        <div className="flex flex-wrap gap-3">
                            <button type="button" className="inline-flex items-center gap-2 rounded-lg border border-navy/15 bg-white px-5 py-3 text-sm font-semibold dark:border-white/20 dark:bg-ocean">
                                <Download className="size-4" /> Export report
                            </button>
                            <Link href={`${home()}#book`} className="inline-flex items-center gap-2 rounded-lg bg-gold px-5 py-3 text-sm font-semibold text-white hover:bg-gold-dark">
                                Book a New Ride <ArrowRight className="size-4" />
                            </Link>
                        </div>
                    </div>

                    <div className="mt-10 grid gap-6 lg:grid-cols-[minmax(0,1fr)_320px]">
                        <section>
                            <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
                                <div className="flex flex-wrap gap-2">
                                    {tabs.map(({ id, label, count, icon: Icon }) => (
                                        <button key={id} type="button" onClick={() => setFilter(id)} className={`inline-flex items-center gap-2 rounded-lg px-4 py-3 text-sm font-semibold ${filter === id ? 'bg-white text-navy shadow-sm dark:bg-ocean dark:text-white' : 'text-navy/60 hover:text-navy dark:text-white/60 dark:hover:text-white'}`}>
                                            <Icon className="size-4" /> {label} <span className="rounded-full bg-navy/10 px-2 py-0.5 text-xs dark:bg-white/10">{count}</span>
                                        </button>
                                    ))}
                                </div>
                                <label className="flex items-center gap-2 rounded-lg border border-navy/10 bg-white px-3 py-2.5 text-sm dark:border-white/10 dark:bg-ocean">
                                    <Search className="size-4 text-navy/45 dark:text-white/45" />
                                    <input value={query} onChange={(event) => setQuery(event.target.value)} placeholder="Search bookings..." className="w-full bg-transparent outline-none placeholder:text-navy/45 dark:placeholder:text-white/45 sm:w-44" />
                                </label>
                            </div>

                            <div className="mt-5 space-y-4">
                                {visibleTrips.map((trip) => {
                                    const isUpcoming = trip.status === 'confirmed' && new Date(trip.pickup_at_iso) >= now;
                                    return (
                                        <Link key={trip.reference} href={confirmation(trip.reference)} className={`${cardClass} block p-5 transition hover:-translate-y-0.5 hover:border-gold sm:p-6`}>
                                            <div className="flex flex-wrap items-center justify-between gap-3 border-b border-navy/10 pb-4 dark:border-white/10">
                                                <div><span className="font-bold text-navy dark:text-white">#{trip.reference}</span><span className="ml-2 text-sm text-navy/55 dark:text-white/55">· {trip.service}</span></div>
                                                <span className={`rounded-full px-3 py-1 text-xs font-semibold ${isUpcoming ? 'bg-blue-100 text-blue-800 dark:bg-blue-400/15 dark:text-blue-200' : 'bg-green-100 text-green-800 dark:bg-green-400/15 dark:text-green-200'}`}>{isUpcoming ? 'Upcoming' : trip.status_label}</span>
                                            </div>
                                            <div className="mt-5 grid gap-5 md:grid-cols-[1fr_auto]">
                                                <div className="relative space-y-5 pl-7 before:absolute before:top-3 before:bottom-3 before:left-1.5 before:border-l-2 before:border-dashed before:border-navy/15 dark:before:border-white/15">
                                                    <div className="relative"><span className="absolute -left-7 top-1 size-3 rounded-full border-2 border-white bg-navy ring-4 ring-blue-100 dark:border-ocean dark:bg-white dark:ring-blue-400/20" /><p className="font-semibold">{trip.pickup}</p><p className="mt-1 text-sm text-navy/55 dark:text-white/55">{trip.pickup_at_label}</p></div>
                                                    {trip.destination && <div className="relative"><span className="absolute -left-7 top-1 size-3 rounded-full border-2 border-white bg-blue-600 ring-4 ring-blue-100 dark:border-ocean dark:bg-blue-400 dark:ring-blue-400/20" /><p className="font-semibold">{trip.destination}</p><p className="mt-1 text-sm text-navy/55 dark:text-white/55">{trip.duration ?? 'Destination transfer'}</p></div>}
                                                </div>
                                                <div className="rounded-xl bg-cream p-4 md:min-w-52 dark:bg-ink"><p className="text-xs font-semibold uppercase tracking-wide text-navy/55 dark:text-white/55">Vehicle</p><p className="mt-2 font-semibold">{trip.vehicle}</p><p className="mt-1 text-sm text-navy/60 dark:text-white/60">{trip.passengers} passengers · {trip.bags} bags</p></div>
                                            </div>
                                            <div className="mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-navy/10 pt-4 dark:border-white/10"><div><p className="text-xs text-navy/55 dark:text-white/55">Total fare</p><p className="text-2xl font-bold">{trip.fare}</p></div><span className="inline-flex items-center gap-2 rounded-lg bg-gold px-4 py-2 text-sm font-semibold text-white">View booking <ArrowRight className="size-4" /></span></div>
                                        </Link>
                                    );
                                })}
                                {visibleTrips.length === 0 && <div className={`${cardClass} p-10 text-center`}><p className="font-semibold">No bookings found</p><p className="mt-1 text-sm text-navy/60 dark:text-white/60">Try another tab or book your next ride.</p></div>}
                            </div>
                        </section>

                        <aside className="space-y-5">
                            <section className={`${cardClass} p-5`}><div className="flex items-center justify-between"><h2 className="text-lg font-semibold">Booking summary</h2><span className="text-sm text-navy/55 dark:text-white/55">All time</span></div><div className="mt-5 grid grid-cols-2 gap-3"><div className="rounded-xl bg-cream p-4 dark:bg-ink"><p className="text-xs text-navy/55 dark:text-white/55">Total bookings</p><p className="mt-1 text-2xl font-bold">{trips.length}</p></div><div className="rounded-xl bg-cream p-4 dark:bg-ink"><p className="text-xs text-navy/55 dark:text-white/55">Upcoming</p><p className="mt-1 text-2xl font-bold">{counts.upcoming}</p></div></div><div className="mt-5 flex justify-between border-t border-navy/10 pt-4 text-sm dark:border-white/10"><span className="text-navy/60 dark:text-white/60">Completed journeys</span><strong>{counts.completed}</strong></div></section>
                            <section className={`${cardClass} p-5`}><h2 className="text-lg font-semibold">Need assistance?</h2><p className="mt-2 text-sm leading-6 text-navy/60 dark:text-white/60">Our concierge team is available to help with changes, luggage, or route requirements.</p><a href="mailto:dispatch@voyagetransit.com" className="mt-5 block rounded-lg bg-cream px-4 py-3 text-center text-sm font-semibold dark:bg-ink">Contact Concierge</a></section>
                        </aside>
                    </div>
                </main>
                <SiteFooter className="bg-mist dark:bg-ink" />
            </div>
        </>
    );
}
