import { Head, Link, usePage } from '@inertiajs/react';
import { useState } from 'react';
import {
    ArrowRight,
    CalendarClock,
    CarFront,
    CheckCircle2,
    Clock3,
    History,
    Navigation,
    MapPin,
    Settings,
    UserRound,
} from 'lucide-react';
import SiteFooter from '@/components/home/site-footer';
import SiteHeader from '@/components/home/site-header';
import OnboardingProgress from '@/components/onboarding/onboarding-progress';
import { useInitials } from '@/hooks/use-initials';
import { home } from '@/routes';
import { confirmation, schedule, vehicles } from '@/routes/booking';
import { profile } from '@/routes/onboarding';
import { index as bookingsIndex } from '@/routes/bookings';
import { edit as editAppearance } from '@/routes/appearance';
import { edit as editSettings } from '@/routes/profile';
import { edit as editSecurity } from '@/routes/security';
import type { BookingSummary } from '@/types/booking';
import type { ProfileProgress } from '@/types/profile';

type Props = {
    progress: ProfileProgress;
    preferences: {
        vehicle: string;
        luggage: string;
        amenities: string[];
    };
    trips: BookingSummary[];
    activeTrip: BookingSummary | null;
    pendingTrip: {
        pickup: string;
        destination: string | null;
        pickup_at: string | null;
        step: 'schedule' | 'vehicles';
    } | null;
};

const cardClass =
    'min-w-0 overflow-hidden rounded-2xl bg-white p-6 shadow-[0_8px_30px_-16px_rgba(11,31,51,0.18)] dark:bg-ocean dark:shadow-none';

