import React from 'react';
import { screen } from '@testing-library/react';
import { createIdentity, renderInAppContext } from '@theorchard/suite-testing';
import {
    contractDetails,
    contractDetailsKNR,
} from 'src/__fixtures__/graphql/contract-details';
import ContractRenewalSection from 'src/components/contract-detail/contract-renewal-section';
import { ABACUS_PROFILE, ACCOUNT360_PROFILE } from 'src/constants';
import {
    ContractLifecycleContext,
    ContractLifecycleContextProps,
} from '../../../contexts/contract-lifecycle-context';

type Contract = ContractLifecycleContextProps['contract'];
// @ts-expect-error: ts doesn't like this mock contract but we don't need all the fields.
const contract: Contract = {
    ...contractDetails.abacusContract,
    lifecycle: null,
    lifecycleSchedules: [],
    contractFlowthrough: null,
};
describe('<ContractRenewalSection />', () => {
    const defaultContext: ContractLifecycleContextProps = {
        contract,
        isEditingContractRenewalRules: false,
        setIsEditingContractRenewalRules: jest.fn(),
        isTerminatingContract: false,
        setIsTerminatingContract: jest.fn(),
        setContractLifecycle: jest.fn(),
    };

    const renderComponent = (
        contextValues: Partial<typeof defaultContext> = {},
        identity = createIdentity({ profileType: ABACUS_PROFILE })
    ) =>
        renderInAppContext(
            <ContractLifecycleContext.Provider
                value={{
                    ...defaultContext,
                    ...contextValues,
                }}
            >
                <ContractRenewalSection />
            </ContractLifecycleContext.Provider>,
            { identity }
        );

    it('renders a warning when no renewal terms present', () => {
        renderComponent();

        expect(
            screen.getByText(/This contract has no renewals terms/)
        ).toBeInTheDocument();
    });

    it('renders add button when no renewal terms present', () => {
        renderComponent(
            { contract },
            createIdentity({ profileType: ABACUS_PROFILE })
        );

        expect(
            screen.getByTestId('renewal-rules-addButton')
        ).toBeInTheDocument();
    });

    it('hides add button for account 360 profile', () => {
        renderComponent(
            { contract },
            createIdentity({ profileType: ACCOUNT360_PROFILE })
        );

        expect(
            screen.queryByTestId('renewal-rules-addButton')
        ).not.toBeInTheDocument();
    });

    it('does not render a warning when renewal terms present', () => {
        renderComponent({
            contract: contractDetails.abacusContract as unknown as Contract,
        });

        expect(
            screen.queryByText(/This contract has no renewals terms/)
        ).not.toBeInTheDocument();
    });

    it('renders the section distro component for distribution contracts', () => {
        renderComponent({
            contract: contractDetails.abacusContract as unknown as Contract,
        });

        expect(
            screen.getByText('Current Period & Renewal Rules')
        ).toBeInTheDocument();
    });

    it('renders the section nr component for neighboring rights contracts', () => {
        renderComponent({
            contract: contractDetailsKNR.abacusContract as unknown as Contract,
        });

        expect(
            screen.getByText('Renewal & Collection Rules')
        ).toBeInTheDocument();
        expect(screen.getByText('Renewal & Collection Rules')).not.toHaveClass(
            'ContractDetail-renewal-section-editable-empty'
        );
    });

    it('adds className editable suffix', () => {
        renderComponent({
            contract: contractDetails.abacusContract as unknown as Contract,
        });

        expect(
            screen.getByText('Current Period & Renewal Rules').parentElement
        ).toHaveClass('ContractDetail-renewal-section-editable');
    });
});
