'use client';

import type { ModalOpcaoAction, ModalOpcaoGroup } from '@/components/ModalOpcoesBase';
import { ICON_SIZE_MD } from '@/components/icons';
import {
    ArrowLeft,
    Ban,
    Check,
    GitBranch,
    RotateCcw,
    Save,
    Trash2,
} from 'lucide-react';
import type { CasoUso } from './types';

export type CasoUsoDetalheOpcoesHandlers = {
    onSalvar: () => void;
    onAprovar: () => void;
    onReabrir: () => void;
    onObsoletar: () => void;
    onExcluir: () => void;
    onVoltarLista: () => void;
    umlHref: string;
};

export type BuildCasoUsoDetalheOpcoesGroupsParams = {
    caso: CasoUso;
    canEditar: boolean;
    canExcluir: boolean;
    bloqueado: boolean;
    salvarPending?: boolean;
    statusPending?: boolean;
    tooltipSemPermissao: (acao: string) => string;
    handlers: CasoUsoDetalheOpcoesHandlers;
};

export function buildCasoUsoDetalheOpcoesGroups({
    caso,
    canEditar,
    canExcluir,
    bloqueado,
    salvarPending,
    statusPending,
    tooltipSemPermissao,
    handlers,
}: BuildCasoUsoDetalheOpcoesGroupsParams): ModalOpcaoGroup[] {
    const ciclo: ModalOpcaoAction[] = [];
    const navegacao: ModalOpcaoAction[] = [];
    const perigo: ModalOpcaoAction[] = [];

    const podeAprovar = caso.status !== 'aprovado' && caso.status !== 'obsoleto';
    const podeReabrir = caso.status === 'aprovado';
    const podeObsoletar = caso.status !== 'obsoleto';

    ciclo.push({
        key: 'salvar',
        label: 'Salvar especificação',
        icon: <Save size={ICON_SIZE_MD} aria-hidden />,
        primary: true,
        onClick: handlers.onSalvar,
        disabled: bloqueado || Boolean(salvarPending),
        loading: salvarPending,
        disabledReason: !canEditar
            ? tooltipSemPermissao('editar')
            : caso.status === 'aprovado'
              ? 'Reabra o caso de uso para editar a especificação.'
              : caso.status === 'obsoleto'
                ? 'Caso de uso obsoleto não pode ser editado.'
                : undefined,
        testId: 'projeto-caso-uso-detalhe-salvar',
    });

    if (podeAprovar) {
        ciclo.push({
            key: 'aprovar',
            label: 'Aprovar',
            icon: <Check size={ICON_SIZE_MD} aria-hidden />,
            onClick: handlers.onAprovar,
            disabled: !canEditar || Boolean(statusPending),
            loading: statusPending,
            disabledReason: !canEditar ? tooltipSemPermissao('editar') : undefined,
            testId: 'projeto-caso-uso-detalhe-aprovar',
        });
    }

    if (podeReabrir) {
        ciclo.push({
            key: 'reabrir',
            label: 'Reabrir para revisão',
            icon: <RotateCcw size={ICON_SIZE_MD} aria-hidden />,
            onClick: handlers.onReabrir,
            disabled: !canEditar || Boolean(statusPending),
            loading: statusPending,
            disabledReason: !canEditar ? tooltipSemPermissao('editar') : undefined,
            testId: 'projeto-caso-uso-detalhe-reabrir',
        });
    }

    navegacao.push({
        key: 'voltar',
        label: 'Voltar à listagem',
        icon: <ArrowLeft size={ICON_SIZE_MD} aria-hidden />,
        onClick: handlers.onVoltarLista,
        testId: 'projeto-caso-uso-detalhe-voltar',
    });

    navegacao.push({
        key: 'uml',
        label: 'Diagrama UML',
        icon: <GitBranch size={ICON_SIZE_MD} aria-hidden />,
        href: handlers.umlHref,
        onClick: () => undefined,
        testId: 'projeto-caso-uso-detalhe-uml',
    });

    if (podeObsoletar) {
        perigo.push({
            key: 'obsoletar',
            label: 'Obsoletar',
            icon: <Ban size={ICON_SIZE_MD} aria-hidden />,
            danger: true,
            onClick: handlers.onObsoletar,
            disabled: !canEditar || Boolean(statusPending),
            loading: statusPending,
            disabledReason: !canEditar ? tooltipSemPermissao('editar') : undefined,
            testId: 'projeto-caso-uso-detalhe-obsoletar',
        });
    }

    if (canExcluir) {
        perigo.push({
            key: 'excluir',
            label: 'Excluir',
            icon: <Trash2 size={ICON_SIZE_MD} aria-hidden />,
            danger: true,
            onClick: handlers.onExcluir,
            testId: 'projeto-caso-uso-detalhe-excluir',
        });
    }

    const groups: ModalOpcaoGroup[] = [{ key: 'ciclo', title: 'Registro', actions: ciclo }];
    groups.push({ key: 'navegacao', title: 'Navegação', actions: navegacao });
    if (perigo.length > 0) {
        groups.push({ key: 'perigo', title: 'Zona de risco', actions: perigo });
    }
    return groups;
}
