import React from 'react';
import { fireEvent, screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { contractEarningsTransferList } from 'src/__fixtures__/graphql/contract-earnings-transfers';
import * as earningsTransferQuery from 'src/apollo/queries/earnings-transfer';
import ContractEarningsTransfers from 'src/components/contract-earnings-transfer-list/contract-earnings-transfers';
import { ContractEarningsTransferListColumns } from 'src/components/contract-earnings-transfer-list/contract-earnings-transfer-list-columns';
import { getContractDetail } from 'src/urls/frontend-royalties';

jest.mock('react-router-dom', () => ({
    ...jest.requireActual('react-router-dom'),
    useParams: jest.fn().mockReturnValue({ contractId: '500004' }),
}));

describe('<ContractEarningsTransfers>', () => {
    const render = () => renderInAppContext(<ContractEarningsTransfers />);

    beforeEach(() => {
        jest.spyOn(
            earningsTransferQuery,
            'useContractEarningsTransferList'
        ).mockReturnValue({
            data: {
                abacusEarningsTransfersByContractId: {
                    items: [
                        contractEarningsTransferList
                            .abacusEarningsTransfersByContractId.items[1],
                    ],
                    totalCount: 1,
                },
            },
            loading: false,
            error: undefined,
        });
    });

    it('renders title', () => {
        render();
        expect(screen.getByText('Transfer of Earnings')).toBeDefined();
    });

    it('renders Add button', () => {
        render();
        expect(screen.getByText('Add')).toBeDefined();
    });

    it('renders transfer titles and total counts', () => {
        render();
        expect(screen.getByText('Override')).toBeDefined();
        expect(screen.getByText('Balance Transfer')).toBeDefined();
        expect(screen.getByText('Transfer of Income')).toBeDefined();

        const totalCountDivs = screen.getAllByTestId(
            'ContractEarningsTransfer-TotalCount'
        );
        totalCountDivs.forEach((totalCount: any) =>
            expect(totalCount.textContent.trim()).toMatch(/1\s+Transfer/)
        );
    });

    it('renders a table with headers for override transfers', () => {
        render();
        const overrideSection = screen.getAllByTestId(
            'ChevronDownGlyphIcon'
        )[0];
        fireEvent.click(overrideSection);

        ContractEarningsTransferListColumns().forEach((header: any) =>
            expect(screen.getAllByText(header.title)).toBeDefined()
        );
    });

    it('renders a table with headers for reclass transfers', () => {
        render();
        const reclassSection = screen.getAllByTestId('ChevronDownGlyphIcon')[1];
        fireEvent.click(reclassSection);

        ContractEarningsTransferListColumns().forEach((header: any) =>
            expect(screen.getAllByText(header.title)).toBeDefined()
        );
    });

    it('renders a table with headers for transfer of Incomes', () => {
        render();
        const transferSection = screen.getAllByTestId(
            'ChevronDownGlyphIcon'
        )[2];
        fireEvent.click(transferSection);

        ContractEarningsTransferListColumns().forEach((header: any) =>
            expect(screen.getAllByText(header.title)).toBeDefined()
        );
    });

    it('renders transfers tables', () => {
        render();

        const transferSection = screen.getAllByTestId(
            'ChevronDownGlyphIcon'
        )[2];
        fireEvent.click(transferSection);
        const bodyText: any = [];
        document
            .querySelectorAll('div.GridTable-cell')
            .forEach((body: any) => bodyText.push(body.textContent));
        expect(bodyText).toEqual([
            '3',
            'In Sequence',
            'TEST GDA - DKKAccount:TEST GDA - DKKCurrent Contract',
            'TEST GDA - EURAccount:TEST GDA - EUR',
            '78.78%',
            'Gross Revenue',
            'Active',
            'Yes',
            '2026-05-07',
            '',

            '3',
            'In Sequence',
            'TEST GDA - DKKAccount:TEST GDA - DKKCurrent Contract',
            'TEST GDA - EURAccount:TEST GDA - EUR',
            '78.78%',
            'Gross Revenue',
            'Active',
            'Yes',
            '2026-05-07',
            '',

            '3',
            'In Sequence',
            'TEST GDA - DKKAccount:TEST GDA - DKKCurrent Contract',
            'TEST GDA - EURAccount:TEST GDA - EUR',
            '78.78%',
            'Gross Revenue',
            'Active',
            'Yes',
            '2026-05-07',
            '',
        ]);
        const links = screen.getAllByRole('link');
        expect(links[0].textContent).toEqual('TEST GDA - EUR');
        expect(links[0].getAttribute('href')).toContain(
            getContractDetail('500008')
        );
    });

    it('renders edit icons', () => {
        render();
        expect(screen.getAllByTestId('EditGlyphIcon')).toBeDefined();
    });
});
