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

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

type EventOption = {
    value: string;
    label: string;
};

type WebhookEndpointForm = {
    name: string;
    url: string;
    secret: string;
    subscribed_events: string[];
    headers_json: string;
    is_active: boolean;
    max_attempts: number;
    timeout_seconds: number;
};

type WebhookEndpointCreateProps = {
    eventOptions: EventOption[];
};

export default function WebhookEndpointCreate({
    eventOptions,
}: WebhookEndpointCreateProps) {
    const form = useForm<WebhookEndpointForm>({
        name: '',
        url: '',
        secret: '',
        subscribed_events: [],
        headers_json: '',
        is_active: true,
        max_attempts: 3,
        timeout_seconds: 10,
    });

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

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

        form.post('/admin/webhook-endpoints');
    };

    return (
        <AdminLayout>
            <Head title="Create Webhook Endpoint" />
            <WebhookEndpointFormView
                title="Create Webhook Endpoint"
                form={form}
                eventOptions={eventOptions}
                onSubmit={submit}
                submitLabel="Save Endpoint"
                secretHelp="Leave blank to generate a signing secret automatically."
            />
        </AdminLayout>
    );
}

type FormViewProps = {
    title: string;
    form: ReturnType<typeof useForm<WebhookEndpointForm>>;
    eventOptions: EventOption[];
    onSubmit: (event: React.FormEvent<HTMLFormElement>) => void;
    submitLabel: string;
    secretHelp: string;
};

export function WebhookEndpointFormView({
    title,
    form,
    eventOptions,
    onSubmit,
    submitLabel,
    secretHelp,
}: FormViewProps) {
    const toggleEvent = (eventName: string) => {
        form.setData(
            'subscribed_events',
            form.data.subscribed_events.includes(eventName)
                ? form.data.subscribed_events.filter(
                      (item) => item !== eventName,
                  )
                : [...form.data.subscribed_events, eventName],
        );
    };

    return (
        <div className="space-y-5">
            <div className="flex flex-wrap items-center justify-between gap-3">
                <div>
                    <h1 className="text-2xl font-semibold text-main">
                        {title}
                    </h1>
                    <p className="mt-1 text-sm text-muted">
                        Configure signed delivery targets for external
                        integrations.
                    </p>
                </div>
                <Link
                    href="/admin/webhook-endpoints"
                    className="text-sm font-medium text-muted hover:text-main"
                >
                    Back to endpoints
                </Link>
            </div>

            <form onSubmit={onSubmit} className="space-y-5">
                <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-border bg-control px-3 py-2 text-sm text-main outline-none focus:border-primary"
                        />
                    </Field>
                    <Field label="Endpoint URL" error={form.errors.url}>
                        <input
                            type="url"
                            value={form.data.url}
                            onChange={(event) =>
                                form.setData('url', event.target.value)
                            }
                            required
                            placeholder="https://example.com/webhooks/parts"
                            className="w-full rounded-lg border border-border bg-control px-3 py-2 text-sm text-main outline-none focus:border-primary"
                        />
                    </Field>
                </div>

                <div className="grid gap-4 md:grid-cols-3">
                    <Field
                        label="Signing Secret"
                        error={form.errors.secret}
                        help={secretHelp}
                    >
                        <input
                            value={form.data.secret}
                            onChange={(event) =>
                                form.setData('secret', event.target.value)
                            }
                            placeholder="Optional"
                            className="w-full rounded-lg border border-border bg-control px-3 py-2 text-sm text-main outline-none focus:border-primary"
                        />
                    </Field>
                    <Field
                        label="Max Attempts"
                        error={form.errors.max_attempts}
                    >
                        <input
                            type="number"
                            min={1}
                            max={10}
                            value={form.data.max_attempts}
                            onChange={(event) =>
                                form.setData(
                                    'max_attempts',
                                    Number(event.target.value) || 1,
                                )
                            }
                            className="w-full rounded-lg border border-border bg-control px-3 py-2 text-sm text-main outline-none focus:border-primary"
                        />
                    </Field>
                    <Field
                        label="Timeout Seconds"
                        error={form.errors.timeout_seconds}
                    >
                        <input
                            type="number"
                            min={1}
                            max={30}
                            value={form.data.timeout_seconds}
                            onChange={(event) =>
                                form.setData(
                                    'timeout_seconds',
                                    Number(event.target.value) || 1,
                                )
                            }
                            className="w-full rounded-lg border border-border bg-control px-3 py-2 text-sm text-main outline-none focus:border-primary"
                        />
                    </Field>
                </div>

                <div className="rounded-xl border border-border bg-surface/50 p-4">
                    <div className="flex items-center gap-3">
                        <Switch
                            checked={form.data.is_active}
                            onChange={(checked) =>
                                form.setData('is_active', checked)
                            }
                            ariaLabel="Toggle webhook endpoint active state"
                        />
                        <span className="text-sm font-medium text-main">
                            Active endpoint
                        </span>
                    </div>
                </div>

                <Field
                    label="Subscribed Events"
                    error={form.errors.subscribed_events}
                >
                    <div className="grid gap-2 md:grid-cols-2 xl:grid-cols-3">
                        {eventOptions.map((option) => (
                            <label
                                key={option.value}
                                className="flex items-center gap-2 rounded-lg border border-border bg-surface px-3 py-2 text-sm text-main"
                            >
                                <input
                                    type="checkbox"
                                    checked={form.data.subscribed_events.includes(
                                        option.value,
                                    )}
                                    onChange={() => toggleEvent(option.value)}
                                    className="h-4 w-4 rounded border-border text-primary"
                                />
                                {option.label}
                            </label>
                        ))}
                    </div>
                </Field>

                <Field
                    label="Custom Headers JSON"
                    error={form.errors.headers_json}
                    help='Example: {"X-Integration": "ERP"}'
                >
                    <textarea
                        value={form.data.headers_json}
                        onChange={(event) =>
                            form.setData('headers_json', event.target.value)
                        }
                        rows={6}
                        placeholder='{"X-Integration": "ERP"}'
                        className="w-full rounded-lg border border-border bg-control px-3 py-2 font-mono text-sm text-main outline-none focus:border-primary"
                    />
                </Field>

                <button
                    type="submit"
                    disabled={form.processing}
                    className="rounded-lg bg-primary px-4 py-2 text-sm font-semibold text-white hover:bg-primary-hover disabled:opacity-50"
                >
                    {submitLabel}
                </button>
            </form>
        </div>
    );
}

function Field({
    label,
    error,
    help,
    children,
}: {
    label: string;
    error?: string;
    help?: string;
    children: React.ReactNode;
}) {
    return (
        <div>
            <label className="block text-sm font-medium text-main">
                {label}
            </label>
            <div className="mt-1">{children}</div>
            {help ? <p className="mt-1 text-xs text-muted">{help}</p> : null}
            {error ? <p className="mt-1 text-xs text-danger">{error}</p> : null}
        </div>
    );
}
