'use client';

import { CheckCircle2, ExternalLink, RotateCcw, XCircle } from 'lucide-react';
import { ICON_SIZE_MD } from '@/components/icons';
import React, { useMemo } from 'react';
import { ModalOpcoesBase, type ModalOpcaoAction } from '@/components/ModalOpcoesBase';
import type { UatSignOffAcao, UatSignOffModulo } from './types';
import {
    getUatSignOffAcaoLabel,
    getUatSignOffAcoesDisponiveis,
    getUatSignOffStatusLabel,
} from './uatSignOffDisplay';

export type ModalOpcoesUatModuloProps = {
    open: boolean;
    onClose: () => void;
    item: UatSignOffModulo | null;
    onAcao: (modulo: UatSignOffModulo, acao: UatSignOffAcao) => void;
    onVerModulo: (modulo: UatSignOffModulo) => void;
};

export function ModalOpcoesUatModulo({
    open,
    onClose,
    item,
    onAcao,
    onVerModulo,
}: ModalOpcoesUatModuloProps) {
    const actions = useMemo((): ModalOpcaoAction[] => {
        if (!item) return [];
        const disponiveis = getUatSignOffAcoesDisponiveis(item.uat_signoff_status);
        const list: ModalOpcaoAction[] = [
            {
                key: 'ver',
                label: 'Abrir módulo',
                icon: <ExternalLink size={ICON_SIZE_MD} aria-hidden />,
                onClick: () => {
                    onClose();
                    onVerModulo(item);
                },
                primary: true,
            },
        ];
        if (disponiveis.includes('aprovar')) {
            list.push({
                key: 'aprovar',
                label: getUatSignOffAcaoLabel('aprovar'),
                icon: <CheckCircle2 size={ICON_SIZE_MD} aria-hidden />,
                onClick: () => {
                    onClose();
                    onAcao(item, 'aprovar');
                },
            });
        }
        if (disponiveis.includes('rejeitar')) {
            list.push({
                key: 'rejeitar',
                label: getUatSignOffAcaoLabel('rejeitar'),
                icon: <XCircle size={ICON_SIZE_MD} aria-hidden />,
                danger: true,
                onClick: () => {
                    onClose();
                    onAcao(item, 'rejeitar');
                },
            });
        }
        if (disponiveis.includes('reabrir')) {
            list.push({
                key: 'reabrir',
                label: getUatSignOffAcaoLabel('reabrir'),
                icon: <RotateCcw size={ICON_SIZE_MD} aria-hidden />,
                onClick: () => {
                    onClose();
                    onAcao(item, 'reabrir');
                },
            });
        }
        return list;
    }, [item, onAcao, onClose, onVerModulo]);

    if (!item) return null;

    const subtitle = [item.nome, getUatSignOffStatusLabel(item.uat_signoff_status)]
        .filter(Boolean)
        .join(' · ');

    return (
        <ModalOpcoesBase
            open={open}
            onClose={onClose}
            title="Opções do módulo"
            subtitle={subtitle}
            actions={actions}
            data-testid="projeto-uat-signoff-opcoes-linha-modal"
        />
    );
}
