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

type DiscountCode = { id: number; code: string; type: string; value: string; minimum_order_total: string | null; usage_limit: number | null; starts_at: string | null; expires_at: string | null; is_active: boolean };

export default function DiscountCodeForm({ discountCode }: { discountCode: DiscountCode | null }) {
    const { data, setData, transform, post, put, processing, errors } = useForm({
        code: discountCode?.code ?? '',
        type: discountCode?.type ?? 'fixed',
        value: discountCode?.value ?? '0.00',
        minimum_order_total: discountCode?.minimum_order_total ?? '',
        usage_limit: discountCode?.usage_limit ?? '',
        starts_at: discountCode?.starts_at ?? '',
        expires_at: discountCode?.expires_at ?? '',
        is_active: discountCode?.is_active ?? true,
    });
    function submit(event: FormEvent) {
        event.preventDefault();
        transform((values) => ({ ...values, minimum_order_total: values.minimum_order_total || null, usage_limit: values.usage_limit || null, starts_at: values.starts_at || null, expires_at: values.expires_at || null }));
        discountCode ? put(`/admin/discount-codes/${discountCode.id}`) : post('/admin/discount-codes');
    }
    return (
        <>
            <Head title={discountCode ? 'Edit Discount Code' : 'Create Discount Code'} />
            <main className="min-h-screen bg-slate-50 px-4 py-6 text-slate-900 sm:px-6 lg:px-8">
                <form onSubmit={submit} className="mx-auto max-w-4xl rounded-lg border border-slate-200 bg-white p-5">
                    <h1 className="text-2xl font-semibold">{discountCode ? 'Edit discount code' : 'Create discount code'}</h1>
                    <div className="mt-5 grid gap-4 md:grid-cols-2">
                        <Field label="Code" error={errors.code}><input className="input" value={data.code} onChange={(event) => setData('code', event.target.value)} /></Field>
                        <Field label="Type" error={errors.type}><select className="input" value={data.type} onChange={(event) => setData('type', event.target.value)}><option value="fixed">Fixed</option><option value="percent">Percent</option></select></Field>
                        <Field label="Value" error={errors.value}><input className="input" type="number" min="0" step="0.01" value={data.value} onChange={(event) => setData('value', event.target.value)} /></Field>
                        <Field label="Minimum order" error={errors.minimum_order_total}><input className="input" type="number" min="0" step="0.01" value={data.minimum_order_total} onChange={(event) => setData('minimum_order_total', event.target.value)} /></Field>
                        <Field label="Usage limit" error={errors.usage_limit}><input className="input" type="number" min="1" value={data.usage_limit} onChange={(event) => setData('usage_limit', event.target.value)} /></Field>
                        <Field label="Starts at" error={errors.starts_at}><input className="input" type="datetime-local" value={data.starts_at ?? ''} onChange={(event) => setData('starts_at', event.target.value)} /></Field>
                        <Field label="Expires at" error={errors.expires_at}><input className="input" type="datetime-local" value={data.expires_at ?? ''} onChange={(event) => setData('expires_at', event.target.value)} /></Field>
                        <label className="flex items-center gap-2 text-sm font-medium"><input type="checkbox" checked={data.is_active} onChange={(event) => setData('is_active', event.target.checked)} /> Active</label>
                    </div>
                    <div className="mt-6 flex justify-end gap-2"><Link href="/admin/discount-codes" className="rounded-md border border-slate-300 px-4 py-2 text-sm font-semibold">Cancel</Link><button disabled={processing} className="rounded-md bg-cyan-700 px-4 py-2 text-sm font-semibold text-white disabled:opacity-60">Save</button></div>
                </form>
            </main>
        </>
    );
}

function Field({ label, error, children }: { label: string; error?: string; children: React.ReactNode }) {
    return <label className="grid gap-1 text-sm font-medium text-slate-700"><span>{label}</span>{children}{error ? <span className="text-xs text-red-600">{error}</span> : null}</label>;
}
