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

import HeadingSmall from '@/components/heading-small';
import { SortableHeader, useSort } from '@/components/sortable-header';
import AppLayout from '@/layouts/app-layout';
import { exportMethod, index } from '@/routes/admin/test-zip-codes';

type TestZipCode = {
    id: number;
    zip_code: string;
    utility: {
        id: number;
        name: string;
        code: string;
        state: {
            id: number;
            code: string;
            name: string;
        } | null;
    };
};

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

type Props = {
    testZipCodes: TestZipCode[];
    suppliers: Supplier[];
};

const breadcrumbs = [{ title: 'Test Zip Codes', href: index.url() }];

export default function TestZipCodes({ testZipCodes, suppliers }: Props) {
    const [supplierId, setSupplierId] = useState('');

    useEffect(() => {
        router.get(index.url(), supplierId ? { supplier_id: supplierId } : {}, {
            preserveState: true,
            replace: true,
        });
    }, [supplierId]);

    const { sorted, sortColumn, sortDirection, toggleSort } = useSort(
        testZipCodes,
        'zip_code',
        'asc',
        {
            utility: (item) => item.utility.name,
            state: (item) => item.utility.state?.code,
        },
    );

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Test Zip Codes" />

            <h1 className="sr-only">Test Zip Codes</h1>

            <div className="space-y-6">
                <div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
                    <HeadingSmall
                        title="Test Zip Codes"
                        description="Each utility has a fake zip code that returns products from every supplier, including disabled ones, so a supplier can be smoke tested before it's enabled."
                    />

                    <div className="flex flex-wrap items-center gap-3">
                        <select
                            value={supplierId}
                            onChange={(e) => setSupplierId(e.target.value)}
                            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="">All suppliers</option>
                            {suppliers.map((s) => (
                                <option key={s.id} value={s.id}>
                                    {s.name}
                                </option>
                            ))}
                        </select>

                        <a
                            href={exportMethod.url(
                                supplierId
                                    ? { query: { supplier_id: supplierId } }
                                    : undefined,
                            )}
                            className="rounded-md border border-zinc-200 px-3 py-2 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-800 dark:text-zinc-300 dark:hover:bg-zinc-900"
                        >
                            Export
                        </a>
                    </div>
                </div>

                <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="Zip Code"
                                        column="zip_code"
                                        sortColumn={sortColumn}
                                        sortDirection={sortDirection}
                                        onSort={toggleSort}
                                    />
                                    <SortableHeader
                                        label="Utility"
                                        column="utility"
                                        sortColumn={sortColumn}
                                        sortDirection={sortDirection}
                                        onSort={toggleSort}
                                    />
                                    <SortableHeader
                                        label="Utility Code"
                                        column="code"
                                        sortColumn={sortColumn}
                                        sortDirection={sortDirection}
                                        onSort={toggleSort}
                                    />
                                    <SortableHeader
                                        label="State"
                                        column="state"
                                        sortColumn={sortColumn}
                                        sortDirection={sortDirection}
                                        onSort={toggleSort}
                                    />
                                </tr>
                            </thead>
                            <tbody className="divide-y divide-zinc-200 dark:divide-zinc-800">
                                {sorted.map((t) => (
                                    <tr key={t.id}>
                                        <td className="px-4 py-3 font-mono text-xs font-medium">
                                            {t.zip_code}
                                        </td>
                                        <td className="px-4 py-3">
                                            {t.utility.name}
                                        </td>
                                        <td className="px-4 py-3 font-mono text-xs">
                                            {t.utility.code}
                                        </td>
                                        <td className="px-4 py-3">
                                            {t.utility.state?.name ?? '—'}
                                        </td>
                                    </tr>
                                ))}
                            </tbody>
                        </table>
                    </div>

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