import { Head, Link, useForm } from '@inertiajs/react';

import { Switch } from '@/components/ui/switch';
import { AdminLayout } from '@/layouts/admin-layout';

type BlogCategoryForm = {
    name: string;
    slug: string;
    description: string;
    is_active: boolean;
    sort_order: number;
};

export default function BlogCategoryCreate() {
    const form = useForm<BlogCategoryForm>({
        name: '',
        slug: '',
        description: '',
        is_active: true,
        sort_order: 0,
    });

    const submit = (event: React.FormEvent<HTMLFormElement>) => {
        event.preventDefault();

        form.transform((data) => ({
            ...data,
            slug: data.slug === '' ? null : data.slug,
        }));

        form.post('/admin/blog-categories');
    };

    return (
        <AdminLayout>
            <Head title="Create Blog Category" />

            <BlogCategoryFormView
                title="Create Blog Category"
                form={form}
                onSubmit={submit}
            />
        </AdminLayout>
    );
}

type FormViewProps = {
    title: string;
    form: ReturnType<typeof useForm<BlogCategoryForm>>;
    onSubmit: (event: React.FormEvent<HTMLFormElement>) => void;
};

export function BlogCategoryFormView({ title, form, onSubmit }: FormViewProps) {
    return (
        <div className="space-y-5">
            <div className="flex flex-wrap items-center justify-between gap-3">
                <h1 className="text-2xl font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                    {title}
                </h1>
                <Link
                    href="/admin/blog-categories"
                    className="text-sm font-medium text-slate-600 hover:text-[#0a1530] dark:text-[#d7c7ff] dark:hover:text-[#efe8ff]"
                >
                    Back to list
                </Link>
            </div>

            <form onSubmit={onSubmit} className="space-y-4">
                <div className="grid gap-4 md:grid-cols-2">
                    <Field label="Name" error={form.errors.name}>
                        <input
                            value={form.data.name}
                            onChange={(event) =>
                                form.setData('name', event.target.value)
                            }
                            required
                            className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                        />
                    </Field>
                    <Field label="Slug" error={form.errors.slug}>
                        <input
                            value={form.data.slug}
                            onChange={(event) =>
                                form.setData('slug', event.target.value)
                            }
                            placeholder="Optional"
                            className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                        />
                    </Field>
                </div>

                <Field label="Description" error={form.errors.description}>
                    <textarea
                        value={form.data.description}
                        onChange={(event) =>
                            form.setData('description', event.target.value)
                        }
                        className="h-28 w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                    />
                </Field>

                <div className="grid gap-4 md:grid-cols-2">
                    <Field label="Sort Order" error={form.errors.sort_order}>
                        <input
                            type="number"
                            min={0}
                            value={form.data.sort_order}
                            onChange={(event) =>
                                form.setData(
                                    'sort_order',
                                    Number(event.target.value) || 0,
                                )
                            }
                            className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                        />
                    </Field>
                    <div className="flex items-center gap-3 rounded-xl border border-slate-200 p-3 dark:border-[#3c2b68]">
                        <Switch
                            checked={form.data.is_active}
                            onChange={(checked) =>
                                form.setData('is_active', checked)
                            }
                            ariaLabel="Toggle blog category active state"
                        />
                        <span className="text-sm font-medium text-[#0a1530] dark:text-[#e5dcff]">
                            Active
                        </span>
                    </div>
                </div>

                <button
                    type="submit"
                    disabled={form.processing}
                    className="rounded-lg bg-[#0b7285] px-4 py-2 text-sm font-semibold text-white hover:bg-[#095f6f] disabled:opacity-50 dark:bg-[#7c3aed] dark:hover:bg-[#8b5cf6]"
                >
                    Save Category
                </button>
            </form>
        </div>
    );
}

function Field({
    label,
    error,
    children,
}: {
    label: string;
    error?: string;
    children: React.ReactNode;
}) {
    return (
        <div>
            <label className="block text-sm font-medium text-[#0a1530] dark:text-[#e5dcff]">
                {label}
            </label>
            <div className="mt-1">{children}</div>
            {error ? (
                <p className="mt-1 text-xs text-rose-600">{error}</p>
            ) : null}
        </div>
    );
}
