import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { useUpdateSapProfitCenter } from 'src/apollo/mutations/reference-sap-profit-center';
import { EditableDisplayNameProvider } from 'src/components/reference-sap-profit-center-edit/editable-display-name-context';
import { ReferenceSapProfitCentersListColumns } from 'src/components/reference-sap-profit-centers-list/reference-sap-profit-centers-list-columns';

jest.mock('src/apollo/mutations/reference-sap-profit-center', () => ({
    useUpdateSapProfitCenter: jest.fn(),
}));

describe('ReferenceSapProfitCentersListColumns', () => {
    const getCell = (name: string): React.FC<any> => {
        const column = ReferenceSapProfitCentersListColumns().find(
            col => col.name === name
        );
        if (!column?.Cell) throw new Error(`Column "${name}" has no Cell`);
        return column.Cell;
    };

    beforeEach(() => {
        (useUpdateSapProfitCenter as jest.Mock).mockReturnValue(jest.fn());
    });

    it('defines the expected columns in order', () => {
        const names = ReferenceSapProfitCentersListColumns().map(
            col => col.name
        );

        expect(names).toEqual([
            'profitCenter',
            'displayName',
            'companyCode',
            'signingEntities',
        ]);
    });

    it('renders the profit center value', () => {
        const Cell = getCell('profitCenter');

        renderInAppContext(<Cell data={{ profitCenter: 'US9682' }} />);

        expect(screen.getByText('US9682')).toBeInTheDocument();
    });

    it('renders the company code value', () => {
        const Cell = getCell('companyCode');

        renderInAppContext(<Cell data={{ companyCode: '2982' }} />);

        expect(screen.getByText('2982')).toBeInTheDocument();
    });

    it('renders an EditableDisplayNameCell for the display name column', () => {
        const Cell = getCell('displayName');

        renderInAppContext(
            <EditableDisplayNameProvider
                value={{ debouncedRefetch: jest.fn(), page: 0, pageSize: 25 }}
            >
                <Cell
                    data={{
                        displayName: 'PC US9682',
                        referenceSapProfitCenterId: '18',
                    }}
                />
            </EditableDisplayNameProvider>
        );

        expect(screen.getByTestId('read-input')).toHaveTextContent('PC US9682');
    });

    it('renders a dash when a profit center has no mapped signing entities', () => {
        const Cell = getCell('signingEntities');

        renderInAppContext(<Cell data={{ signingEntities: [] }} />);

        expect(screen.getByText('-')).toBeInTheDocument();
    });

    it('renders each mapped signing entity legal name', () => {
        const Cell = getCell('signingEntities');

        renderInAppContext(
            <Cell
                data={{
                    signingEntities: [
                        {
                            referenceSigningEntityId: '1',
                            legalName: 'AWAL Digital Limited',
                        },
                        {
                            referenceSigningEntityId: '2',
                            legalName: 'AWAL Recordings Licensing Ltd',
                        },
                    ],
                }}
            />
        );

        expect(screen.getByText('AWAL Digital Limited')).toBeInTheDocument();
        expect(
            screen.getByText('AWAL Recordings Licensing Ltd')
        ).toBeInTheDocument();
    });
});
