import React from 'react';
import { fireEvent, screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { AbacusEarningsTransferTypes } from 'src/apollo/definitions/globalTypes';
import { EARNINGS_TRANSFER_MODAL_SCREENS } from 'src/apollo/type-constants/contract-earnings-transfer';
import {
    ContractEarningsTransferTypeScreen,
    ContractEarningsTransferTypeScreenProps,
} from '../contract-earnings-transfer-type-screen';

describe('<ContractEarningsTransferTypeScreen />', () => {
    const defaultProps: ContractEarningsTransferTypeScreenProps = {
        isVisible: true,
        transferType: undefined,
        onTransferTypeChange: jest.fn(),
        setModalScreen: jest.fn(),
    };

    const render = (
        props: Partial<ContractEarningsTransferTypeScreenProps> = {}
    ) =>
        renderInAppContext(
            <ContractEarningsTransferTypeScreen {...defaultProps} {...props} />
        );

    beforeEach(() => {
        jest.clearAllMocks();
    });

    describe('visibility', () => {
        it('renders nothing when isVisible is false', () => {
            render({ isVisible: false });
            expect(
                screen.queryByTestId('earningsTransferNextButton')
            ).toBeNull();
            expect(screen.queryByText('Transfer Type')).toBeNull();
        });

        it('renders the type selection screen when isVisible is true', () => {
            render();
            expect(screen.getByText('Transfer Type')).toBeDefined();
            expect(
                screen.getByTestId('earningsTransferNextButton')
            ).toBeDefined();
        });
    });

    describe('Next button', () => {
        it('is disabled when no transfer type is selected', () => {
            render({ transferType: undefined });
            const nextButton = screen.getByTestId('earningsTransferNextButton');
            expect(nextButton).toBeDisabled();
        });

        it('is enabled when a transfer type is selected', () => {
            render({ transferType: AbacusEarningsTransferTypes.TRANSFER });
            const nextButton = screen.getByTestId('earningsTransferNextButton');
            expect(nextButton).not.toBeDisabled();
        });

        it('calls setModalScreen with CONFIGURE when clicked', () => {
            const setModalScreen = jest.fn();
            render({
                transferType: AbacusEarningsTransferTypes.RECLASS,
                setModalScreen,
            });

            fireEvent.click(screen.getByTestId('earningsTransferNextButton'));

            expect(setModalScreen).toHaveBeenCalledWith(
                EARNINGS_TRANSFER_MODAL_SCREENS.CONFIGURE
            );
        });

        it('does not call setModalScreen when disabled', () => {
            const setModalScreen = jest.fn();
            render({ transferType: undefined, setModalScreen });

            fireEvent.click(screen.getByTestId('earningsTransferNextButton'));

            expect(setModalScreen).not.toHaveBeenCalled();
        });
    });

    describe('Select component', () => {
        it('renders the placeholder text', () => {
            render();
            expect(screen.getByText('Select Transfer Type')).toBeDefined();
        });

        it('excludes NR_TRANSFER and CROSS_RECOUP from options', () => {
            render();
            const selectInput = screen.getByTestId(
                'earningsTransferTypeSelect'
            );
            fireEvent.click(selectInput);
            expect(screen.queryByText('NR Transfer')).toBeNull();
            expect(screen.queryByText('Cross Recoup')).toBeNull();
        });

        it('includes valid transfer types in the options', () => {
            render();
            // Open the dropdown via the suite-components Select input value element
            const selectInput = screen.getByTestId('SuiteSelectInputValue');
            fireEvent.click(selectInput);
            expect(screen.getByText('Transfer of Income')).toBeDefined();
            expect(screen.getByText('Override')).toBeDefined();
            expect(screen.getByText('Balance Transfer')).toBeDefined();
        });
    });
});
