import { Form, Head } from '@inertiajs/react';
import { Clock, Sparkles } from 'lucide-react';
import { useState } from 'react';
import InputError from '@/components/input-error';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { useBookingLive } from '@/contexts/booking-live';
import { cn } from '@/lib/utils';

type PackageOption = {
    id: number;
    name: string;
    description: string | null;
    duration_minutes: number;
    is_featured: boolean;
    prices_by_slug: Record<string, number>;
    icon_svg: string | null;
};

type Props = {
    packages: PackageOption[];
    vehicleSize: string | null;
    selectedPackageId?: number | null;
};

const priceByVehicleSize = (
    pkg: PackageOption,
    vehicleSize: Props['vehicleSize'],
): number => {
    if (!vehicleSize) {
        return Object.values(pkg.prices_by_slug)[0] ?? 0;
    }

    return pkg.prices_by_slug[vehicleSize] ?? 0;
};

export default function Step3Package({
    packages,
    vehicleSize,
    selectedPackageId,
}: Props) {
    const { setPatch } = useBookingLive();
    const [selectedId, setSelectedId] = useState<number | null>(
        selectedPackageId ?? (packages.length === 1 ? packages[0].id : null),
    );

    const sortedPackages = packages;

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

            <Form action="/book/package" method="post">
                {({ processing, errors }) => (
                    <div className="flex flex-col gap-6">
                        <div>
                            <h2 className="text-xl font-semibold tracking-tight">
                                Choose your wash package
                            </h2>
                            <p className="mt-1 text-sm text-muted-foreground">
                                All packages include our quality guarantee.
                            </p>
                        </div>

                        <div className="flex flex-col gap-3">
                            {sortedPackages.map((pkg) => {
                                const price = priceByVehicleSize(
                                    pkg,
                                    vehicleSize,
                                );
                                const isSelected = selectedId === pkg.id;
                                const isPopular = pkg.is_featured;

                                return (
                                    <label
                                        key={pkg.id}
                                        className={cn(
                                            'relative flex cursor-pointer items-start gap-4 rounded-2xl border-2 p-4 transition-all',
                                            isSelected
                                                ? 'border-primary bg-primary/5 shadow-sm ring-2 ring-primary/10'
                                                : 'border-border hover:border-primary/40 hover:bg-accent/40',
                                        )}
                                    >
                                        <input
                                            type="radio"
                                            name="package_id"
                                            value={pkg.id}
                                            checked={isSelected}
                                            onChange={() => {
                                                setSelectedId(pkg.id);
                                                setPatch({
                                                    packageName: pkg.name,
                                                    packagePrice: price,
                                                });
                                            }}
                                            className="sr-only"
                                        />

                                        <div className="pkg-icon flex size-10 shrink-0 items-center justify-center rounded-xl bg-blue-50 dark:bg-slate-900">
                                            {pkg.icon_svg ? (
                                                <div
                                                    className="size-6 [&_svg]:size-full"
                                                    dangerouslySetInnerHTML={{ __html: pkg.icon_svg }}
                                                />
                                            ) : (
                                                <Sparkles className="size-5 text-primary" />
                                            )}
                                        </div>

                                        <div className="min-w-0 flex-1">
                                            <div className="flex flex-wrap items-center gap-2">
                                                <span className="font-semibold">
                                                    {pkg.name}
                                                </span>
                                                {isPopular && (
                                                    <Badge
                                                        variant="default"
                                                        className="px-1.5 py-0 text-[10px]"
                                                    >
                                                        Most popular
                                                    </Badge>
                                                )}
                                            </div>
                                            {pkg.description && (
                                                <p className="mt-0.5 text-sm text-muted-foreground">
                                                    {pkg.description}
                                                </p>
                                            )}
                                            <div className="mt-1 flex items-center gap-1 text-xs text-muted-foreground">
                                                <Clock className="size-3" />
                                                <span>
                                                    {pkg.duration_minutes} min
                                                </span>
                                            </div>
                                        </div>

                                        <div className="flex shrink-0 flex-col items-end gap-2">
                                            <span
                                                className={cn(
                                                    'text-lg font-bold',
                                                    isSelected
                                                        ? 'text-primary'
                                                        : 'text-foreground',
                                                )}
                                            >
                                                ${(price / 100).toFixed(2)}
                                            </span>
                                            <div
                                                className={cn(
                                                    'size-5 rounded-full border-2 transition-all',
                                                    isSelected
                                                        ? 'border-primary bg-primary'
                                                        : 'border-muted-foreground/30',
                                                )}
                                            />
                                        </div>
                                    </label>
                                );
                            })}
                        </div>

                        <InputError message={errors.package_id} />

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