import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { Route } from 'react-router-dom';
import ContractTermsDistroForm from 'src/components/contract-terms-distro/contract-terms-distro-form';
import { ContractTermContext } from 'src/contexts/contract-term-context';
import { initialTermState } from 'src/reducers/contract-term/contract-term-reducer';
import { createNewTerms } from 'src/urls/frontend-royalties';

describe('<ContractTermsDistroForm>', () => {
    const render = (contextValues: any, termType: string) => {
        renderInAppContext(
            <Route path="/contract/:contractId/terms/:termType/new">
                <ContractTermContext.Provider value={contextValues}>
                    <ContractTermsDistroForm />
                </ContractTermContext.Provider>
            </Route>,
            {
                pathname: createNewTerms(123, termType),
            }
        );
    };

    describe('Label Terms', () => {
        it('renders initial form without conditions', () => {
            const contextValues = {
                state: initialTermState,
                dispatch: jest.fn(),
            };
            render(contextValues, 'label');

            expect(screen.getByText('Term Name')).toBeDefined();
            expect(screen.getByText('Label')).toBeDefined();
            expect(screen.queryByText('Tracks')).toBeNull();
            expect(screen.queryByText('Products')).toBeNull();
            expect(screen.queryByText('Transaction type')).toBeNull();
        });

        it('renders a list of conditions when label IDs are present', () => {
            const contextValues = {
                state: {
                    ...initialTermState,
                    attachments: ['4', '20'],
                },
                dispatch: jest.fn(),
            };
            render(contextValues, 'label');

            const termId = screen.queryByTestId('termId');
            expect(termId).toBeNull();
        });
    });

    describe('Product Terms', () => {
        it('renders initial form without conditions', () => {
            const contextValues = {
                state: initialTermState,
                dispatch: jest.fn(),
            };
            render(contextValues, 'product');

            expect(screen.getByText('Term Name')).toBeDefined();
            expect(screen.getByText('Label')).toBeDefined();
            expect(screen.getByText('Products')).toBeDefined();
            expect(screen.queryByText('Tracks')).toBeNull();
            expect(screen.queryByText('Transaction type')).toBeNull();
        });

        it('renders a list of conditions when product UPCs are present', () => {
            const contextValues = {
                state: {
                    ...initialTermState,
                    attachments: ['20000000052933'],
                },
                dispatch: jest.fn(),
            };
            render(contextValues, 'product');

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

    describe('Track Terms', () => {
        it('renders initial form without conditions', () => {
            const contextValues = {
                state: initialTermState,
                dispatch: jest.fn(),
            };
            render(contextValues, 'track');

            expect(screen.getByText('Term Name')).toBeDefined();
            expect(screen.getByText('Label')).toBeDefined();
            expect(screen.getByText('Tracks')).toBeDefined();
            expect(screen.queryByText('Product')).toBeNull();
            expect(screen.queryByText('Transaction type')).toBeNull();
        });

        it('renders a list of conditions when track ISRCs are present', () => {
            const contextValues = {
                state: {
                    ...initialTermState,
                    attachments: ['QMMZ200T0180'],
                },
                dispatch: jest.fn(),
            };
            render(contextValues, 'track');

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