import React from 'react';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { waitForLoaded } from 'lib/test/helpers';
import ViewSongWriter from 'src/components/viewSongWriter';

const pushMock = jest.fn();

jest.mock('react-router-dom', () => {
    const originalModule = jest.requireActual('react-router-dom');

    return {
        ...originalModule,
        useHistory: () => ({
            ...originalModule.useHistory(),
            push: pushMock,
        }),
    };
});

describe('<ViewSongWriter>', () => {
    const songWriterMock = {
        id: '1',
        legalName: 'Wade Warren',
        professionallyKnownAs: [],
        vendor: {
            uuid: '12-34-56',
            name: 'Test Label',
            id: {
                vendorId: 12345,
                subaccountId: 0,
            },
        },
        pro: 'ASCAP',
        ipi: '00587333518',
        compositions: [
            { id: '1', title: 'Test 1' },
            { id: '2', title: 'Test Nugget' },
            { id: '3', title: 'Testing Testing Hello' },
            { id: '4', title: 'Test 2' },
            { id: '5', title: 'Test Nugget 2' },
            { id: '6', title: 'Testing Testing Hello 2' },
        ],
        agreements: [
            {
                id: '123',
                controlled: true,
                compositions: [
                    { id: '1', title: 'Test 1' },
                    { id: '2', title: 'Test Nugget' },
                    { id: '3', title: 'Testing Testing Hello' },
                ],
                publisher: {
                    id: '4',
                    name: 'Test Pub',
                    ipi: '00587333519',
                    pro: 'ANACIM',
                },
            },
            {
                id: '345',
                controlled: false,
                compositions: [
                    { id: '4', title: 'Test 2' },
                    { id: '5', title: 'Test Nugget 2' },
                    { id: '6', title: 'Testing Testing Hello 2' },
                ],
                publisher: {
                    id: '5',
                    name: 'Test Pub 2',
                    ipi: '00587333521',
                    pro: 'BMI',
                },
            },
        ],
    };

    const renderComponent = (contextProps = {}) => {
        const props = {
            isOpen: true,
            onClose: jest.fn(),
            songWriter: songWriterMock,
        };

        return renderInAppContext(<ViewSongWriter {...props} />, contextProps);
    };

    const checkBaseFields = () => {
        expect(screen.getByText('Songwriter Info')).toBeInTheDocument();
        expect(screen.getByText('Label')).toBeInTheDocument();
        expect(
            screen.getByText(
                `${songWriterMock.vendor.name} - ${songWriterMock.vendor.id.vendorId}`
            )
        ).toBeInTheDocument();
        expect(screen.getByText('Songwriter Legal Name')).toBeInTheDocument();
        expect(screen.getByText(songWriterMock.legalName)).toBeInTheDocument();
        expect(screen.getByText("Songwriter's PRO")).toBeInTheDocument();
        expect(screen.getByText(songWriterMock.pro)).toBeInTheDocument();
        expect(screen.getByText("Songwriter's IPI")).toBeInTheDocument();
        expect(screen.getByText(songWriterMock.ipi)).toBeInTheDocument();
        expect(screen.getAllByText('Publishing Company Name')).toBeTruthy();
        expect(
            screen.getByText(songWriterMock.agreements[0].publisher.name)
        ).toBeInTheDocument();
        expect(
            screen.getByText(songWriterMock.agreements[1].publisher.name)
        ).toBeInTheDocument();
        expect(screen.getAllByText("Publishing Company's PRO")).toBeTruthy();
        expect(
            screen.getByText(songWriterMock.agreements[0].publisher.pro)
        ).toBeInTheDocument();
        expect(
            screen.getByText(songWriterMock.agreements[1].publisher.pro)
        ).toBeInTheDocument();
        expect(screen.getAllByText("Publishing Company's IPI")).toBeTruthy();
        expect(
            screen.getByText(songWriterMock.agreements[0].publisher.ipi)
        ).toBeInTheDocument();
        expect(
            screen.getByText(songWriterMock.agreements[1].publisher.ipi)
        ).toBeInTheDocument();
    };

    test('renders ViewSongWriter component', async () => {
        renderComponent();
        await waitForLoaded();
        checkBaseFields();
        expect(screen.queryByText('Controlled')).toBeFalsy();
        expect(screen.queryByText('Uncontrolled')).toBeFalsy();
    });
});
