import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import BaseTermsForm from 'src/components/contract-terms-form/base-terms-form';
import { CONTRACT_TERM_TYPES } from 'src/constants';
import { ContractTermContext } from 'src/contexts/contract-term-context';
import { initialTermState } from 'src/reducers/contract-term/contract-term-reducer';

const componentInContext = (contextValues: any) => (
    <ContractTermContext.Provider value={contextValues}>
        <BaseTermsForm />
    </ContractTermContext.Provider>
);

describe('<BaseTermsForm> tests', () => {
    const render = (contextValues: any) =>
        renderInAppContext(componentInContext(contextValues));

    it('renders', () => {
        const contextValues = {
            state: initialTermState,
            dispatch: jest.fn(),
        };
        render(contextValues);
        expect(screen.getByText('Type')).toBeDefined();
    });

    it("doesn't render conditions if product is not defined", () => {
        const contextValues = {
            state: {
                ...initialTermState,
                termType: CONTRACT_TERM_TYPES.PRODUCT,
                attachments: [],
                attachmentsRelations: { labelIds: ['10'] },
            },
            dispatch: jest.fn(),
        };
        render(contextValues);

        expect(screen.getByText('Type')).toBeDefined();
        expect(screen.getByText('Label')).toBeDefined();
        expect(screen.getByTestId('productSearchTestId')).toBeDefined();
        expect(screen.queryByText('Transaction type')).toBeNull();
    });

    it("doesn't render conditions if track is not defined", () => {
        const contextValues = {
            state: {
                ...initialTermState,
                termType: CONTRACT_TERM_TYPES.TRACK,
                attachments: [],
                attachmentsRelations: { labelIds: ['10'] },
            },
            dispatch: jest.fn(),
        };
        render(contextValues);

        expect(screen.getByText('Type')).toBeDefined();
        expect(screen.getByText('Label')).toBeDefined();
        expect(screen.getByTestId('trackSearchTestId')).toBeDefined();
        expect(screen.queryByText('Transaction type')).toBeNull();
    });

    it('renders list of conditions when attachments are present', () => {
        const state = {
            ...initialTermState,
            termType: CONTRACT_TERM_TYPES.LABEL,
            attachments: ['10', '20'],
        };
        const contextValues = { state, dispatch: jest.fn() };
        render(contextValues);

        expect(screen.getByText('Transaction type')).toBeDefined();
        expect(screen.getByText('Service')).toBeDefined();
        expect(screen.getByText('Country')).toBeDefined();
        expect(screen.getByText("Label's share")).toBeDefined();
    });
});
