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

import { AdminLayout } from '@/layouts/admin-layout';

type Customer = {
    id: number;
    name: string;
    email: string;
    phone: string | null;
    address_line1: string | null;
    address_line2: string | null;
    city: string | null;
    postal_code: string | null;
    country: string | null;
};

type CustomerEditProps = {
    customer: Customer;
};

type CustomerForm = {
    name: string;
    email: string;
    phone: string;
    address_line1: string;
    address_line2: string;
    city: string;
    postal_code: string;
    country: string;
    password: string;
};

export default function AdminCustomerEdit({ customer }: CustomerEditProps) {
    const form = useForm<CustomerForm>({
        name: customer.name,
        email: customer.email,
        phone: customer.phone || '',
        address_line1: customer.address_line1 || '',
        address_line2: customer.address_line2 || '',
        city: customer.city || '',
        postal_code: customer.postal_code || '',
        country: customer.country || '',
        password: '',
    });

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

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

        form.put(`/admin/customers/${customer.id}`);
    };

    return (
        <AdminLayout>
            <Head title={`Edit ${customer.name}`} />

            <div className="space-y-5">
                <div className="flex flex-wrap items-center justify-between gap-3">
                    <div>
                        <Link
                            href={`/admin/customers/${customer.id}`}
                            className="text-sm font-medium text-slate-600 hover:text-[#0a1530] dark:text-[#d7c7ff] dark:hover:text-[#efe8ff]"
                        >
                            Back to customer
                        </Link>
                        <h1 className="mt-2 text-2xl font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                            Edit Customer
                        </h1>
                    </div>
                </div>

                <form onSubmit={submit} 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)
                                }
                                className={inputClassName}
                                required
                            />
                        </Field>
                        <Field label="Email" error={form.errors.email}>
                            <input
                                type="email"
                                value={form.data.email}
                                onChange={(event) =>
                                    form.setData('email', event.target.value)
                                }
                                className={inputClassName}
                                required
                            />
                        </Field>
                    </div>

                    <div className="grid gap-4 md:grid-cols-2">
                        <Field label="Phone" error={form.errors.phone}>
                            <input
                                value={form.data.phone}
                                onChange={(event) =>
                                    form.setData('phone', event.target.value)
                                }
                                className={inputClassName}
                            />
                        </Field>
                        <Field
                            label="New Password"
                            error={form.errors.password}
                        >
                            <input
                                type="password"
                                value={form.data.password}
                                onChange={(event) =>
                                    form.setData('password', event.target.value)
                                }
                                className={inputClassName}
                                placeholder="Leave blank to keep current password"
                            />
                        </Field>
                    </div>

                    <div className="grid gap-4 md:grid-cols-2">
                        <Field
                            label="Address Line 1"
                            error={form.errors.address_line1}
                        >
                            <input
                                value={form.data.address_line1}
                                onChange={(event) =>
                                    form.setData(
                                        'address_line1',
                                        event.target.value,
                                    )
                                }
                                className={inputClassName}
                            />
                        </Field>
                        <Field
                            label="Address Line 2"
                            error={form.errors.address_line2}
                        >
                            <input
                                value={form.data.address_line2}
                                onChange={(event) =>
                                    form.setData(
                                        'address_line2',
                                        event.target.value,
                                    )
                                }
                                className={inputClassName}
                            />
                        </Field>
                    </div>

                    <div className="grid gap-4 md:grid-cols-3">
                        <Field label="City" error={form.errors.city}>
                            <input
                                value={form.data.city}
                                onChange={(event) =>
                                    form.setData('city', event.target.value)
                                }
                                className={inputClassName}
                            />
                        </Field>
                        <Field
                            label="Postal Code"
                            error={form.errors.postal_code}
                        >
                            <input
                                value={form.data.postal_code}
                                onChange={(event) =>
                                    form.setData(
                                        'postal_code',
                                        event.target.value,
                                    )
                                }
                                className={inputClassName}
                            />
                        </Field>
                        <Field label="Country" error={form.errors.country}>
                            <input
                                value={form.data.country}
                                onChange={(event) =>
                                    form.setData('country', event.target.value)
                                }
                                className={inputClassName}
                            />
                        </Field>
                    </div>

                    <div className="rounded-xl border border-slate-200 bg-slate-50/80 p-4 dark:border-[#3c2b68] dark:bg-[#2a1d50]/40">
                        <div className="flex justify-end">
                            <button
                                type="submit"
                                disabled={form.processing}
                                className="w-full rounded-lg bg-[#0b7285] px-4 py-2 text-sm font-semibold text-white hover:bg-[#095f6f] disabled:opacity-50 md:w-auto dark:bg-[#7c3aed] dark:hover:bg-[#8b5cf6]"
                            >
                                {form.processing
                                    ? 'Saving...'
                                    : 'Update Customer'}
                            </button>
                        </div>
                    </div>
                </form>
            </div>
        </AdminLayout>
    );
}

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>
    );
}

const inputClassName =
    '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]';
