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

import HeadingSmall from '@/components/heading-small';
import { SortableHeader, SortDirection } from '@/components/sortable-header';
import { useUserTimezone } from '@/hooks/use-user-timezone';
import AppLayout from '@/layouts/app-layout';
import { formatDateTime } from '@/lib/format-date';

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

type SupplierProduct = {
    id: number;
    external_id: string;
    status: string;
    updated_at: string;
    utility: { id: number; name: string } | null;
    state: { id: number; code: string } | null;
};

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

type Props = {
    suppliers: Supplier[];
    activeSupplierId: number | null;
    status: string;
    utilityId: number | null;
    utilities: Utility[];
    products: SupplierProduct[];
};

type ProductSortKey = 'external_id' | 'utility' | 'state' | 'status' | 'updated_at';

function StatusBadge({ status }: { status: string }) {
    const colors: Record<string, string> = {
        active: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300',
        inactive: 'bg-zinc-100 text-zinc-600 dark:bg-zinc-800 dark:text-zinc-400',
        archived: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300',
    };

    return (
        <span
            className={`inline-block rounded-full px-2 py-0.5 text-xs font-medium ${colors[status] ?? 'bg-zinc-100 text-zinc-600 dark:bg-zinc-800 dark:text-zinc-400'}`}
        >
            {status}
        </span>
    );
}

