'use client';

import { useMemo, useState } from 'react';
import { ListingPageOptionsButton } from './ListingPageOptionsButton';
import { ListingPageOptionsModal } from './ListingPageOptionsModal';
import type { ModalOpcaoAction } from '@/components/ModalOpcoesBase';

export type UseListaMaisOpcoesConfig = {
    testIdPrefix: string;
    subtitle: string;
    ariaLabel: string;
    /**
     * Default: `false` (colunas manipuláveis).
     * Só `true` em Kanban / vista sem tabela — com `colunasDisabledReason`.
     */
    colunasDisabled?: boolean;
    colunasDisabledReason?: string;
    /**
     * Abre o modal de personalização de colunas.
     * Obrigatório quando `colunasDisabled` é false; se omitido com colunas enabled,
     * a acção fica disabled com motivo explícito (não callback no-op silencioso).
     */
    onColunasVisiveis?: () => void;
    extraActions?: ModalOpcaoAction[];
    /** Grupo "Navegação" do registry ModuleRelatedLinks. */
    navigationActions?: ModalOpcaoAction[];
    premiumModalShell?: boolean;
};

/** Botão + modal "Opções" da listagem (Tier A/B). */
export function useListaMaisOpcoes({
    testIdPrefix,
    subtitle,
    ariaLabel,
    colunasDisabled = false,
    colunasDisabledReason,
    onColunasVisiveis,
    extraActions,
    navigationActions = [],
    premiumModalShell = false,
}: UseListaMaisOpcoesConfig) {
    const [open, setOpen] = useState(false);
    const closeListaMaisOpcoes = () => setOpen(false);

    const wrappedExtraActions = useMemo(
        () =>
            extraActions?.map((action) => ({
                ...action,
                onClick: () => {
                    closeListaMaisOpcoes();
                    action.onClick?.();
                },
            })),
        [extraActions],
    );

    const colunasSemHandler = !colunasDisabled && !onColunasVisiveis;
    const colunasDisabledResolved = colunasDisabled || colunasSemHandler;
    const colunasDisabledReasonResolved =
        colunasDisabledReason ??
        (colunasSemHandler
            ? 'Personalização de colunas ainda não disponível nesta listagem.'
            : colunasDisabled
              ? 'Colunas fixas nesta listagem.'
              : undefined);

    return {
        closeListaMaisOpcoes,
        headerButton: (
            <ListingPageOptionsButton
                data-testid={`${testIdPrefix}-lista-mais-opcoes`}
                expanded={open}
                ariaLabel={ariaLabel}
                onClick={() => setOpen(true)}
            />
        ),
        modal: (
            <ListingPageOptionsModal
                open={open}
                onClose={closeListaMaisOpcoes}
                subtitle={subtitle}
                onColunasVisiveis={onColunasVisiveis}
                colunasDisabled={colunasDisabledResolved}
                colunasDisabledReason={colunasDisabledReasonResolved}
                navigationActions={navigationActions}
                extraActions={wrappedExtraActions}
                data-testid={`${testIdPrefix}-opcoes-pagina-modal`}
                premiumModalShell={premiumModalShell}
            />
        ),
    };
}
