import React from 'react';
import { screen, waitFor } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import * as vendorQuery from 'src/apollo/queries/vendor-search';
import { ContractTermLabelName } from 'src/components/contract-detail/contract-term-label-name';
import { ABACUS_PROFILE, USER_FEATURES } from 'src/constants';

const createMockOrchardLabel = (name: string, vendorId: string | number) => ({
    orchardLabel: {
        __typename: 'Vendor' as const,
        name: name,
        id: { __typename: 'LabelId' as const, vendorId: Number(vendorId) },
    },
});

describe('<ContractTermLabelName>', () => {
    const labelId = '1';

    const mockLabelData = createMockOrchardLabel('Some Name', labelId);
    const mockEmptyNameLabelData = createMockOrchardLabel('', labelId);

    const baseMockIdentity = {
        profileType: ABACUS_PROFILE,
        features: {
            [USER_FEATURES.ABACUS_CREATE_TERMS_WITH_NO_TRACKS_AND_PRODUCTS]: false,
        },
    };

    afterEach(() => {
        jest.restoreAllMocks();
    });

    beforeEach(() => {
        jest.spyOn(vendorQuery, 'useVendorById').mockReturnValue({
            data: mockLabelData,
            getVendorById: jest.fn().mockResolvedValue({ data: mockLabelData }),
            loading: false,
        });
    });

    const props = { labelId };

    const render = (contextIdentityOverride: any = {}) => {
        const finalIdentity = {
            ...baseMockIdentity,
            ...contextIdentityOverride,
        };
        return renderInAppContext(<ContractTermLabelName {...props} />, {
            identity: finalIdentity,
        });
    };

    it('renders', async () => {
        const { container } = render();
        await screen.findByText(`Some Name (${labelId})`);
        expect(container).toBeDefined();
    });

    it('renders label name', async () => {
        render();
        expect(
            await screen.findByText(`Some Name (${labelId})`)
        ).toBeInTheDocument();
    });

    it('renders no account listed when label name is empty and flag is on', async () => {
        jest.spyOn(vendorQuery, 'useVendorById').mockReturnValue({
            data: mockEmptyNameLabelData,
            getVendorById: jest
                .fn()
                .mockResolvedValue({ data: mockEmptyNameLabelData }),
            loading: false,
        });

        const contextIdentityOverride = {
            features: {
                [USER_FEATURES.ABACUS_CREATE_TERMS_WITH_NO_TRACKS_AND_PRODUCTS]: true,
            },
        };

        render(contextIdentityOverride);

        await waitFor(() => {
            expect(screen.getByText('No Account Listed')).toBeInTheDocument();
        });
    });
});