export default function SupplierProducts({
    suppliers,
    activeSupplierId,
    status,
    utilityId,
    utilities,
    products,
}: Props) {
    const timezone = useUserTimezone();
    const baseUrl = '/admin/supplier-products';

    function buildUrl(params: Record<string, string | number | undefined>) {
        const filtered = Object.entries(params).filter(([, v]) => v !== undefined && v !== '');
        if (filtered.length === 0) return baseUrl;
        return `${baseUrl}?${new URLSearchParams(filtered.map(([k, v]) => [k, String(v)])).toString()}`;
    }

    const [productSortColumn, setProductSortColumn] = useState<ProductSortKey>('updated_at');
    const [productSortDirection, setProductSortDirection] = useState<SortDirection>('desc');

    function handleProductSort(column: string) {
        const key = column as ProductSortKey;
        if (key === productSortColumn) {
            setProductSortDirection((d: SortDirection) => (d === 'asc' ? 'desc' : 'asc'));
        } else {
            setProductSortColumn(key);
            setProductSortDirection('asc');
        }
    }

    const sortedProducts = [...products].sort((a, b) => {
        let aVal: string | number | null;
        let bVal: string | number | null;

        switch (productSortColumn) {
            case 'utility':
                aVal = a.utility?.name ?? '';
                bVal = b.utility?.name ?? '';
                break;
            case 'state':
                aVal = a.state?.code ?? '';
                bVal = b.state?.code ?? '';
                break;
            default:
                aVal = a[productSortColumn] ?? '';
                bVal = b[productSortColumn] ?? '';
        }

        if (aVal < bVal) return productSortDirection === 'asc' ? -1 : 1;
        if (aVal > bVal) return productSortDirection === 'asc' ? 1 : -1;
        return 0;
    });

    const breadcrumbs = [
        {
            title: 'Supplier Products',
            href:
                activeSupplierId === null
                    ? baseUrl
                    : `${baseUrl}?supplier_id=${activeSupplierId}`,
        },
    ];

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Supplier Products" />

            <h1 className="sr-only">Supplier Products</h1>

            <div className="space-y-6">
                <HeadingSmall
                    title="Supplier Products"
                    description="View and filter supplier products."
                />

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

                                window.location.href = buildUrl({
                                    supplier_id: supplierId,
                                    status,
                                    utility_id: utilityId ?? undefined,
                                });
                            }}
                        >
                            <option value="" disabled>
                                Select supplier
                            </option>
                            {suppliers.map((s) => (
                                <option key={s.id} value={s.id}>
                                    {s.name}
                                </option>
                            ))}
                        </select>
                    </div>

                    <div className="flex flex-col gap-1">
                        <label className="text-sm font-medium text-zinc-900 dark:text-zinc-100">
                            Status
                        </label>
                        <select
                            className="rounded-md border border-zinc-200 bg-white px-3 py-2 text-sm text-zinc-900 shadow-sm dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-100"
                            value={status}
                            onChange={(e) => {
                                window.location.href = buildUrl({
                                    supplier_id: activeSupplierId ?? undefined,
                                    status: e.target.value,
                                    utility_id: utilityId ?? undefined,
                                });
                            }}
                        >
                            <option value="all">All</option>
                            <option value="active">Active</option>
                            <option value="inactive">Inactive</option>
                            <option value="archived">Archived</option>
                        </select>
                    </div>

                    <div className="flex flex-col gap-1">
                        <label className="text-sm font-medium text-zinc-900 dark:text-zinc-100">
                            Utility
                        </label>
                        <select
                            className="rounded-md border border-zinc-200 bg-white px-3 py-2 text-sm text-zinc-900 shadow-sm dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-100"
                            value={utilityId ?? ''}
                            onChange={(e) => {
                                window.location.href = buildUrl({
                                    supplier_id: activeSupplierId ?? undefined,
                                    status,
                                    utility_id: e.target.value === '' ? undefined : Number(e.target.value),
                                });
                            }}
                        >
                            <option value="">All utilities</option>
                            {utilities.map((u) => (
                                <option key={u.id} value={u.id}>
                                    {u.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 products.
                    </div>
                ) : (
                    <div className="space-y-8">
                        <div className="space-y-3">
                            <h2 className="text-sm font-medium text-zinc-900 dark:text-zinc-100">
                                Products ({products.length})
                            </h2>

                            <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 uppercase text-zinc-600 dark:border-zinc-800 dark:text-zinc-400">
                                            <tr>
                                                <SortableHeader label="External ID" column="external_id" sortColumn={productSortColumn} sortDirection={productSortDirection} onSort={handleProductSort} />
                                                <SortableHeader label="Utility" column="utility" sortColumn={productSortColumn} sortDirection={productSortDirection} onSort={handleProductSort} />
                                                <SortableHeader label="State" column="state" sortColumn={productSortColumn} sortDirection={productSortDirection} onSort={handleProductSort} />
                                                <SortableHeader label="Status" column="status" sortColumn={productSortColumn} sortDirection={productSortDirection} onSort={handleProductSort} />
                                                <SortableHeader label="Updated" column="updated_at" sortColumn={productSortColumn} sortDirection={productSortDirection} onSort={handleProductSort} />
                                            </tr>
                                        </thead>
                                        <tbody className="divide-y divide-zinc-200 dark:divide-zinc-800">
                                            {sortedProducts.map((product) => (
                                                <tr key={product.id}>
                                                    <td className="px-4 py-3 font-mono text-xs">
                                                        {product.external_id}
                                                    </td>
                                                    <td className="px-4 py-3">
                                                        {product.utility?.name ?? '—'}
                                                    </td>
                                                    <td className="px-4 py-3 font-mono text-xs">
                                                        {product.state?.code ?? '—'}
                                                    </td>
                                                    <td className="px-4 py-3">
                                                        <StatusBadge status={product.status} />
                                                    </td>
                                                    <td className="px-4 py-3 text-xs text-zinc-500">
                                                        {formatDateTime(product.updated_at, timezone)}
                                                    </td>
                                                </tr>
                                            ))}
                                        </tbody>
                                    </table>
                                </div>

                                {products.length === 0 && (
                                    <div className="p-4 text-sm text-zinc-600 dark:text-zinc-400">
                                        No products found for this supplier.
                                    </div>
                                )}
                            </div>
                        </div>

                        <div className="text-sm text-zinc-600 dark:text-zinc-400">
                            <Link
                                href={`${baseUrl}?supplier_id=${activeSupplierId}`}
                                className="hover:underline"
                            >
                                Refresh
                            </Link>
                        </div>
                    </div>
                )}
            </div>
        </AppLayout>
    );
}
