import React from 'react';
import { fireEvent, screen, waitFor } from '@testing-library/react';
import { renderInAppContext } from '@theorchard/suite-testing';
import {
    DeliverSalesFiles,
    type DeliverSalesFilesPropTypes,
} from 'src/components/accounting-period/deliver-sales-files';

describe('<DeliverSalesFiles>', () => {
    const render = (props: DeliverSalesFilesPropTypes) =>
        renderInAppContext(<DeliverSalesFiles {...props} />);

    const defaultProps: DeliverSalesFilesPropTypes = {
        abacusStateId: '1',
        updatePeriodState: jest.fn().mockResolvedValue({}),
        areSalesDelivered: false,
        isButtonDisabled: false,
        setError: jest.fn(),
    };

    describe('All Sales Delivered button', () => {
        it('renders disabled based on props', () => {
            render({ ...defaultProps, isButtonDisabled: true });
            expect(screen.getByTestId('deliverSalesBtn')).toBeDisabled();
        });

        it('renders enabled based on props', () => {
            render(defaultProps);
            expect(screen.getByTestId('deliverSalesBtn')).not.toBeDisabled();
        });

        it('renders help icon when sales are not delivered', () => {
            render({ ...defaultProps, isButtonDisabled: true });
            expect(
                screen.getByTestId('deliverSalesFilesTooltip')
            ).toBeDefined();
        });

        it('renders "Mark All Sales Delivered" text when sales are not delivered', () => {
            render(defaultProps);
            expect(screen.getByText('Mark All Sales Delivered')).toBeDefined();
            expect(screen.getByTestId('deliverSalesBtn')).not.toBeDisabled();
        });

        it('renders "All Sales Delivered" text when sales are delivered', () => {
            render({ ...defaultProps, areSalesDelivered: true });
            expect(screen.getByText('All Sales Delivered')).toBeDefined();
            expect(screen.getByTestId('deliverSalesBtn')).toBeDisabled();
        });
    });

    describe('Popup modal', () => {
        it('opens when #deliverSalesBtn is clicked', async () => {
            expect.assertions(1);
            render(defaultProps);

            const deliverSalesBtn = screen.getByTestId('deliverSalesBtn');
            fireEvent.click(deliverSalesBtn);
            await waitFor(() => {
                expect(
                    screen.getByTestId('DeliverFilesModelTestid')
                ).toBeTruthy();
            });
        });

        it('updates the accounting period status when confirm button is clicked', async () => {
            render(defaultProps);

            const deliverSalesBtn = screen.getByTestId('deliverSalesBtn');
            fireEvent.click(deliverSalesBtn);

            const confirmButton = screen.getByText('Confirm');
            fireEvent.click(confirmButton);

            await waitFor(() => {
                expect(defaultProps.updatePeriodState).toHaveBeenCalled();
            });
        });
    });
});
