import { adminToast } from '@admin/components/ui/admin-toast';
import { CrudCreateLink } from '@admin/components/ui/crud-create-link';
import { DataTable, type DataTableColumn } from '@admin/components/ui/data-table';
import { DeleteConfirmationModal } from '@admin/components/ui/delete-confirmation-modal';
import { formHelpClassName } from '@admin/components/ui/field-styles';
import { useCrudPermissions } from '@admin/hooks/use-crud-permissions';
import { dashboardPersistentLayout } from '@admin/layouts/dashboard-page-layout';
import { cn } from '@admin/lib/utils';
import EditItem from '@admin/pages/menu-items/edit-item';
import type { MenuCurrency } from '@admin/pages/menu-items/item-form-fields';
import { Head } from '@inertiajs/react';
import { useState } from 'react';

type ItemRow = {
    id: number;
    name: string;
    category: string;
    price: string;
    sort_order: number;
    status: boolean;
};

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

type ItemsIndexProps = {
    items: ItemRow[];
    categories: MenuCategoryOption[];
    currencies: MenuCurrency[];
    tzsPerUsd: string | null;
};

function ItemsIndex({ items, categories, currencies, tzsPerUsd }: ItemsIndexProps) {
    const { canEdit, canDelete } = useCrudPermissions('menu-item');
    const [isEditModalOpen, setIsEditModalOpen] = useState(false);
    const [initialData, setInitialData] = useState<(ItemRow & { menu_category_id?: number; description?: string; currency_code?: string; image?: string; price?: string }) | null>(null);
    const [deleteModal, setDeleteModal] = useState<{ show: boolean; item: ItemRow | null }>({
        show: false,
        item: null,
    });

    const columns: DataTableColumn<ItemRow>[] = [
        { header: 'Order', key: 'sort_order', className: 'w-20' },
        { header: 'Dish', key: 'name', truncate: true },
        { header: 'Category', key: 'category', truncate: true },
        { header: 'Price', key: 'price', truncate: true },
        { header: 'Status', key: 'status' },
    ];

    const handleEdit = async (row: ItemRow) => {
        try {
            const response = await fetch(`/admin/edit_menu_item/${row.id}`);
            if (!response.ok) {
                throw new Error('Failed to fetch menu item');
            }

            setInitialData((await response.json()) as ItemRow);
            setIsEditModalOpen(true);
        } catch {
            adminToast.error('Could not load menu item');
        }
    };

    return (
        <>
            <Head title="Menu items" />

            <div className="grid grid-cols-12 gap-6">
                <div className="col-span-12">
                    <div className="mb-4 flex flex-wrap gap-2">
                        <CrudCreateLink href={route('admin.menu-items.create')} label="Create menu item" resource="menu-item" className="ti-btn ti-btn-primary" />
                        <a className="ti-btn ti-btn-outline-primary" href={route('restaurant.menu')}>
                            Download menu PDF
                        </a>
                    </div>
                    <p className={cn('mb-4', formHelpClassName)}>
                        Each dish needs a 100×100 px photo. Enter the price in US dollars or any active currency. The dining page shows the dollar amount.
                    </p>
                    <DataTable
                        data={items}
                        columns={columns}
                        title="Menu items"
                        itemsPerPage={10}
                        onEdit={canEdit ? handleEdit : undefined}
                        onDelete={canDelete ? (row) => setDeleteModal({ show: true, item: row }) : undefined}
                        showEdit={canEdit}
                        showDelete={canDelete}
                        noDataText="No menu items found"
                    />
                </div>
            </div>

            <DeleteConfirmationModal
                isOpen={deleteModal.show}
                onClose={() => setDeleteModal({ show: false, item: null })}
                itemName={deleteModal.item?.name ?? 'this dish'}
                itemType="menu item"
                deleteEndpoint={`/admin/api/delete_menu_item/${deleteModal.item?.id ?? ''}`}
                loadingMessage="Deleting menu item..."
            />

            <EditItem
                isOpen={isEditModalOpen}
                onClose={() => setIsEditModalOpen(false)}
                initialData={initialData}
                categories={categories}
                currencies={currencies}
                tzsPerUsd={tzsPerUsd}
            />
        </>
    );
}

export default Object.assign(ItemsIndex, {
    layout: dashboardPersistentLayout('Menu items', 'Dishes on the dining page'),
});
