import React from 'react';
import { fireEvent, screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import {
    ReferenceSapProfitCenterDropdown,
    ReferenceSapProfitCenterDropdownPropTypes,
} from 'src/components/shared/reference-sap-profit-center-dropdown';

describe('<ReferenceSapProfitCenterDropdown> layout', () => {
    const defaultProps: ReferenceSapProfitCenterDropdownPropTypes = {
        id: 'contractType',
        onChange: jest.fn(),
        placeholder: 'SAP Profit Center',
        testId: 'sapProfitCenter',
        sapProfitCenters: {
            '1': [
                {
                    companyCode: 2963,
                    displayName: 'Orchard Enterprises NY Inc : USO980',
                    profitCenter: 'USO980',
                    referenceSapProfitCenterId: '10',
                    __typename: 'AbacusReferenceSapProfitCenter',
                },
                {
                    companyCode: 2964,
                    displayName:
                        'Sony Music Entertainment, International : USO981',
                    profitCenter: 'USO980',
                    referenceSapProfitCenterId: '11',
                    __typename: 'AbacusReferenceSapProfitCenter',
                },
            ],
            '2': [
                {
                    companyCode: 4912,
                    displayName: 'The Orchard AS : UK0785',
                    profitCenter: 'UK0785',
                    referenceSapProfitCenterId: '15',
                    __typename: 'AbacusReferenceSapProfitCenter',
                },
            ],
        },
        signingEntityId: 1,
        value: '',
    };

    const renderComponent = (
        props: ReferenceSapProfitCenterDropdownPropTypes = defaultProps
    ) => renderInAppContext(<ReferenceSapProfitCenterDropdown {...props} />);

    it('renders with specified placeholder', () => {
        renderComponent();
        expect(screen.getByText('SAP Profit Center')).toBeDefined();
    });

    it('renders selected profit center', () => {
        const props = { ...defaultProps, value: '11' };
        renderComponent(props);
        expect(
            screen.getByText('Sony Music Entertainment, International : USO981')
        ).toBeDefined();
        expect(
            screen.queryByText('Orchard Enterprises NY Inc : USO980')
        ).toBeNull();
    });

    it('shows all profit center options', () => {
        renderComponent();

        const selectButton = screen.getByRole('button');
        fireEvent.click(selectButton);

        expect(
            screen.getByText('Sony Music Entertainment, International : USO981')
        ).toBeDefined();
        expect(
            screen.getByText('Orchard Enterprises NY Inc : USO980')
        ).toBeDefined();
    });

    it('renders disabled when specified', () => {
        renderComponent({ ...defaultProps, isDisabled: true });

        const profitCenterSelect = screen.getByTestId('SuiteSelectInput');
        expect(profitCenterSelect.className).toContain('disabled');
    });

    it('renders close/clear glyph when specified', () => {
        renderComponent({
            ...defaultProps,
            isClearable: true,
            value: '10',
        });

        expect(
            screen.getByText('Orchard Enterprises NY Inc : USO980')
        ).toBeDefined();

        const closeIcon = screen.getByTestId('ClearGlyphIcon');
        expect(closeIcon).toBeDefined();
    });

    describe('Single Option Auto-Selection', () => {
        it('automatically calls onChange with the single option when only one exists', () => {
            const onChangeMock = jest.fn();
            renderComponent({
                ...defaultProps,
                signingEntityId: '2',
                onChange: onChangeMock,
                value: '',
            });

            expect(onChangeMock).toHaveBeenCalledTimes(1);
            expect(onChangeMock).toHaveBeenCalledWith({
                value: '15',
                label: 'The Orchard AS : UK0785',
                subtitle: 4912,
            });
        });

        it('does not automatically call onChange when multiple options exist', () => {
            const onChangeMock = jest.fn();
            renderComponent({
                ...defaultProps,
                signingEntityId: '1',
                onChange: onChangeMock,
                value: '',
            });

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

        it('does not auto-select again if a value is already present', () => {
            const onChangeMock = jest.fn();
            renderComponent({
                ...defaultProps,
                signingEntityId: '2',
                onChange: onChangeMock,
                value: '15', // Already has the value selected
            });

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