import { Form, Head } from '@inertiajs/react';
import { Plus, Sparkles } from 'lucide-react';
import { useState } from 'react';
import { PromoCodeField } from '@/components/booking/promo-code-field';
import { Button } from '@/components/ui/button';
import { useBookingLive } from '@/contexts/booking-live';
import { cn } from '@/lib/utils';

type AddonOption = {
    id: number;
    name: string;
    description: string | null;
    duration_minutes: number;
    price_sedan: number;
    price_suv: number;
    price_truck: number;
    price_van: number;
    price_oversized: number;
};

type Props = {
    addons: AddonOption[];
    vehicleSize: 'sedan' | 'suv' | 'truck' | 'van' | 'oversized' | null;
    selectedAddonIds?: number[];
};

const priceByVehicleSize = (addon: AddonOption, vehicleSize: Props['vehicleSize']): number => {
    if (vehicleSize === 'suv') return addon.price_suv;
    if (vehicleSize === 'truck') return addon.price_truck;
    if (vehicleSize === 'van') return addon.price_van;
    if (vehicleSize === 'oversized') return addon.price_oversized;
    return addon.price_sedan;
};

export default function Step4Addons({ addons, vehicleSize, selectedAddonIds }: Props) {
    const { setPatch } = useBookingLive();
    const [selected, setSelected] = useState<Set<number>>(
        new Set((selectedAddonIds ?? []).map(Number)),
    );

    const toggle = (id: number) => {
        const next = new Set(selected);
        if (next.has(id)) next.delete(id);
        else next.add(id);
        setSelected(next);

        const selectedAddons = addons.filter((a) => next.has(a.id));
        const addonsTotal = selectedAddons.reduce((sum, a) => sum + priceByVehicleSize(a, vehicleSize), 0);
        setPatch({ addonNames: selectedAddons.map((a) => a.name), addonsTotal });
    };

    const selectedAddons = addons.filter((a) => selected.has(a.id));
    const addonsTotal = selectedAddons.reduce(
        (sum, a) => sum + priceByVehicleSize(a, vehicleSize),
        0,
    );

    return (
        <>
            <Head title="Book: add-ons" />

            <Form action="/book/addons" method="post">
                {({ processing }) => (
                    <div className="flex flex-col gap-6">
                        <div>
                            <h2 className="text-xl font-semibold tracking-tight">
                                Enhance your wash
                            </h2>
                            <p className="mt-1 text-sm text-muted-foreground">
                                Optional add-ons to make your car shine even more.
                            </p>
                        </div>

                        {addons.length === 0 ? (
                            <div className="flex flex-col items-center gap-2 rounded-2xl border border-dashed p-8 text-center">
                                <Sparkles className="size-8 text-muted-foreground/50" />
                                <p className="text-sm text-muted-foreground">
                                    No add-ons are currently available.
                                </p>
                            </div>
                        ) : (
                            <div className="flex flex-col gap-3">
                                {addons.map((addon) => {
                                    const price = priceByVehicleSize(addon, vehicleSize);
                                    const isSelected = selected.has(addon.id);

                                    return (
                                        <div
                                            key={addon.id}
                                            className={cn(
                                                'flex cursor-pointer items-center gap-4 rounded-2xl border-2 p-4 transition-all',
                                                isSelected
                                                    ? 'border-primary bg-primary/5 shadow-sm'
                                                    : 'border-border hover:border-primary/40 hover:bg-accent/40',
                                            )}
                                            onClick={() => toggle(addon.id)}
                                        >
                                            {/* Hidden checkboxes for form submission */}
                                            <input
                                                type="checkbox"
                                                name="addon_ids[]"
                                                value={addon.id}
                                                checked={isSelected}
                                                onChange={() => toggle(addon.id)}
                                                className="sr-only"
                                            />

                                            <div
                                                className={cn(
                                                    'flex size-10 shrink-0 items-center justify-center rounded-xl transition-colors',
                                                    isSelected
                                                        ? 'bg-primary text-primary-foreground'
                                                        : 'bg-muted text-muted-foreground',
                                                )}
                                            >
                                                <Plus
                                                    className={cn(
                                                        'size-5 transition-transform',
                                                        isSelected && 'rotate-45',
                                                    )}
                                                />
                                            </div>

                                            <div className="min-w-0 flex-1">
                                                <p className="font-semibold">{addon.name}</p>
                                                {addon.description && (
                                                    <p className="mt-0.5 text-sm text-muted-foreground">
                                                        {addon.description}
                                                    </p>
                                                )}
                                                <p className="mt-0.5 text-xs text-muted-foreground">
                                                    +{addon.duration_minutes} min
                                                </p>
                                            </div>

                                            <div className="flex shrink-0 flex-col items-end gap-1">
                                                <span
                                                    className={cn(
                                                        'font-bold',
                                                        isSelected
                                                            ? 'text-primary'
                                                            : 'text-foreground',
                                                    )}
                                                >
                                                    +${(price / 100).toFixed(2)}
                                                </span>
                                            </div>
                                        </div>
                                    );
                                })}
                            </div>
                        )}

                        {/* <PromoCodeField /> */}

                        {/* Selection summary */}
                        {selected.size > 0 && (
                            <div className="rounded-2xl border bg-muted/30 p-4 text-sm">
                                <div className="flex items-center justify-between">
                                    <span className="text-muted-foreground">
                                        {selected.size} add-on{selected.size !== 1 ? 's' : ''} selected
                                    </span>
                                    <span className="font-semibold">
                                        +${(addonsTotal / 100).toFixed(2)}
                                    </span>
                                </div>
                            </div>
                        )}

                        <div className="flex flex-col gap-2">
                            <Button type="submit" disabled={processing} size="lg" className="w-full">
                                Continue to date & time
                            </Button>
                            {selected.size === 0 && (
                                <p className="text-center text-xs text-muted-foreground">
                                    No add-ons selected — you can skip this step
                                </p>
                            )}
                        </div>
                    </div>
                )}
            </Form>
        </>
    );
}
