import React from 'react';
import { render, fireEvent, waitFor } from '@testing-library/react';
import { ENV_PROD } from '@theorchard/constants';
import { SuiteError } from '../../../types';
import { VerifyEmailButton } from '../verifyEmailButton';

const fetchMock = vi.fn();
global.fetch = fetchMock;

describe('<VerifyEmailButton>', () => {
    const message = 'error|auth0|some-id';
    const request = 'eyJ0eXBlIjoidmVyaWZ5IiwiYXV0aDBfaWQiOiJzb21lLWlkIn0=';

    const renderComponent = (environment: string, error: Partial<SuiteError>) =>
        render(
            <VerifyEmailButton
                environment={environment}
                error={{
                    name: 'name',
                    message: 'message',
                    ...error,
                }}
            />
        );

    beforeEach(() => {
        fetchMock.mockClear();
    });

    test('renders button', () => {
        const { getByText } = renderComponent(ENV_PROD, { message });
        const btn = getByText('Resend verify email');
        expect(btn).toBeVisible();
        expect(btn).not.toBeDisabled();
    });

    test('hides button if auth0 id is not found', () => {
        const { queryByText } = renderComponent(ENV_PROD, {});
        expect(queryByText('Resend verify email')).toBeNull();
    });

    test('sends request when clicked', async () => {
        const { getByText } = renderComponent(ENV_PROD, { message });
        const btn = getByText('Resend verify email');

        fireEvent.click(btn);

        await waitFor(() => {
            expect(fetchMock).toHaveBeenCalledWith(
                `https://workstation.theorchard.com/login/resend-email?request=${request}`,
                { mode: 'no-cors' }
            );
        });

        expect(btn).toBeDisabled();
        expect(getByText('Email sent')).toBeVisible();
    });

    test('sends request to qa when environment is not prod', async () => {
        const { getByText } = renderComponent('whatever', { message });

        fireEvent.click(getByText('Resend verify email'));

        await waitFor(() => {
            expect(fetchMock).toHaveBeenCalledWith(
                `https://workstation.qaorch.com/login/resend-email?request=${request}`,
                { mode: 'no-cors' }
            );
        });
    });
});
