import { Head, usePage } from '@inertiajs/react';
import { IconButton } from '@/components/common/IconButton';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { TableActiveFilters, type TableActiveFilterItem } from '@/components/common/TableActiveFilters';
import { PageHeaderActions } from '@/components/page-header-actions';
import { TableListToolbar } from '@/components/common/TableListToolbar';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
import { AccountingDocumentTypeFormSheet } from '@/features/accounting-document-types/components/accounting-document-type-form-sheet';
import { useAccountingDocumentTypesFilters } from '@/features/accounting-document-types/lib/use-accounting-document-types-filters';
import { useAccountingDocumentTypesColumns } from '@/features/accounting-document-types/table/accounting-document-types-columns';
import { AccountingDocumentTypesTable } from '@/features/accounting-document-types/table/accounting-document-types-table';
import type {
    AccountingDocumentTypesIndexPageProps,
    AccountingDocumentTypesSortColumn,
} from '@/features/accounting-document-types/types';
import { useAuthorization } from '@/hooks/use-authorization';
import { useI18n } from '@/hooks/use-i18n';

export default function AccountingDocumentTypesSettingsPage() {
    const { t } = useI18n();
    const { accounting_document_types, filters: initialFilters, editing_accounting_document_type } =
        usePage<AccountingDocumentTypesIndexPageProps>().props;
    const { hasRole } = useAuthorization();
    const canManage = hasRole('admin');
    const { filters, search, setSearch, isApplying, applyFilters, openEdit, closeEdit } =
        useAccountingDocumentTypesFilters(initialFilters);

    const [createSheetOpen, setCreateSheetOpen] = useState(false);

    const sheetOpen = createSheetOpen || Boolean(editing_accounting_document_type);
    const sheetMode = editing_accounting_document_type ? 'edit' : 'create';

    useEffect(() => {
        if (editing_accounting_document_type) {
            setCreateSheetOpen(false);
        }
    }, [editing_accounting_document_type]);

    const onSort = useCallback(
        (column: AccountingDocumentTypesSortColumn) => {
            const nextDirection =
                filters.sort_by === column && filters.sort_direction === 'asc' ? 'desc' : 'asc';

            applyFilters({
                page: 1,
                sort_by: column,
                sort_direction: nextDirection,
            });
        },
        [applyFilters, filters.sort_by, filters.sort_direction],
    );

    const columns = useAccountingDocumentTypesColumns(onSort, canManage, openEdit);

    const handleSheetOpenChange = (open: boolean) => {
        if (!open) {
            setCreateSheetOpen(false);

            if (editing_accounting_document_type) {
                closeEdit();
            }
        }
    };

    const clearAllFilters = () => {
        setSearch('');
        applyFilters({ page: 1, search: '' });
    };

    const activeFilterItems = useMemo((): TableActiveFilterItem[] => {
        if (filters.search === '') {
            return [];
        }

        return [
            {
                key: 'search',
                label: t('common.active_filters.search', { value: filters.search }),
                onRemove: clearAllFilters,
            },
        ];
    }, [filters.search, t]);

    return (
        <>
            <Head title={t('settings.accounting_document_types.page.head_title')} />

            <section className="space-y-6">
                <PageHeaderActions
                    title={t('settings.accounting_document_types.page.title')}
                    description={t('settings.accounting_document_types.page.description')}
                    actions={
                        canManage ? (
                            <TooltipProvider delayDuration={150}>
                                <Tooltip>
                                    <TooltipTrigger asChild>
                                        <IconButton
                                            type="button"
                                            variant="contained"
                                            color="primary"
                                            size="sm"
                                            aria-label={t('settings.accounting_document_types.tooltips.add_type')}
                                            onClick={() => setCreateSheetOpen(true)}
                                            icon="material-symbols:add"
                                        />
                                    </TooltipTrigger>
                                    <TooltipContent>
                                        {t('settings.accounting_document_types.tooltips.add_type')}
                                    </TooltipContent>
                                </Tooltip>
                            </TooltipProvider>
                        ) : null
                    }
                />

                <Card>
                    <CardHeader className="space-y-4">
                        <TableListToolbar
                            align="end"
                            searchLabel={t('settings.accounting_document_types.search.label')}
                            search={{
                                id: 'adt-search',
                                value: search,
                                onChange: setSearch,
                                onSubmit: () => applyFilters({ page: 1, search }),
                                placeholder: t('settings.accounting_document_types.search.placeholder'),
                                submitLabel: t('settings.accounting_document_types.search.submit'),
                                disabled: isApplying,
                            }}
                        />
                        <TableActiveFilters items={activeFilterItems} onClearAll={clearAllFilters} />
                    </CardHeader>

                    <CardContent className="pt-0">
                        <AccountingDocumentTypesTable
                            columns={columns}
                            data={accounting_document_types.data}
                            pagination={accounting_document_types.meta}
                            onPageChange={(page) => applyFilters({ page })}
                            isLoading={isApplying}
                        />
                    </CardContent>
                </Card>
            </section>

            {canManage && sheetOpen ? (
                <AccountingDocumentTypeFormSheet
                    open={sheetOpen}
                    onOpenChange={handleSheetOpenChange}
                    mode={sheetMode}
                    documentType={editing_accounting_document_type}
                    onAfterSave={() => {
                        setCreateSheetOpen(false);

                        if (editing_accounting_document_type) {
                            closeEdit();
                        }
                    }}
                />
            ) : null}
        </>
    );
}
