import React from 'react';
import { fireEvent, render } from '@testing-library/react';
import { TestData } from 'lib/test-utils/table';
import { GridTable } from '../../../base/table';
import { TableExtensions } from '../../../base/tableExtensions';
import { TableProps } from '../../../base/types';
import { TableBulkActionsExtension } from '../tableBulkActionsExtension';

TableExtensions.addExtension(TableBulkActionsExtension);

describe('TableBulkActionsExtension', () => {
    const data: TestData[] = [
        { name: 'test1', value: 2 },
        { name: 'test2', value: 1 },
    ];

    const renderTable = (props: Partial<TableProps<TestData>> = {}) =>
        render(<GridTable data={data} {...props} />);

    describe('does not render if isEnabled condition is not met', () => {
        test('missing rowBulkActions itself', () => {
            const { queryByTestId } = renderTable();

            expect(queryByTestId('TableBulkActions')).not.toBeInTheDocument();
        });

        test('missing selectedRowKeys', () => {
            const { queryByTestId } = renderTable({
                rowBulkActions: {
                    edit: {
                        icon: 'edit',
                        onClick: () => {
                            // Empty func for testing
                        },
                    },
                },
            });

            expect(queryByTestId('TableBulkActions')).not.toBeInTheDocument();
        });
    });

    describe('with required props to render', () => {
        test('renders bulk action buttons in header', () => {
            const { getByTestId } = renderTable({
                rowKey: 'name',
                rowBulkActions: {
                    test: () => {
                        // Empty func for testing
                    },
                },
                selectedRowKeys: ['test1'],
            });

            expect(getByTestId('TableBulkActions')).toBeInTheDocument();
        });

        test('renders edit action button', () => {
            const onClick = vi.fn();

            const { getByTestId } = renderTable({
                rowKey: 'name',
                rowBulkActions: { edit: { icon: 'edit', onClick } },
                selectedRowKeys: ['test1'],
            });

            const element = getByTestId('EditGlyphIcon');
            fireEvent.click(element);

            expect(element).toBeInTheDocument();
            expect(onClick).toHaveBeenCalledTimes(1);
        });
    });
});