export default function CustomerDashboard({
    progress,
    preferences,
    trips,
    activeTrip,
    pendingTrip,
}: Props) {
    const { auth } = usePage().props;
    const getInitials = useInitials();
    const firstName = auth.user.name.split(' ')[0];
    const [tripView, setTripView] = useState<'all' | 'upcoming' | 'past'>('all');
    const now = new Date();
    const upcomingTrips = trips.filter(
        (trip) => trip.status === 'confirmed' && new Date(trip.pickup_at_iso) >= now,
    );
    const pastTrips = trips.filter(
        (trip) =>
            trip.status === 'completed' ||
            trip.status === 'cancelled' ||
            (trip.status === 'confirmed' && new Date(trip.pickup_at_iso) < now),
    );
    const visibleTrips =
        tripView === 'upcoming'
            ? upcomingTrips
            : tripView === 'past'
              ? pastTrips
              : trips;

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

                <main className="mx-auto min-w-0 max-w-6xl overflow-hidden px-4 pt-12 pb-20 sm:px-6 lg:pt-16">
                    <div className="flex flex-col gap-6 sm:flex-row sm:items-center sm:justify-between">
                        <div className="flex items-center gap-4">
                            <span className="flex size-16 shrink-0 items-center justify-center overflow-hidden rounded-full bg-navy/10 text-xl font-semibold dark:bg-white/10">
                                {auth.user.avatar ? (
                                    <img
                                        src={auth.user.avatar}
                                        alt={auth.user.name}
                                        className="size-full object-cover"
                                    />
                                ) : (
                                    getInitials(auth.user.name)
                                )}
                            </span>
                            <div>
                                <p className="text-sm text-navy/60 dark:text-white/60">
                                    Welcome back
                                </p>
                                <h1 className="text-3xl font-semibold tracking-tight sm:text-4xl">
                                    Hi, {firstName}
                                </h1>
                            </div>
                        </div>
                        <div className="flex flex-wrap gap-3">
                            <Link
                                href={bookingsIndex()}
                                className="flex items-center justify-center gap-2 rounded-lg border border-navy/15 bg-white px-5 py-3 font-semibold transition-colors hover:border-gold hover:text-gold-dark dark:border-white/20 dark:bg-ocean dark:hover:border-gold"
                            >
                                My bookings
                                <CalendarClock className="size-4" />
                            </Link>
                            <Link
                                href={`${home.url()}#book`}
                                className="flex items-center justify-center gap-2 rounded-lg bg-gold px-6 py-3 font-semibold text-white transition-colors hover:bg-gold-dark"
                            >
                                Book a ride
                                <ArrowRight className="size-4" />
                            </Link>
                        </div>
                    </div>

                    {activeTrip && (
                        <section className="mt-8 overflow-hidden rounded-2xl bg-navy text-white shadow-[0_12px_35px_-18px_rgba(11,31,51,0.55)]">
                            <div className="flex flex-col gap-5 p-6 sm:flex-row sm:items-center sm:justify-between sm:p-8">
                                <div className="flex items-start gap-4">
                                    <span className="flex size-12 shrink-0 items-center justify-center rounded-xl bg-green-400/15 text-green-300">
                                        <Navigation className="size-6" />
                                    </span>
                                    <div>
                                        <p className="flex items-center gap-2 text-sm font-semibold text-green-300">
                                            <span className="size-2 animate-pulse rounded-full bg-green-300" />
                                            Journey in progress
                                        </p>
                                        <h2 className="mt-1 text-xl font-semibold">
                                            {activeTrip.pickup} → {activeTrip.destination ?? 'Your destination'}
                                        </h2>
                                        <p className="mt-1 text-sm text-white/70">
                                            {activeTrip.vehicle} · {activeTrip.reference} · {activeTrip.pickup_at_label}
                                        </p>
                                    </div>
                                </div>
                                <Link
                                    href={`/booking/${activeTrip.reference}/tracking`}
                                    className="inline-flex shrink-0 items-center justify-center gap-2 rounded-lg bg-gold px-6 py-3 font-semibold text-white transition-colors hover:bg-gold-dark"
                                >
                                    Track active journey
                                    <ArrowRight className="size-4" />
                                </Link>
                            </div>
                            <div className="border-t border-white/10 bg-white/5 px-6 py-3 text-xs text-white/70 sm:px-8">
                                Trip status is based on the scheduled pickup. Live vehicle location will appear here when chauffeur tracking is connected.
                            </div>
                        </section>
                    )}

                    {pendingTrip && (
                        <section className="mt-10 flex flex-col gap-4 rounded-2xl border border-gold/40 bg-gold/10 p-6 sm:flex-row sm:items-center sm:justify-between">
                            <div className="flex min-w-0 items-start gap-3">
                                <MapPin className="mt-1 size-5 shrink-0 text-gold-dark" />
                                <div className="min-w-0">
                                    <p className="font-semibold">
                                        Finish your booking
                                    </p>
                                    <p className="truncate text-sm text-navy/70 dark:text-white/80">
                                        {pendingTrip.pickup}
                                        {pendingTrip.destination &&
                                            ` → ${pendingTrip.destination}`}
                                        {pendingTrip.pickup_at &&
                                            ` · ${pendingTrip.pickup_at}`}
                                    </p>
                                </div>
                            </div>
                            <Link
                                href={
                                    pendingTrip.step === 'schedule'
                                        ? schedule()
                                        : vehicles()
                                }
                                className="flex shrink-0 items-center justify-center gap-2 rounded-lg bg-navy px-5 py-2.5 text-sm font-semibold text-white dark:bg-white dark:text-navy"
                            >
                                Continue
                                <ArrowRight className="size-4" />
                            </Link>
                        </section>
                    )}

                    <section className={`${cardClass} mt-8`}>
                        <div className="mb-6 flex flex-wrap items-center justify-between gap-3">
                            <h2 className="flex items-center gap-2 text-lg font-semibold">
                                <UserRound className="size-5" />
                                Your profile
                            </h2>
                            <Link
                                href={profile()}
                                className="text-sm font-semibold text-gold-dark hover:underline dark:text-gold"
                            >
                                {progress.current
                                    ? 'Complete profile'
                                    : 'Edit profile'}
                            </Link>
                        </div>
                        <OnboardingProgress progress={progress} />
                    </section>

                    <div className="mt-6 grid gap-6 lg:grid-cols-2">
                        <section className={cardClass}>
                            <div className="flex items-center justify-between gap-3">
                                <h2 className="flex items-center gap-2 text-lg font-semibold">
                                    <CarFront className="size-5" />
                                    Chauffeur preferences
                                </h2>
                                <Link
                                    href={profile()}
                                    className="text-sm font-semibold text-gold-dark hover:underline dark:text-gold"
                                >
                                    Change
                                </Link>
                            </div>
                            <dl className="mt-5 space-y-4 text-sm">
                                <div className="flex min-w-0 justify-between gap-4">
                                    <dt className="text-navy/60 dark:text-white/60">
                                        Vehicle tier
                                    </dt>
                                    <dd className="font-medium">
                                        {preferences.vehicle}
                                    </dd>
                                </div>
                                <div className="flex min-w-0 justify-between gap-4">
                                    <dt className="text-navy/60 dark:text-white/60">
                                        Luggage
                                    </dt>
                                    <dd className="min-w-0 max-w-[65%] break-words text-right font-medium">
                                        {preferences.luggage}
                                    </dd>
                                </div>
                                <div className="flex min-w-0 justify-between gap-4">
                                    <dt className="text-navy/60 dark:text-white/60">
                                        Amenities
                                    </dt>
                                    <dd className="min-w-0 max-w-[65%] break-words text-right font-medium">
                                        {preferences.amenities.length > 0
                                            ? preferences.amenities.join(', ')
                                            : 'None selected'}
                                    </dd>
                                </div>
                            </dl>
                        </section>

                        <section className={`${cardClass} lg:col-span-2`}>
                            <div className="flex flex-wrap items-center justify-between gap-3">
                                <h2 className="flex items-center gap-2 text-lg font-semibold">
                                    <CalendarClock className="size-5" />
                                    My trips
                                </h2>
                                <span className="text-sm text-navy/60 dark:text-white/60">
                                    {trips.length} {trips.length === 1 ? 'trip' : 'trips'}
                                </span>
                            </div>

                            <Link
                                href={bookingsIndex()}
                                className="mt-4 inline-flex items-center gap-2 text-sm font-semibold text-gold-dark hover:underline dark:text-gold"
                            >
                                View all bookings
                                <ArrowRight className="size-4" />
                            </Link>

                            <div className="mt-5 grid grid-cols-1 gap-2 sm:grid-cols-3">
                                {[
                                    { id: 'all' as const, label: 'All trips', count: trips.length, icon: CalendarClock },
                                    { id: 'upcoming' as const, label: 'Upcoming', count: upcomingTrips.length, icon: Clock3 },
                                    { id: 'past' as const, label: 'Completed / past', count: pastTrips.length, icon: History },
                                ].map((tab) => (
                                    <button
                                        key={tab.id}
                                        type="button"
                                        onClick={() => setTripView(tab.id)}
                                        aria-pressed={tripView === tab.id}
                                        className={`rounded-xl border px-3 py-3 text-left transition-colors ${tripView === tab.id ? 'border-gold bg-gold/10' : 'border-navy/10 hover:border-gold/50 dark:border-white/15'}`}
                                    >
                                        <tab.icon className="size-4 text-gold-dark dark:text-gold" />
                                        <span className="mt-2 block text-xs text-navy/60 dark:text-white/60">{tab.label}</span>
                                        <span className="text-lg font-semibold">{tab.count}</span>
                                    </button>
                                ))}
                            </div>

                            {visibleTrips.length > 0 ? (
                                <ul className="mt-5 space-y-3">
                                    {visibleTrips.map((trip) => {
                                        const isUpcoming = trip.status === 'confirmed' && new Date(trip.pickup_at_iso) >= now;
                                        const isCompleted = trip.status === 'completed';
                                        const isPastScheduled = trip.status === 'confirmed' && !isUpcoming;
                                        return (
                                            <li key={trip.reference}>
                                                <Link
                                                    href={confirmation(trip.reference)}
                                                    className="block rounded-xl bg-mist p-4 transition-colors hover:bg-gold/10 dark:bg-ink dark:hover:bg-white/10"
                                                >
                                                    <div className="flex min-w-0 flex-wrap items-center justify-between gap-3">
                                                        <span className="min-w-0 text-sm font-semibold">{trip.pickup_at_label}</span>
                                                        <span className={`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-semibold ${isUpcoming ? 'bg-blue-100 text-blue-800 dark:bg-blue-400/15 dark:text-blue-200' : isCompleted ? 'bg-green-100 text-green-800 dark:bg-green-400/15 dark:text-green-200' : 'bg-gray-200 text-gray-700 dark:bg-white/10 dark:text-white/70'}`}>
                                                            {isUpcoming ? <Clock3 className="size-3" /> : isCompleted ? <CheckCircle2 className="size-3" /> : <History className="size-3" />}
                                                            {isUpcoming ? 'Upcoming' : isCompleted ? 'Completed' : isPastScheduled ? 'Past trip' : trip.status_label}
                                                        </span>
                                                    </div>
                                                    <p className="mt-2 truncate text-sm text-navy/75 dark:text-white/75">
                                                        {trip.pickup}{trip.destination && ` → ${trip.destination}`}
                                                    </p>
                                                    <div className="mt-2 flex flex-wrap justify-between gap-2 text-xs text-navy/60 dark:text-white/60">
                                                        <span className="min-w-0 truncate">{trip.vehicle} · {trip.passengers} passengers</span>
                                                        <span className="shrink-0">{trip.reference} · {trip.fare}</span>
                                                    </div>
                                                </Link>
                                            </li>
                                        );
                                    })}
                                </ul>
                            ) : (
                                <div className="mt-5 rounded-xl border border-dashed border-navy/15 p-6 text-center dark:border-white/20">
                                    <p className="font-medium">{tripView === 'upcoming' ? 'No upcoming trips' : tripView === 'past' ? 'No completed trips yet' : 'No trips yet'}</p>
                                    <p className="mt-1 text-sm text-navy/60 dark:text-white/60">Your bookings and trip history will appear here.</p>
                                    <Link href={`${home.url()}#book`} className="mt-4 inline-flex items-center gap-2 text-sm font-semibold text-gold-dark hover:underline dark:text-gold">
                                        Plan a trip<ArrowRight className="size-4" />
                                    </Link>
                                </div>
                            )}
                        </section>
                    </div>

                    <section className={`${cardClass} mt-6`}>
                        <h2 className="flex items-center gap-2 text-lg font-semibold">
                            <Settings className="size-5" />
                            Account
                        </h2>
                        <div className="mt-5 grid gap-3 sm:grid-cols-3">
                            <Link
                                href={editSettings()}
                                className="rounded-xl bg-mist px-4 py-3 text-sm font-medium transition-colors hover:bg-gold/15 dark:bg-ink dark:hover:bg-white/10"
                            >
                                Name, email &amp; photo
                            </Link>
                            <Link
                                href={editSecurity()}
                                className="rounded-xl bg-mist px-4 py-3 text-sm font-medium transition-colors hover:bg-gold/15 dark:bg-ink dark:hover:bg-white/10"
                            >
                                Password &amp; two-factor
                            </Link>
                            <Link
                                href={editAppearance()}
                                className="rounded-xl bg-mist px-4 py-3 text-sm font-medium transition-colors hover:bg-gold/15 dark:bg-ink dark:hover:bg-white/10"
                            >
                                Light / dark mode
                            </Link>
                        </div>
                    </section>
                </main>

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