import React from 'react';
import { NetworkStatus } from '@apollo/client';
import { screen } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import { userEvent } from 'lib/test/helpers';
import * as songWriterSearch from 'src/data/queries/songWritersSearch/songWritersSearch';
import { SongWriter } from 'src/types';
import SongWriterSelector from '../songWriterSelector';

const defaultProps = {
    defaultValue: null,
    onChange: jest.fn(),
};

const renderComponent = (customProps = {}, contextProps = {}) => {
    const props = {
        ...defaultProps,
        ...customProps,
    };
    return renderInAppContext(<SongWriterSelector {...props} />, contextProps);
};

const songWriterSearchMock = () => {
    const songWriterSearchResult: SongWriter[] = [
        {
            id: 'c338d6b6-7724-48e7-b4e0-c3b2929ca3e8',
            legalName: 'Gustav Tomas Skjerdal Wood',
            professionallyKnownAs: [],
            vendor: {
                uuid: '2e0b9a4f-56a4-48da-9655-7ef54df58a7d',
                name: 'In My Mind Limited',
                id: {
                    vendorId: 34095,
                    subaccountId: 0,
                },
            },
            ipi: '00587333518',
            pro: 'PRS',
            compositions: [
                {
                    id: '1ca80338-dab6-478c-9a3e-97ca612e413b',
                    title: 'Give Me a Chance',
                },
            ],
            agreements: [
                {
                    id: '7f8d063a-d697-4683-949e-7b59aa85fff8',
                    controlled: false,
                    compositions: [
                        {
                            id: '1ca80338-dab6-478c-9a3e-97ca612e413b',
                            title: 'Give Me a Chance',
                        },
                    ],
                    publisher: null,
                },
                {
                    id: '208c15a7-cb95-43ff-9734-afb2b7bc5fec',
                    controlled: true,
                    compositions: [],
                    publisher: null,
                },
            ],
        },
        {
            id: '12e708f7-4314-4528-88b0-81d16f76d574',
            legalName: 'Mohamed Ait Aadi',
            professionallyKnownAs: [],
            vendor: {
                uuid: '4f8a444f-5854-4c15-b30b-afe6029cea8c',
                name: 'Gooise Music Group E.M.',
                id: {
                    vendorId: 32699,
                    subaccountId: 0,
                },
            },
            ipi: '01017258580',
            pro: '',
            compositions: [
                {
                    id: 'fc2e204d-e75b-472f-8808-4e96f7ee4f8b',
                    title: 'Country Boy',
                },
            ],
            agreements: [
                {
                    id: 'e0864c53-2688-4f94-b1a5-af012c3c3c5b',
                    controlled: false,
                    compositions: [
                        {
                            id: 'fc2e204d-e75b-472f-8808-4e96f7ee4f8b',
                            title: 'Country Boy',
                        },
                    ],
                    publisher: null,
                },
            ],
        },
        {
            id: 'db30e904-baca-45b0-88bc-8668bbad8c35',
            legalName: 'Steven Catanzaro',
            professionallyKnownAs: [],
            vendor: {
                uuid: 'abf384e0-cb34-47f8-a735-0326e50455bd',
                name: 'Urban Tracks Entertainment',
                id: {
                    vendorId: 19252,
                    subaccountId: 0,
                },
            },
            ipi: '00338756036',
            pro: 'ASCAP',
            compositions: [
                {
                    id: '59f801b1-0a25-478a-a3b7-aa3ff08ee594',
                    title: 'Terrifying Nature',
                },
                {
                    id: '0bc6f6ff-529e-481d-9d73-47c4f4d337c0',
                    title: 'Rupture',
                },
                {
                    id: '90bb651a-bff5-4631-b85a-a1286ad0a7bf',
                    title: 'You Failed',
                },
            ],
            agreements: [
                {
                    id: 'c6fe3865-f9ff-4542-ab96-1206e7fd2d18',
                    controlled: true,
                    compositions: [
                        {
                            id: '59f801b1-0a25-478a-a3b7-aa3ff08ee594',
                            title: 'Terrifying Nature',
                        },
                        {
                            id: '0bc6f6ff-529e-481d-9d73-47c4f4d337c0',
                            title: 'Rupture',
                        },
                        {
                            id: '90bb651a-bff5-4631-b85a-a1286ad0a7bf',
                            title: 'You Failed',
                        },
                    ],
                    publisher: null,
                },
            ],
        },
        {
            id: '74fc2ee5-b538-41ef-b935-9e5f2c079248',
            legalName: 'Luke Alexander Bond',
            professionallyKnownAs: [],
            vendor: {
                uuid: '7a18b187-1d53-41a5-9f06-a2de1dd67960',
                name: 'Blue Dot Studios, LLC (prev. Shotgunn Productions)',
                id: {
                    vendorId: 24000,
                    subaccountId: 0,
                },
            },
            ipi: '00665223937',
            pro: 'PRS',
            compositions: [
                {
                    id: '4fcbc5a2-7028-49d6-81be-53e64e3c3fac',
                    title: 'Our Anthem feat. Kazy Jay',
                },
            ],
            agreements: [
                {
                    id: '5567493d-e557-4903-93a3-018a093b353b',
                    controlled: false,
                    compositions: [
                        {
                            id: '4fcbc5a2-7028-49d6-81be-53e64e3c3fac',
                            title: 'Our Anthem feat. Kazy Jay',
                        },
                    ],
                    publisher: {
                        id: '8e31473a-1c6b-42b4-8e82-5b195212e687',
                        name: 'Armada Publishing',
                        ipi: '',
                        pro: '',
                    },
                },
            ],
        },
    ];

    const mock = {
        error: undefined,
        loading: false,
        data: { songWriters: songWriterSearchResult, totalCount: 4 },
        refetch: jest.fn(),
        networkStatus: NetworkStatus.ready,
    };

    jest.spyOn(songWriterSearch, 'usePublishingSongWriters').mockReturnValue(
        mock
    );
};

beforeEach(() => {
    songWriterSearchMock();
});

describe('SongWriterSelector', () => {
    it('renders full list of default options', async () => {
        const { container } = renderComponent();

        await userEvent.click(screen.getByText('Songwriters...'));

        expect(
            container.querySelectorAll('.Select__menu .Select__option')
        ).toHaveLength(5);
        expect(screen.getAllByText('Gustav Tomas Skjerdal Wood')).toHaveLength(
            2
        );
        expect(screen.getAllByText('Mohamed Ait Aadi')).toHaveLength(1);
        expect(screen.getAllByText('Steven Catanzaro')).toHaveLength(1);
        expect(screen.getAllByText('Luke Alexander Bond')).toHaveLength(1);
    });

    it('renders list with filtered by agreement id options', async () => {
        const { container } = renderComponent({
            excludeFilter: {
                agreementIds: [
                    '208c15a7-cb95-43ff-9734-afb2b7bc5fec',
                    '5567493d-e557-4903-93a3-018a093b353b',
                ],
            },
        });
        const element = container
            .getElementsByClassName('SongWriterSelector')
            .item(0);
        expect(element).toBeVisible();

        await userEvent.click(screen.getByText('Songwriters...'));

        expect(
            container.querySelectorAll('.Select__menu .Select__option')
        ).toHaveLength(3);
        expect(screen.getAllByText('Gustav Tomas Skjerdal Wood')).toHaveLength(
            1
        );
        expect(screen.getAllByText('Mohamed Ait Aadi')).toHaveLength(1);
        expect(screen.getAllByText('Steven Catanzaro')).toHaveLength(1);
    });
});
