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 { CurrencyFormSheet } from '@/features/currencies/components/currency-form-sheet';
import { useCurrenciesFilters } from '@/features/currencies/lib/use-currencies-filters';
import { useCurrenciesColumns } from '@/features/currencies/table/currencies-columns';
import { CurrenciesTable } from '@/features/currencies/table/currencies-table';
import type { CurrenciesIndexPageProps, CurrenciesSortColumn } from '@/features/currencies/types';
import { useAuthorization } from '@/hooks/use-authorization';
import { useI18n } from '@/hooks/use-i18n';

export default function CurrenciesSettingsPage() {
    const { t } = useI18n();
    const { currencies, filters: initialFilters, editing_currency } = usePage<CurrenciesIndexPageProps>().props;
    const { hasRole } = useAuthorization();
    const canManage = hasRole('admin');
    const { filters, search, setSearch, isApplying, applyFilters, openEdit, closeEdit } =
        useCurrenciesFilters(initialFilters);

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

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

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

    const onSort = useCallback(
        (column: CurrenciesSortColumn) => {
            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 = useCurrenciesColumns(onSort, canManage, openEdit, filters);

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

            if (editing_currency) {
                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.currencies.page.head_title')} />

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

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

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

            {canManage && sheetOpen ? (
                <CurrencyFormSheet
                    open={sheetOpen}
                    onOpenChange={handleSheetOpenChange}
                    mode={sheetMode}
                    currency={editing_currency}
                    onAfterSave={() => {
                        setCreateSheetOpen(false);

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