/* globals process */
import React from 'react';
import { createRoot } from 'react-dom/client';
import { ORCHARD_LOCALE, getEnvConfig } from 'src/constants';
import { getUser } from 'src/services';
import { LocalizationManager } from 'src/utils';
import Datadog from 'src/utils/datadog';
import allLocales from '../../locale';
import FooterApp from './app-footer';
import HeaderApp from './app-header';
import type { TranslationMap } from '@orchard/frontend-localization';
import type { SuiteAppConfig } from '@theorchard/suite-frontend';
import type { WorkstationConfig } from 'src/types';
import '../config';
import './phpApp.scss';

declare global {
    interface Window {
        initReactPhpApplications: typeof initReactPhpApplications;
    }
}

// Keeping first parameter even though unused, for backward compatibility with php's inits
export const initReactPhpApplications = async (
    _hiddenRootElement: Element | null,
    phpConfig: Partial<WorkstationConfig> = {}
) => {
    const config = getEnvConfig(phpConfig) as SuiteAppConfig;

    const locales = phpConfig.locales ?? (allLocales as TranslationMap);
    const locale =
        phpConfig.locale ?? window[ORCHARD_LOCALE] ?? process.env.LOCALE;

    LocalizationManager.registerTranslations(locales, locale);
    Datadog.init();

    // Avoid double getUser call on each app init and having ff check ability at this point
    const data = await getUser();
    const { featureFlags, user } = data;

    if (user.identity) Datadog.setUser(user.identity);

    const ReactHeaderAppComp = (
        <HeaderApp {...{ config, featureFlags, user }} />
    );

    const ReactFooterAppComp = (
        <FooterApp {...{ config, featureFlags, user }} />
    );

    const header = createRoot(document.getElementById('react_header_app')!);
    header.render(ReactHeaderAppComp);

    const footer = createRoot(document.getElementById('react_footer_app')!);
    footer.render(ReactFooterAppComp);
};

window.initReactPhpApplications = initReactPhpApplications;

export default initReactPhpApplications;
