'use client';

import { Ban, Check, Eye, Pencil, RotateCcw, Trash2 } from 'lucide-react';
import { ICON_SIZE_MD } from '@/components/icons';
import React from 'react';
import { ModalOpcoesBase, type ModalOpcaoAction } from '@/components/ModalOpcoesBase';
import { labelCasoUsoStatus } from './casoUsoDisplay';
import type { CasoUso } from './types';

export type ModalOpcoesCasoUsoProps = {
    open: boolean;
    onClose: () => void;
    item: CasoUso | null;
    onVer: (item: CasoUso) => void;
    onEditar?: (item: CasoUso) => void;
    onAprovar?: (item: CasoUso) => void;
    onReabrir?: (item: CasoUso) => void;
    onObsoletar?: (item: CasoUso) => void;
    onExcluir?: (item: CasoUso) => void;
};

export function ModalOpcoesCasoUso({
    open,
    onClose,
    item,
    onVer,
    onEditar,
    onAprovar,
    onReabrir,
    onObsoletar,
    onExcluir,
}: ModalOpcoesCasoUsoProps) {
    if (!item) {
        return null;
    }
    const subtitle = [item.codigo, item.titulo, labelCasoUsoStatus(item.status)].filter(Boolean).join(' · ');
    const actions: ModalOpcaoAction[] = [
        {
            key: 'ver',
            label: 'Ver detalhes',
            icon: <Eye size={ICON_SIZE_MD} aria-hidden />,
            onClick: () => {
                onClose();
                onVer(item);
            },
            primary: true,
        },
    ];
    if (onEditar) {
        actions.push({
            key: 'editar',
            label: 'Editar',
            icon: <Pencil size={ICON_SIZE_MD} aria-hidden />,
            onClick: () => {
                onClose();
                onEditar(item);
            },
        });
    }
    if (onAprovar && item.status !== 'aprovado' && item.status !== 'obsoleto') {
        actions.push({
            key: 'aprovar',
            label: 'Aprovar',
            icon: <Check size={ICON_SIZE_MD} aria-hidden />,
            onClick: () => {
                onClose();
                onAprovar(item);
            },
        });
    }
    if (onReabrir && item.status === 'aprovado') {
        actions.push({
            key: 'reabrir',
            label: 'Reabrir',
            icon: <RotateCcw size={ICON_SIZE_MD} aria-hidden />,
            onClick: () => {
                onClose();
                onReabrir(item);
            },
        });
    }
    if (onObsoletar && item.status !== 'obsoleto') {
        actions.push({
            key: 'obsoletar',
            label: 'Obsoletar',
            icon: <Ban size={ICON_SIZE_MD} aria-hidden />,
            onClick: () => {
                onClose();
                onObsoletar(item);
            },
        });
    }
    if (onExcluir) {
        actions.push({
            key: 'excluir',
            label: 'Excluir',
            icon: <Trash2 size={ICON_SIZE_MD} aria-hidden />,
            danger: true,
            onClick: () => {
                onClose();
                onExcluir(item);
            },
        });
    }
    return (
        <ModalOpcoesBase
            open={open}
            onClose={onClose}
            title="Opções do caso de uso"
            subtitle={subtitle}
            actions={actions}
            width={380}
            data-testid="projeto-caso-uso-opcoes-modal"
            aria-label="Opções do caso de uso"
        />
    );
}
