import { Head, useForm } from '@inertiajs/react';
import type { FormEvent } from 'react';
import Heading from '@/components/heading';
import InputError from '@/components/input-error';
import { Button } from '@/components/ui/button';
import { Card, CardContent } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Spinner } from '@/components/ui/spinner';
import { dashboard } from '@/routes/admin';
import { index, update } from '@/routes/admin/stats';

type Stat = { id: number; label: string; value: string };

export default function Stats({ stats }: { stats: Stat[] }) {
    const { data, setData, put, processing, errors } = useForm({ stats });

    const change = (index: number, field: 'label' | 'value', value: string) =>
        setData(
            'stats',
            data.stats.map((stat, i) =>
                i === index ? { ...stat, [field]: value } : stat,
            ),
        );

    const submit = (event: FormEvent<HTMLFormElement>) => {
        event.preventDefault();
        put(update.url(), { preserveScroll: true });
    };

    const errorFor = (index: number, field: string) =>
        (errors as Record<string, string | undefined>)[
            `stats.${index}.${field}`
        ];

    return (
        <>
            <Head title="Statistics" />
            <div className="max-w-3xl space-y-6 p-4 sm:p-6">
                <Heading
                    title="Home page statistics"
                    description="The numbers shown under “Our Premium Statistics”. Increase them as your business grows."
                />

                <form onSubmit={submit} className="space-y-4">
                    {data.stats.map((stat, i) => (
                        <Card key={stat.id}>
                            <CardContent className="grid gap-4 pt-6 sm:grid-cols-[1fr_2fr]">
                                <div className="grid gap-2">
                                    <Label htmlFor={`value-${stat.id}`}>
                                        Number
                                    </Label>
                                    <Input
                                        id={`value-${stat.id}`}
                                        value={stat.value}
                                        onChange={(event) =>
                                            change(
                                                i,
                                                'value',
                                                event.target.value,
                                            )
                                        }
                                        className="text-lg font-semibold"
                                        required
                                    />
                                    <InputError
                                        message={errorFor(i, 'value')}
                                    />
                                </div>
                                <div className="grid gap-2">
                                    <Label htmlFor={`label-${stat.id}`}>
                                        Label
                                    </Label>
                                    <Input
                                        id={`label-${stat.id}`}
                                        value={stat.label}
                                        onChange={(event) =>
                                            change(
                                                i,
                                                'label',
                                                event.target.value,
                                            )
                                        }
                                        required
                                    />
                                    <InputError
                                        message={errorFor(i, 'label')}
                                    />
                                </div>
                            </CardContent>
                        </Card>
                    ))}

                    <Button disabled={processing}>
                        {processing && <Spinner />}
                        Save statistics
                    </Button>
                </form>
            </div>
        </>
    );
}

Stats.layout = {
    breadcrumbs: [
        { title: 'Admin', href: dashboard() },
        { title: 'Statistics', href: index() },
    ],
};
