import { render } from '@testing-library/react';
import TimedReleaseScheduleModal from '../timed-release-schedule-modal';
import type { TimedReleaseScheduleModalProps } from '../timed-release-schedule-modal';

describe('<TimedReleaseScheduleModal', () => {
    const onSave = jest.fn();

    const product = {
        productId: '123',
        productName: 'Vanishing Point',
        saleStartDate: new Date('2023-01-12T00:00:00.000Z'),
        releaseSchedule: {
            timed: [],
            staggered: [],
            unsupportedTimed: [],
        },
    };

    const defaultProps: TimedReleaseScheduleModalProps = {
        isOpen: true,
        setIsOpen: jest.fn(),
        deliveryStores: [],
        carvedOutStores: [],
        product,
        onSave,
    };

    const renderWrapper = (
        props: Partial<TimedReleaseScheduleModalProps> = {}
    ) => render(<TimedReleaseScheduleModal {...defaultProps} {...props} />);

    test('matches snapshot', () => {
        const { getByTestId } = renderWrapper();
        const modalComponent = getByTestId('timed-release-schedule-modal');
        expect(modalComponent).toMatchSnapshot();
    });

    describe('release schedule tables', () => {
        test('only timed release supported', () => {
            const { queryByTestId } = renderWrapper({
                product: {
                    ...product,
                    releaseSchedule: {
                        timed: [
                            {
                                deliveryStore: {
                                    id: '286',
                                    name: 'Spotify',
                                    supportsTimedRelease: true,
                                },
                                saleDateTime: '2023-01-01T00:00:00Z',
                            },
                        ],
                        staggered: [],
                        unsupportedTimed: [],
                    },
                },
            });
            const supportedTable = queryByTestId('timed-supported-table');
            const unsupportedAlert = queryByTestId('timed-unsupported-alert');
            const unsupportedTable = queryByTestId('timed-unsupported-table');
            expect(supportedTable).toBeInTheDocument();
            expect(unsupportedAlert).toBeNull();
            expect(unsupportedTable).toBeNull();
        });

        test('only timed release unsupported', () => {
            const { queryByTestId } = renderWrapper({
                product: {
                    ...product,
                    releaseSchedule: {
                        timed: [],
                        staggered: [],
                        unsupportedTimed: [
                            {
                                deliveryStore: {
                                    id: '286',
                                    name: 'Spotify',
                                    supportsTimedRelease: false,
                                },
                                saleDateTime: '2023-01-01T00:00:00Z',
                                timeOffset: '01:00',
                            },
                        ],
                    },
                },
            });
            const expectedProcessAtDate = '11:00pm GMT on 31 Dec 2022';

            const supportedTable = queryByTestId('timed-supported-table');
            const unsupportedAlert = queryByTestId('timed-unsupported-alert');
            const unsupportedTable = queryByTestId('timed-unsupported-table');
            expect(supportedTable).toBeNull();
            expect(unsupportedAlert).toBeInTheDocument();
            expect(unsupportedAlert).toHaveTextContent(expectedProcessAtDate);
            expect(unsupportedTable).toBeInTheDocument();
        });

        test('both timed release supported and unsupported', () => {
            const { queryByTestId } = renderWrapper({
                product: {
                    ...product,
                    releaseSchedule: {
                        timed: [
                            {
                                deliveryStore: {
                                    id: '286',
                                    name: 'Spotify',
                                },
                                saleDateTime: '2023-01-01T00:00:00Z',
                            },
                        ],
                        staggered: [],
                        unsupportedTimed: [
                            {
                                deliveryStore: {
                                    id: '712',
                                    name: 'Apple',
                                },
                                saleDateTime: '2023-01-01T00:00:00Z',
                                timeOffset: '00:45',
                            },
                        ],
                    },
                },
            });
            const expectedProcessAtDate = '11:15pm GMT on 31 Dec 2022';

            const supportedTable = queryByTestId('timed-supported-table');
            const unsupportedAlert = queryByTestId('timed-unsupported-alert');
            const unsupportedTable = queryByTestId('timed-unsupported-table');
            expect(supportedTable).toBeInTheDocument();
            expect(unsupportedAlert).toBeInTheDocument();
            expect(unsupportedAlert).toHaveTextContent(expectedProcessAtDate);
            expect(unsupportedTable).toBeInTheDocument();
        });
    });
});
