import React from 'react';
import { render } from '@testing-library/react';
import { AppConfigContext, SuiteAppProviders } from '@theorchard/suite-frontend';
import { MemoryRouter } from 'react-router-dom';
import { createAppConfig, createAuthClient, createIdentity } from './mocks';
import type { RenderResult, RenderOptions } from '@testing-library/react';
import type { SuiteInitContext } from '@theorchard/suite-frontend';

type RenderContextOptions = Omit<RenderOptions, 'queries'>;

export const renderInAppContext = (
    component: React.ReactElement,
    {
        pathname = '/',
        search,
        initialIndex,
        options,
        ...data
    }: Partial<SuiteInitContext> & {
        pathname?: string;
        search?: string;
        initialIndex?: number;
        options?: RenderContextOptions;
    } = {}
): RenderResult => {
    const config = createAppConfig(data.config);

    const ContextTree: React.FC<{ children?: React.ReactNode }> = ({ children }) => (
        <AppConfigContext.Provider value={{ config }}>
            <SuiteAppProviders
                context={{
                    ...data,
                    identity: createIdentity(data.identity),
                    authClient: createAuthClient(data.authClient),
                    config,
                }}
            >
                <MemoryRouter initialEntries={[{ pathname, search }]} initialIndex={initialIndex}>
                    {children}
                </MemoryRouter>
            </SuiteAppProviders>
        </AppConfigContext.Provider>
    );

    const renderResult = render(<ContextTree>{component}</ContextTree>, options);

    return {
        ...renderResult,
        rerender: (comp: React.ReactNode) => {
            renderResult.rerender(<ContextTree>{comp}</ContextTree>);
        },
    };
};
