import { Form, Head } from '@inertiajs/react';
import { Car, Plus, Star } from 'lucide-react';
import { useState } from 'react';
import { FormField } from '@/components/form-field';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { VehicleSizeCategoryIcon } from '@/components/vehicle-size-category-icon';
import { cn } from '@/lib/utils';
import type { VehicleSizeCategoryOption } from '@/lib/vehicle-sizes';

type SavedVehicle = {
    id: number;
    make: string;
    model: string;
    year: number;
    color: string | null;
    size: string;
    is_default: boolean;
};

type Props = {
    vehicleSizeCategories: VehicleSizeCategoryOption[];
    draft?: {
        size?: string;
        make?: string;
        model?: string;
        year?: string | number;
        color?: string;
        license_plate?: string;
    };
    savedVehicles?: SavedVehicle[] | null;
    defaultVehicle?: { id: number; make: string; model: string; year: number; color: string | null; size: string } | null;
};

export default function Step2Vehicle({
    vehicleSizeCategories,
    draft,
    savedVehicles,
    defaultVehicle,
}: Props) {
    const hasSaved = savedVehicles && savedVehicles.length > 0;

    // Which saved vehicle is selected (null = "use a different vehicle")
    const [selectedSavedId, setSelectedSavedId] = useState<number | null>(() => {
        if (!hasSaved) {
            return null;
        }

        // If there's a draft already (e.g. back-navigated), don't auto-select
        if (draft && Object.keys(draft).some((k) => draft[k as keyof typeof draft])) {
            return null;
        }

        return defaultVehicle?.id ?? savedVehicles![0].id;
    });

    const selectedSaved =
        hasSaved && selectedSavedId !== null
            ? (savedVehicles!.find((v) => v.id === selectedSavedId) ?? null)
            : null;

    // Vehicle size for the size picker (synced with saved selection or manual)
    const [vehicleSize, setVehicleSize] = useState<string>(() => {
        if (selectedSaved) {
            return selectedSaved.size;
        }

        return draft?.size ?? vehicleSizeCategories[0]?.slug ?? 'sedan';
    });

    const handleSelectSaved = (v: SavedVehicle) => {
        setSelectedSavedId(v.id);
        setVehicleSize(v.size);
    };

    const handleUseNew = () => {
        setSelectedSavedId(null);
        setVehicleSize(draft?.size ?? vehicleSizeCategories[0]?.slug ?? 'sedan');
    };

    const selectedCategory = vehicleSizeCategories.find((c) => c.slug === vehicleSize);

    return (
        <>
            <Head title="Book: vehicle" />

            <Form action="/book/vehicle" method="post">
                {({ processing }) => (
                    <div className="flex flex-col gap-8">
                        <div>
                            <h2 className="text-xl font-semibold tracking-tight">
                                Tell us about your vehicle
                            </h2>
                            <p className="mt-1 text-sm text-muted-foreground">
                                We use this to price your service and assign the right technician.
                            </p>
                        </div>

                        {/* ── Saved vehicles selector (authenticated users only) ── */}
                        {hasSaved && (
                            <div>
                                <p className="mb-3 text-sm font-medium">Your saved vehicles</p>
                                <div className="flex flex-col gap-2">
                                    {savedVehicles!.map((v) => {
                                        const active = selectedSavedId === v.id;

                                        return (
                                            <button
                                                key={v.id}
                                                type="button"
                                                onClick={() => handleSelectSaved(v)}
                                                className={cn(
                                                    'flex w-full items-center gap-4 rounded-xl border-2 px-4 py-3 text-left transition-all',
                                                    active
                                                        ? 'border-primary bg-primary/5 shadow-sm'
                                                        : 'border-border hover:border-primary/40 hover:bg-accent/30',
                                                )}
                                            >
                                                {/* Radio dot */}
                                                <span className={cn(
                                                    'flex size-4 shrink-0 items-center justify-center rounded-full border-2 transition-colors',
                                                    active ? 'border-primary' : 'border-muted-foreground/40',
                                                )}>
                                                    {active && (
                                                        <span className="size-2 rounded-full bg-primary" />
                                                    )}
                                                </span>

                                                {/* Icon */}
                                                <div className={cn(
                                                    'flex size-9 shrink-0 items-center justify-center rounded-lg',
                                                    active ? 'bg-primary/10' : 'bg-muted',
                                                )}>
                                                    <Car className={cn('size-4', active ? 'text-primary' : 'text-muted-foreground')} />
                                                </div>

                                                {/* Details */}
                                                <div className="min-w-0 flex-1">
                                                    <p className={cn('truncate text-sm font-semibold', active && 'text-primary')}>
                                                        {v.year} {v.make} {v.model}
                                                    </p>
                                                    <p className="truncate text-xs capitalize text-muted-foreground">
                                                        {v.size}{v.color ? ` · ${v.color}` : ''}
                                                    </p>
                                                </div>

                                                {/* Default badge */}
                                                {v.is_default && (
                                                    <span className="flex shrink-0 items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-primary">
                                                        <Star className="size-2.5 fill-primary" />
                                                        Default
                                                    </span>
                                                )}
                                            </button>
                                        );
                                    })}

                                    {/* Use different vehicle option */}
                                    <button
                                        type="button"
                                        onClick={handleUseNew}
                                        className={cn(
                                            'flex w-full items-center gap-4 rounded-xl border-2 px-4 py-3 text-left transition-all',
                                            selectedSavedId === null
                                                ? 'border-primary bg-primary/5 shadow-sm'
                                                : 'border-dashed border-border hover:border-primary/40 hover:bg-accent/30',
                                        )}
                                    >
                                        <span className={cn(
                                            'flex size-4 shrink-0 items-center justify-center rounded-full border-2 transition-colors',
                                            selectedSavedId === null ? 'border-primary' : 'border-muted-foreground/40',
                                        )}>
                                            {selectedSavedId === null && (
                                                <span className="size-2 rounded-full bg-primary" />
                                            )}
                                        </span>
                                        <div className={cn(
                                            'flex size-9 shrink-0 items-center justify-center rounded-lg',
                                            selectedSavedId === null ? 'bg-primary/10' : 'bg-muted',
                                        )}>
                                            <Plus className={cn('size-4', selectedSavedId === null ? 'text-primary' : 'text-muted-foreground')} />
                                        </div>
                                        <p className={cn('text-sm font-semibold', selectedSavedId === null ? 'text-primary' : 'text-muted-foreground')}>
                                            Use a different vehicle
                                        </p>
                                    </button>
                                </div>
                            </div>
                        )}

                        {/* ── Hidden fields when using a saved vehicle ── */}
                        {selectedSaved && (
                            <>
                                <input type="hidden" name="size"  value={selectedSaved.size} />
                                <input type="hidden" name="make"  value={selectedSaved.make} />
                                <input type="hidden" name="model" value={selectedSaved.model} />
                                <input type="hidden" name="year"  value={selectedSaved.year} />
                                <input type="hidden" name="color" value={selectedSaved.color ?? ''} />
                                <input type="hidden" name="saved_vehicle_id" value={selectedSaved.id} />
                            </>
                        )}

                        {/* ── Manual entry form (guests or "use different vehicle") ── */}
                        {!selectedSaved && (
                            <>
                                {/* Vehicle size picker */}
                                <div>
                                    <p className="mb-3 text-sm font-medium">Vehicle size</p>
                                    <div className="grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5">
                                        {vehicleSizeCategories.map((category) => (
                                            <label
                                                key={category.slug}
                                                className={cn(
                                                    'flex cursor-pointer flex-col items-center gap-2 rounded-xl border-2 px-2 py-3 text-center transition-all',
                                                    vehicleSize === category.slug
                                                        ? 'border-primary bg-primary/5 shadow-sm'
                                                        : 'border-border hover:border-primary/40 hover:bg-accent/40',
                                                )}
                                            >
                                                <input
                                                    type="radio"
                                                    name="size"
                                                    value={category.slug}
                                                    checked={vehicleSize === category.slug}
                                                    onChange={() => setVehicleSize(category.slug)}
                                                    className="sr-only"
                                                />
                                                <VehicleSizeCategoryIcon
                                                    imageUrl={category.image_url}
                                                    name={category.name}
                                                    emojiFallback={category.emoji_fallback}
                                                    className="size-16"
                                                    colorClassName={
                                                        vehicleSize === category.slug
                                                            ? 'text-primary'
                                                            : 'text-muted-foreground'
                                                    }
                                                />
                                                <span className={cn(
                                                    'text-xs font-semibold',
                                                    vehicleSize === category.slug ? 'text-primary' : 'text-foreground',
                                                )}>
                                                    {category.name}
                                                </span>
                                            </label>
                                        ))}
                                    </div>
                                    {selectedCategory?.description && (
                                        <p className="mt-2 text-center text-xs text-muted-foreground">
                                            {selectedCategory.description}
                                        </p>
                                    )}
                                </div>

                                {/* Make / model / year / color */}
                                <div className="grid gap-4 sm:grid-cols-2">
                                    <FormField label="Make" htmlFor="make">
                                        <Input
                                            id="make"
                                            name="make"
                                            defaultValue={draft?.make ?? ''}
                                            placeholder="Toyota"
                                        />
                                    </FormField>
                                    <FormField label="Model" htmlFor="model">
                                        <Input
                                            id="model"
                                            name="model"
                                            defaultValue={draft?.model ?? ''}
                                            placeholder="Camry"
                                        />
                                    </FormField>
                                    <FormField label="Year" htmlFor="year">
                                        <Input
                                            id="year"
                                            name="year"
                                            type="number"
                                            min={1980}
                                            max={2100}
                                            defaultValue={draft?.year ?? ''}
                                            placeholder="2024"
                                        />
                                    </FormField>
                                    <FormField label="Color" htmlFor="color">
                                        <Input
                                            id="color"
                                            name="color"
                                            defaultValue={draft?.color ?? ''}
                                            placeholder="Silver"
                                        />
                                    </FormField>
                                </div>
                            </>
                        )}

                        {/* ── Selected vehicle summary (when saved vehicle chosen) ── */}
                        {selectedSaved && (
                            <div className="rounded-xl border bg-muted/30 px-4 py-3">
                                <p className="mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground">
                                    Selected vehicle
                                </p>
                                <div className="flex items-center gap-3">
                                    <div className="flex size-8 items-center justify-center rounded-lg bg-primary/10">
                                        <Car className="size-4 text-primary" />
                                    </div>
                                    <div>
                                        <p className="font-semibold">
                                            {selectedSaved.year} {selectedSaved.make} {selectedSaved.model}
                                        </p>
                                        <p className="text-sm capitalize text-muted-foreground">
                                            {selectedSaved.size}{selectedSaved.color ? ` · ${selectedSaved.color}` : ''}
                                        </p>
                                    </div>
                                </div>
                            </div>
                        )}

                        <Button
                            type="submit"
                            disabled={processing}
                            size="lg"
                            className="w-full"
                        >
                            Continue to packages
                        </Button>
                    </div>
                )}
            </Form>
        </>
    );
}
