import React from 'react';
import { fireEvent, screen, waitFor } from '@testing-library/react';
import { createIdentity, renderInAppContext } from '@theorchard/suite-testing';
import * as salesFileMutation from 'src/apollo/mutations/sales-file';
import {
    AddEligibleSalesForm,
    type AddEligibleSalesFormPropTypes,
} from 'src/components/accounting-period/add-eligible-sales-form';
import * as validations from 'src/utils/form-validations';
import { ABACUS_PROFILE } from 'src/constants';
import * as dagRunTimesQuery from 'src/apollo/queries/dag-run-times';

describe('<AddEligibleSalesForm>', () => {
    const addSalesFile = jest.fn().mockResolvedValue({});
    const defaultProps: AddEligibleSalesFormPropTypes = {
        periodId: '123',
        refetchDetailsOnSalesAdd: jest.fn().mockResolvedValue({}),
    };

    const render = (props: AddEligibleSalesFormPropTypes) =>
        renderInAppContext(<AddEligibleSalesForm {...props} />, {
            identity: createIdentity({
                profileType: ABACUS_PROFILE,
                id: 'Jane User',
            }),
        });

    let saveRequestSpy;

    beforeEach(() => {
        saveRequestSpy = jest
            .spyOn(salesFileMutation, 'useCreateSalesFile')
            .mockReturnValue(addSalesFile);
    });

    afterEach(jest.restoreAllMocks);

    it('renders the File Display Name input field', () => {
        render(defaultProps);
        expect(screen.getByPlaceholderText('File Display Name')).toBeDefined();
    });

    it('renders the GET ELIGIBLE SALES button', () => {
        render(defaultProps);
        expect(screen.getByText('GET ELIGIBLE SALES')).toBeDefined();
    });

    it('shows validation messages when input is blank', () => {
        render(defaultProps);
        const validationSpy = jest
            .spyOn(validations, 'getEligibleSalesValidation')
            .mockReturnValue({
                fileDisplayName: 'File Display Name cannot be blank',
            });

        const getEligibleSalesButton = screen.getByTestId(
            'getEligibleSalesBtn'
        );
        fireEvent.click(getEligibleSalesButton);

        expect(validationSpy).toHaveBeenCalled();
        expect(
            screen.getByText('File Display Name cannot be blank')
        ).toBeDefined();
    });

    it('saves the sales file and clears the form on successful save', async () => {
        render(defaultProps);
        jest.spyOn(validations, 'getEligibleSalesValidation').mockReturnValue(
            {}
        );

        const getEligibleSalesButton = screen.getByTestId(
            'getEligibleSalesBtn'
        );

        fireEvent.click(getEligibleSalesButton);

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

    it('shows the getting sales progress indicator while saving', async () => {
        jest.spyOn(validations, 'getEligibleSalesValidation').mockReturnValue(
            {}
        );
        const dagQuery = jest
            .spyOn(dagRunTimesQuery, 'useDagRunTimesQuery')
            .mockReturnValue({
                data: {
                    abacusDagRunTimes: {
                        averageRunTimeSeconds: 12,
                        maxRunTimeSeconds: 90,
                    },
                },
            });
        render(defaultProps);

        const getEligibleSalesButton = screen.getByTestId(
            'getEligibleSalesBtn'
        );
        fireEvent.click(getEligibleSalesButton);
        await waitFor(() => {
            expect(dagQuery).toHaveBeenCalledWith('SALES_GET_ELIGIBLE');
            expect(
                screen.getByTestId('RunTimerWithStatus')
            ).toBeInTheDocument();
        });
    });
});
