/* eslint-disable vue/one-component-per-file */

import { defineComponent, h, isVNode } from 'vue';

import { describe, expect, it, vi } from 'vitest';

vi.mock('antdv-next', () => ({
  Button: defineComponent({
    name: 'MockButton',
    setup(_, { slots }) {
      return () => h('button', slots.default?.());
    },
  }),
  Popconfirm: defineComponent({
    name: 'MockPopconfirm',
    setup(_, { slots }) {
      return () => h('span', slots.default?.());
    },
  }),
  Space: defineComponent({
    name: 'MockSpace',
    setup(_, { slots }) {
      return () => h('div', slots.default?.());
    },
  }),
}));

describe('qqbot shared action renderer', () => {
  it('renders link buttons and preserves action props', async () => {
    const { renderQqbotActions } =
      await import('@test-source/apps/web-antdv-next/src/views/qqbot/modules/actions');
    const TestIcon = defineComponent({
      name: 'TestIcon',
      setup: () => () => h('i'),
    });
    const onEdit = vi.fn();
    const onDelete = vi.fn();

    const vnode = renderQqbotActions([
      {
        disabled: true,
        icon: TestIcon,
        key: 'edit',
        label: '编辑',
        loading: true,
        onClick: onEdit,
      },
      {
        confirmText: '确认删除吗？',
        danger: true,
        key: 'delete',
        label: '删除',
        onClick: onDelete,
      },
    ]);

    expect(isVNode(vnode)).toBe(true);
    const children = vnode.children as {
      default?: () => unknown[];
    };
    const actionNodes = children.default?.().flat() as any[];
    expect(actionNodes).toHaveLength(2);

    const editButton = actionNodes[0].children[0];
    expect(editButton.props).toMatchObject({
      disabled: true,
      loading: true,
      size: 'small',
      type: 'link',
    });
    expect(isVNode(editButton.props.icon)).toBe(true);
    expect(editButton.props.onClick).toBe(onEdit);

    const deleteConfirm = actionNodes[1];
    expect(deleteConfirm.props.title).toBe('确认删除吗？');
    expect(deleteConfirm.props.onConfirm).toBe(onDelete);

    const confirmSlots = deleteConfirm.children as {
      default?: () => unknown;
    };
    const deleteButton = confirmSlots.default?.() as any;
    expect(deleteButton.props.danger).toBe(true);
    expect(deleteButton.props.onClick).toBeUndefined();
  });
});
