'use client';

import React from 'react';
import { Printer } from 'lucide-react';
import type { ModalOpcaoAction, ModalOpcaoGroup } from '@/components/ModalOpcoesBase/ModalOpcoesBase';
import { ICON_SIZE_MD } from '@/components/icons';

export const DETAIL_PRINT_ACTION_KEY = 'detail-print';

export type MergeDetailPrintActionOptions = {
    onPrint: () => void;
    label?: string;
    /** Se `false`, não injeta. Padrão: `true`. */
    enabled?: boolean;
    testId?: string;
};

function hasPrintAction(actions: ModalOpcaoAction[]): boolean {
    return actions.some(
        (a) => a.key === DETAIL_PRINT_ACTION_KEY || a.key === 'print' || a.key === 'imprimir',
    );
}

function buildPrintAction(options: MergeDetailPrintActionOptions): ModalOpcaoAction {
    return {
        key: DETAIL_PRINT_ACTION_KEY,
        label: options.label ?? 'Imprimir',
        icon: <Printer size={ICON_SIZE_MD} aria-hidden />,
        onClick: options.onPrint,
        testId: options.testId ?? 'detail-opcoes-imprimir',
    };
}

/**
 * Garante a ação "Imprimir" em `actions` (no fim, antes de ações `danger` se existirem).
 */
export function mergeDetailPrintIntoActions(
    actions: ModalOpcaoAction[],
    options: MergeDetailPrintActionOptions,
): ModalOpcaoAction[] {
    if (options.enabled === false || hasPrintAction(actions)) {
        return actions;
    }
    const printAction = buildPrintAction(options);
    const firstDangerIdx = actions.findIndex((a) => a.danger);
    if (firstDangerIdx === -1) {
        return [...actions, printAction];
    }
    return [...actions.slice(0, firstDangerIdx), printAction, ...actions.slice(firstDangerIdx)];
}

/**
 * Garante a ação "Imprimir" em `groups` (grupo "documento" ou último grupo não-danger).
 */
export function mergeDetailPrintIntoGroups(
    groups: ModalOpcaoGroup[],
    options: MergeDetailPrintActionOptions,
): ModalOpcaoGroup[] {
    if (options.enabled === false) {
        return groups;
    }
    if (groups.some((g) => hasPrintAction(g.actions))) {
        return groups;
    }
    const printAction = buildPrintAction(options);
    const docGroupIdx = groups.findIndex((g) => g.key === 'documento' || g.key === 'documentos');
    if (docGroupIdx >= 0) {
        return groups.map((g, i) =>
            i === docGroupIdx ? { ...g, actions: [...g.actions, printAction] } : g,
        );
    }
    const nonDangerIdx = [...groups]
        .map((g, i) => ({ g, i }))
        .reverse()
        .find(({ g }) => !g.actions.every((a) => a.danger))?.i;
    if (nonDangerIdx != null) {
        return groups.map((g, i) =>
            i === nonDangerIdx ? { ...g, actions: mergeDetailPrintIntoActions(g.actions, options) } : g,
        );
    }
    return [
        ...groups,
        {
            key: 'documento',
            title: 'Documento',
            actions: [printAction],
        },
    ];
}
