import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { contractDetails as mockContract } from 'src/__fixtures__/graphql/contract-details';
import {
    NrContractTermBlock,
    NrContractTermBlockPropType,
} from 'src/components/contract-detail/nr-contract-term-block';
import { CONTRACT_TERM_TYPES } from 'src/constants';
import { ContractTermContext } from 'src/contexts/contract-term-context';
import { initialTermsState } from 'src/reducers/contract-term/contract-terms-details-reducer';

const componentInContext = (
    contextValues: any,
    props: NrContractTermBlockPropType
) => (
    <ContractTermContext.Provider value={contextValues}>
        <NrContractTermBlock {...props} />
    </ContractTermContext.Provider>
);

describe('<NrContractTermBlock>', () => {
    const render = (contextValues: any, props: NrContractTermBlockPropType) =>
        renderInAppContext(componentInContext(contextValues, props));

    const state = {
        ...initialTermsState,
        stores: { 1: 'Spotify', 2: '121 Music' },
        transactionTypes: {
            1: { txnTypeCode: 'DR', txnTypeName: 'Downloaded Ringtones' },
            2: { txnTypeCode: 'EQ', txnTypeName: 'Equity' },
        },
    };

    const contextValues = { state, dispatch: jest.fn() };

    describe('renders contributors only term', () => {
        const term = mockContract.abacusContract.contractTerms.filter(
            term => term.termType === CONTRACT_TERM_TYPES.CONTRIBUTOR_SCHEDULE
        )[0] as NrContractTermBlockPropType['term'];
        const props = { term };

        it('renders tag', () => {
            render(contextValues, props);
            expect(screen.getByText('Contributor Only')).toBeDefined();
        });

        it('renders term name', () => {
            render(contextValues, props);
            expect(screen.getByText('Test term 4 (1961)')).toBeDefined();
        });

        it('renders schedule name', () => {
            render(contextValues, props);
            expect(screen.getByText('Test contributor name')).toBeDefined();
        });

        it('renders table for contributors', () => {
            render(contextValues, props);
            expect(screen.getByText('#')).toBeDefined();
            expect(screen.getByText('Term Condition Name')).toBeDefined();
            expect(screen.getByText('Transaction Type')).toBeDefined();
            expect(screen.getByText('Service')).toBeDefined();
            expect(screen.getByText('Country')).toBeDefined();
            expect(screen.getByText('Commission')).toBeDefined();

            expect(screen.getByText('1')).toBeDefined();
            expect(screen.getByText('Test condition name 4')).toBeDefined();
            expect(
                screen.getByText('DR - Downloaded Ringtones, EQ - Equity')
            ).toBeDefined();
            expect(screen.getByText('Spotify, 121 Music')).toBeDefined();
            expect(
                screen.getByText('United States of America, Italy')
            ).toBeDefined();
            expect(screen.getByText('10%')).toBeDefined();
        });
    });

    describe('renders contribution schedule term', () => {
        const term = mockContract.abacusContract.contractTerms.filter(
            term => term.termType === CONTRACT_TERM_TYPES.CONTRIBUTION_SCHEDULE
        )[0] as NrContractTermBlockPropType['term'];
        const props = { term };

        it('renders tag', () => {
            render(contextValues, props);
            expect(screen.getByText('Contribution Schedule')).toBeDefined();
        });

        it('renders term name', () => {
            render(contextValues, props);
            expect(screen.getByText('Test term 5 (1962)')).toBeDefined();
        });

        it('renders schedule name', () => {
            render(contextValues, props);
            expect(screen.getByText('Test schedule name (1)')).toBeDefined();
        });

        it('renders table for contribution schedules', () => {
            render(contextValues, props);
            expect(screen.getByText('#')).toBeDefined();
            expect(screen.getByText('Term Condition Name')).toBeDefined();
            expect(screen.getByText('Transaction Type')).toBeDefined();
            expect(screen.getByText('Service')).toBeDefined();
            expect(screen.getByText('Country')).toBeDefined();
            expect(screen.getByText('Commission')).toBeDefined();

            expect(screen.getByText('1')).toBeDefined();
            expect(screen.getByText('Test condition name 5')).toBeDefined();
            expect(
                screen.getByText('DR - Downloaded Ringtones, EQ - Equity')
            ).toBeDefined();
            expect(screen.getByText('Spotify, 121 Music')).toBeDefined();
            expect(
                screen.getByText('United States of America, Italy')
            ).toBeDefined();
            expect(screen.getByText('10%')).toBeDefined();
        });
    });
});
