import { Form, Head } from '@inertiajs/react';
import { useState } from 'react';

import HeadingSmall from '@/components/heading-small';
import { SortableHeader, useSort } from '@/components/sortable-header';
import {
    Dialog,
    DialogContent,
    DialogDescription,
    DialogHeader,
    DialogTitle,
    DialogTrigger,
} from '@/components/ui/dialog';
import AppLayout from '@/layouts/app-layout';
import {
    destroy,
    index,
    upsert,
} from '@/routes/admin/supplier-enrollment-field-mappings';

type Supplier = {
    id: number;
    name: string;
    slug: string;
};

type FormFieldOption = {
    id: number;
    name: string;
    label: string;
};

type Mapping = {
    id: number;
    supplier_id: number;
    form_field_id: number | null;
    supplier_field_name: string;
    is_required: boolean;
    is_active: boolean;
    form_field: FormFieldOption | null;
};

type Props = {
    suppliers: Supplier[];
    formFields: FormFieldOption[];
    activeSupplierId: number | null;
    mappings: Mapping[];
};

export default function SupplierEnrollmentFieldMappings({
    suppliers,
    formFields,
    activeSupplierId,
    mappings,
}: Props) {
    const [createOpen, setCreateOpen] = useState(false);
    const [editingId, setEditingId] = useState<number | null>(null);
    const { sorted, sortColumn, sortDirection, toggleSort } = useSort<Mapping>(
        mappings,
        'supplier_field_name',
    );

    const breadcrumbs = [
        {
            title: 'Supplier Enrollment Field Mappings',
            href:
                activeSupplierId === null
                    ? index.url()
                    : index.url() + `?supplier_id=${activeSupplierId}`,
        },
    ];

    const editingMapping = mappings.find((m) => m.id === editingId) ?? null;

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Supplier Enrollment Field Mappings" />

            <h1 className="sr-only">Supplier Enrollment Field Mappings</h1>

            <div className="space-y-6">
                <HeadingSmall
                    title="Supplier Enrollment Field Mappings"
                    description="Map canonical enrollment form fields to supplier-specific API field names."
                />

                {/* Supplier selector */}
                <div className="flex flex-col gap-3 sm:flex-row sm:items-end">
                    <div className="flex w-full flex-col gap-1">
                        <label className="text-xs font-medium text-zinc-700 dark:text-zinc-300">
                            Supplier
                        </label>
                        <select
                            className="w-full rounded-md border border-zinc-200 bg-white px-3 py-2 text-sm dark:border-zinc-800 dark:bg-zinc-950"
                            value={activeSupplierId ?? ''}
                            onChange={(e) => {
                                const supplierId =
                                    e.target.value === ''
                                        ? undefined
                                        : Number(e.target.value);

                                window.location.href =
                                    supplierId === undefined
                                        ? index.url()
                                        : index.url() +
                                          `?supplier_id=${supplierId}`;
                            }}
                        >
                            <option value="" disabled>
                                Select supplier
                            </option>
                            {suppliers.map((s) => (
                                <option key={s.id} value={s.id}>
                                    {s.name}
                                </option>
                            ))}
                        </select>
                    </div>
                </div>

                {activeSupplierId === null ? (
                    <div className="rounded-md border border-zinc-200 bg-white p-4 text-sm text-zinc-700 dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-200">
                        Pick a supplier to view and edit enrollment field
                        mappings.
                    </div>
                ) : (
                    <div className="space-y-6">
                        {/* Add mapping button + dialog */}
                        <div className="flex items-center justify-end">
                            <Dialog open={createOpen} onOpenChange={setCreateOpen}>
                                <DialogTrigger asChild>
                                    <button
                                        type="button"
                                        className="rounded-md bg-zinc-900 px-3 py-2 text-sm font-medium text-white dark:bg-zinc-100 dark:text-zinc-900"
                                    >
                                        Add mapping
                                    </button>
                                </DialogTrigger>

                                <DialogContent className="sm:max-w-lg">
                                    <DialogHeader>
                                        <DialogTitle>Add mapping</DialogTitle>
                                        <DialogDescription>
                                            Map a supplier field to a canonical enrollment form field.
                                        </DialogDescription>
                                    </DialogHeader>

                                    <Form
                                        method="post"
                                        action={upsert.url()}
                                        resetOnSuccess
                                        onSuccess={() => setCreateOpen(false)}
                                        transform={(data) => ({
                                            ...data,
                                            supplier_id: activeSupplierId,
                                        })}
                                    >
                                        {({ processing, errors }) => (
                                            <div className="grid grid-cols-1 gap-3">
                                                <div className="flex flex-col gap-1">
                                                    <label className="text-xs font-medium text-zinc-700 dark:text-zinc-300">
                                                        Supplier Field Name
                                                    </label>
                                                    <input
                                                        name="supplier_field_name"
                                                        className="rounded-md border border-zinc-200 bg-white px-3 py-2 text-sm dark:border-zinc-800 dark:bg-zinc-950"
                                                        placeholder="customer_first_name"
                                                    />
                                                    {errors.supplier_field_name && (
                                                        <div className="text-xs text-red-600">
                                                            {errors.supplier_field_name}
                                                        </div>
                                                    )}
                                                </div>

                                                <div className="flex flex-col gap-1">
                                                    <label className="text-xs font-medium text-zinc-700 dark:text-zinc-300">
                                                        Canonical Form Field
                                                    </label>
                                                    <select
                                                        name="form_field_id"
                                                        className="rounded-md border border-zinc-200 bg-white px-3 py-2 text-sm dark:border-zinc-800 dark:bg-zinc-950"
                                                        defaultValue=""
                                                    >
                                                        <option value="">
                                                            None (backend only)
                                                        </option>
                                                        {formFields.map((f) => (
                                                            <option
                                                                key={f.id}
                                                                value={f.id}
                                                            >
                                                                {f.name} — {f.label}
                                                            </option>
                                                        ))}
                                                    </select>
                                                    {errors.form_field_id && (
                                                        <div className="text-xs text-red-600">
                                                            {errors.form_field_id}
                                                        </div>
                                                    )}
                                                </div>

                                                <div className="flex items-center gap-4">
                                                    <label className="flex items-center gap-2 text-sm text-zinc-700 dark:text-zinc-300">
                                                        <input
                                                            type="hidden"
                                                            name="is_required"
                                                            value="0"
                                                        />
                                                        <input
                                                            name="is_required"
                                                            type="checkbox"
                                                            value="1"
                                                        />
                                                        Required
                                                    </label>

                                                    <label className="flex items-center gap-2 text-sm text-zinc-700 dark:text-zinc-300">
                                                        <input
                                                            type="hidden"
                                                            name="is_active"
                                                            value="0"
                                                        />
                                                        <input
                                                            name="is_active"
                                                            type="checkbox"
                                                            value="1"
                                                            defaultChecked
                                                        />
                                                        Active
                                                    </label>
                                                </div>

                                                <div className="flex items-end justify-end gap-3">
                                                    <button
                                                        type="button"
                                                        onClick={() => setCreateOpen(false)}
                                                        className="rounded-md px-3 py-2 text-sm font-medium text-zinc-600 hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-zinc-100"
                                                    >
                                                        Cancel
                                                    </button>
                                                    <button
                                                        type="submit"
                                                        disabled={processing}
                                                        className="rounded-md bg-zinc-900 px-3 py-2 text-sm font-medium text-white disabled:opacity-60 dark:bg-zinc-100 dark:text-zinc-900"
                                                    >
                                                        Add mapping
                                                    </button>
                                                </div>
                                            </div>
                                        )}
                                    </Form>
                                </DialogContent>
                            </Dialog>
                        </div>

                        {/* Mappings table */}
                        <div className="overflow-hidden rounded-md border border-zinc-200 bg-white dark:border-zinc-800 dark:bg-zinc-950">
                            <div className="overflow-x-auto">
                                <table className="w-full text-left text-sm">
                                    <thead className="border-b border-zinc-200 text-xs text-zinc-600 uppercase dark:border-zinc-800 dark:text-zinc-400">
                                        <tr>
                                            <SortableHeader
                                                label="Supplier Field"
                                                column="supplier_field_name"
                                                sortColumn={sortColumn}
                                                sortDirection={sortDirection}
                                                onSort={toggleSort}
                                            />
                                            <SortableHeader
                                                label="Canonical Field"
                                                column="form_field_id"
                                                sortColumn={sortColumn}
                                                sortDirection={sortDirection}
                                                onSort={toggleSort}
                                            />
                                            <SortableHeader
                                                label="Required"
                                                column="is_required"
                                                sortColumn={sortColumn}
                                                sortDirection={sortDirection}
                                                onSort={toggleSort}
                                            />
                                            <SortableHeader
                                                label="Active"
                                                column="is_active"
                                                sortColumn={sortColumn}
                                                sortDirection={sortDirection}
                                                onSort={toggleSort}
                                            />
                                            <th className="px-4 py-3" />
                                        </tr>
                                    </thead>
                                    <tbody className="divide-y divide-zinc-200 dark:divide-zinc-800">
                                        {sorted.map((m) => (
                                            <tr key={m.id}>
                                                <td className="px-4 py-3 font-mono text-xs font-medium">
                                                    {m.supplier_field_name}
                                                </td>
                                                <td className="px-4 py-3 text-zinc-600 dark:text-zinc-400">
                                                    {m.form_field ? (
                                                        <span>
                                                            <span className="font-mono text-xs">
                                                                {m.form_field.name}
                                                            </span>{' '}
                                                            — {m.form_field.label}
                                                        </span>
                                                    ) : (
                                                        <span className="text-zinc-400 italic dark:text-zinc-500">
                                                            Backend only
                                                        </span>
                                                    )}
                                                </td>
                                                <td className="px-4 py-3">
                                                    {m.is_required ? 'Yes' : 'No'}
                                                </td>
                                                <td className="px-4 py-3">
                                                    {m.is_active ? 'Yes' : 'No'}
                                                </td>
                                                <td className="px-4 py-3 text-right">
                                                    <div className="flex items-center justify-end gap-4">
                                                        <Dialog
                                                            open={editingId === m.id}
                                                            onOpenChange={(open) =>
                                                                setEditingId(open ? m.id : null)
                                                            }
                                                        >
                                                            <DialogTrigger asChild>
                                                                <button
                                                                    type="button"
                                                                    className="text-sm text-zinc-700 hover:underline dark:text-zinc-300"
                                                                >
                                                                    Edit
                                                                </button>
                                                            </DialogTrigger>

                                                            <DialogContent className="sm:max-w-lg">
                                                                <DialogHeader>
                                                                    <DialogTitle>Edit mapping</DialogTitle>
                                                                    <DialogDescription>
                                                                        Update the mapping for{' '}
                                                                        {m.supplier_field_name}.
                                                                    </DialogDescription>
                                                                </DialogHeader>

                                                                {editingMapping && editingMapping.id === m.id && (
                                                                    <Form
                                                                        method="post"
                                                                        action={upsert.url()}
                                                                        onSuccess={() => setEditingId(null)}
                                                                        transform={(data) => ({
                                                                            ...data,
                                                                            supplier_id: activeSupplierId,
                                                                        })}
                                                                    >
                                                                        {({ processing, errors }) => (
                                                                            <div className="grid grid-cols-1 gap-3">
                                                                                <div className="flex flex-col gap-1">
                                                                                    <label className="text-xs font-medium text-zinc-700 dark:text-zinc-300">
                                                                                        Supplier Field Name
                                                                                    </label>
                                                                                    <input
                                                                                        name="supplier_field_name"
                                                                                        defaultValue={m.supplier_field_name}
                                                                                        className="rounded-md border border-zinc-200 bg-white px-3 py-2 text-sm dark:border-zinc-800 dark:bg-zinc-950"
                                                                                        placeholder="customer_first_name"
                                                                                    />
                                                                                    {errors.supplier_field_name && (
                                                                                        <div className="text-xs text-red-600">
                                                                                            {errors.supplier_field_name}
                                                                                        </div>
                                                                                    )}
                                                                                </div>

                                                                                <div className="flex flex-col gap-1">
                                                                                    <label className="text-xs font-medium text-zinc-700 dark:text-zinc-300">
                                                                                        Canonical Form Field
                                                                                    </label>
                                                                                    <select
                                                                                        name="form_field_id"
                                                                                        defaultValue={m.form_field_id ?? ''}
                                                                                        className="rounded-md border border-zinc-200 bg-white px-3 py-2 text-sm dark:border-zinc-800 dark:bg-zinc-950"
                                                                                    >
                                                                                        <option value="">
                                                                                            None (backend only)
                                                                                        </option>
                                                                                        {formFields.map((f) => (
                                                                                            <option
                                                                                                key={f.id}
                                                                                                value={f.id}
                                                                                            >
                                                                                                {f.name} — {f.label}
                                                                                            </option>
                                                                                        ))}
                                                                                    </select>
                                                                                    {errors.form_field_id && (
                                                                                        <div className="text-xs text-red-600">
                                                                                            {errors.form_field_id}
                                                                                        </div>
                                                                                    )}
                                                                                </div>

                                                                                <div className="flex items-center gap-4">
                                                                                    <label className="flex items-center gap-2 text-sm text-zinc-700 dark:text-zinc-300">
                                                                                        <input
                                                                                            type="hidden"
                                                                                            name="is_required"
                                                                                            value="0"
                                                                                        />
                                                                                        <input
                                                                                            name="is_required"
                                                                                            type="checkbox"
                                                                                            value="1"
                                                                                            defaultChecked={m.is_required}
                                                                                        />
                                                                                        Required
                                                                                    </label>

                                                                                    <label className="flex items-center gap-2 text-sm text-zinc-700 dark:text-zinc-300">
                                                                                        <input
                                                                                            type="hidden"
                                                                                            name="is_active"
                                                                                            value="0"
                                                                                        />
                                                                                        <input
                                                                                            name="is_active"
                                                                                            type="checkbox"
                                                                                            value="1"
                                                                                            defaultChecked={m.is_active}
                                                                                        />
                                                                                        Active
                                                                                    </label>
                                                                                </div>

                                                                                <div className="flex items-end justify-end gap-3">
                                                                                    <button
                                                                                        type="button"
                                                                                        onClick={() => setEditingId(null)}
                                                                                        className="rounded-md px-3 py-2 text-sm font-medium text-zinc-600 hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-zinc-100"
                                                                                    >
                                                                                        Cancel
                                                                                    </button>
                                                                                    <button
                                                                                        type="submit"
                                                                                        disabled={processing}
                                                                                        className="rounded-md bg-zinc-900 px-3 py-2 text-sm font-medium text-white disabled:opacity-60 dark:bg-zinc-100 dark:text-zinc-900"
                                                                                    >
                                                                                        Save
                                                                                    </button>
                                                                                </div>
                                                                            </div>
                                                                        )}
                                                                    </Form>
                                                                )}
                                                            </DialogContent>
                                                        </Dialog>

                                                        <Form
                                                            method="delete"
                                                            action={
                                                                destroy.url(m.id) +
                                                                `?supplier_id=${activeSupplierId}`
                                                            }
                                                        >
                                                            {({ processing }) => (
                                                                <button
                                                                    type="submit"
                                                                    disabled={
                                                                        processing
                                                                    }
                                                                    className="text-sm text-red-700 hover:underline disabled:opacity-60 dark:text-red-400"
                                                                >
                                                                    Delete
                                                                </button>
                                                            )}
                                                        </Form>
                                                    </div>
                                                </td>
                                            </tr>
                                        ))}
                                    </tbody>
                                </table>
                            </div>

                            {mappings.length === 0 && (
                                <div className="p-4 text-sm text-zinc-600 dark:text-zinc-400">
                                    No enrollment field mappings yet.
                                </div>
                            )}
                        </div>
                    </div>
                )}
            </div>
        </AppLayout>
    );
}
