"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.OakBrowserRouter = OakBrowserRouter;
exports.default = initialize;
const tslib_1 = require("tslib");
const react_1 = tslib_1.__importStar(require("react"));
const client_1 = tslib_1.__importDefault(require("react-dom/client"));
const react_router_dom_1 = require("react-router-dom");
const antd_1 = require("antd");
const antd_mobile_1 = require("antd-mobile");
const cssinjs_1 = require("@ant-design/cssinjs");
const responsive_1 = require("../responsive");
const features_1 = require("../features");
const AppError_1 = tslib_1.__importDefault(require("./AppError"));
const AppContainer_1 = tslib_1.__importDefault(require("./AppContainer"));
const AppRouter_1 = tslib_1.__importDefault(require("./AppRouter"));
const RouteAccessBoundary_1 = require("../RouteAccessBoundary");
const NamespaceConfigProvider_1 = require("../NamespaceConfigProvider");
const theme_1 = require("../theme");
const iconLibrary_1 = require("../../../utils/iconLibrary");
// import { AliveScope, autoFixContext } from 'react-activation'
const dayjs_1 = tslib_1.__importDefault(require("dayjs"));
require("dayjs/esm/locale/zh-cn");
const zh_CN_1 = tslib_1.__importDefault(require("antd/es/locale/zh_CN"));
const en_US_1 = tslib_1.__importDefault(require("antd/es/locale/en_US"));
const zh_CN_2 = tslib_1.__importDefault(require("antd-mobile/es/locales/zh-CN"));
const en_US_2 = tslib_1.__importDefault(require("antd-mobile/es/locales/en-US"));
function NavigatorRouterBridge(props) {
    const { features, children } = props;
    const navigate = (0, react_router_dom_1.useNavigate)();
    const location = (0, react_router_dom_1.useLocation)();
    (0, react_1.useLayoutEffect)(() => {
        features.navigator.setRouter(navigate, location);
    }, [features, navigate, location]);
    return children;
}
function OakBrowserRouter(props) {
    const { features, children, breakpoints } = props;
    return <react_router_dom_1.BrowserRouter>
        <NavigatorRouterBridge features={features}>
            <responsive_1.ResponsiveProvider breakpoints={breakpoints}>
                <features_1.FeaturesProvider features={features}>
                    {children}
                </features_1.FeaturesProvider>
            </responsive_1.ResponsiveProvider>
        </NavigatorRouterBridge>
    </react_router_dom_1.BrowserRouter>;
}
function normalizeInitializeOptions(localesOrOptions, error, format) {
    if (localesOrOptions &&
        (Object.prototype.hasOwnProperty.call(localesOrOptions, 'locales') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'namespaceConfigs') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'error') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'format') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'renderError') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'renderLoading') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'oakTheme') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'iconLibraries') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'antdConfigProviderProps') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'antdMobileConfigProviderProps') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'renderProvider') ||
            Object.prototype.hasOwnProperty.call(localesOrOptions, 'messageHandler'))) {
        return localesOrOptions;
    }
    return {
        locales: localesOrOptions,
        error,
        format,
    };
}
function collectNamespaceIconLibraries(namespaceConfigs) {
    return Object.values(namespaceConfigs || {})
        .flatMap((config) => Array.from(config.iconLibraries || []));
}
function getCompilerIconLibraries() {
    const iconLibraries = globalThis.__OAK_FRONTEND_ICON_LIBRARIES__;
    return Array.isArray(iconLibraries) ? iconLibraries : [];
}
function ThemeShell(props) {
    const { features, appName, locale, mobileLocale, oakTheme, antdConfigProviderProps, antdMobileConfigProviderProps, renderProvider, children, } = props;
    const { locale: configLocale, theme: configTheme, ...restConfigProviderProps } = antdConfigProviderProps || {};
    const { locale: mobileConfigLocale, ...restMobileConfigProviderProps } = antdMobileConfigProviderProps || {};
    const [featureOakTheme, setFeatureOakTheme] = (0, react_1.useState)(() => features.theme.getOakTheme());
    (0, react_1.useEffect)(() => {
        return features.theme.subscribe(() => {
            setFeatureOakTheme(features.theme.getOakTheme());
        });
    }, [features]);
    const mergedOakTheme = (0, react_1.useMemo)(() => (0, theme_1.mergeOakTheme)(oakTheme, featureOakTheme), [oakTheme, featureOakTheme]);
    const mergedAntdTheme = (0, react_1.useMemo)(() => {
        const oakToken = mergedOakTheme.token || {};
        const rawAntdTokenFromOak = {
            colorPrimary: oakToken.colorPrimary,
            colorLink: oakToken.colorLink,
            colorError: oakToken.colorError,
            colorWarning: oakToken.colorWarning,
            colorSuccess: oakToken.colorSuccess,
            colorInfo: oakToken.colorInfo,
            colorBgBase: oakToken.colorBgPage,
            colorBgContainer: oakToken.colorBgContainer,
            colorTextBase: oakToken.colorText,
            colorText: oakToken.colorText,
            colorTextSecondary: oakToken.colorTextSecondary,
            colorTextPlaceholder: oakToken.colorTextPlaceholder,
            colorTextDisabled: oakToken.colorTextDisabled,
            colorBorder: oakToken.colorBorder,
            borderRadius: typeof oakToken.borderRadius === 'number'
                ? oakToken.borderRadius
                : undefined,
            borderRadiusSM: typeof oakToken.borderRadiusSmall === 'number'
                ? oakToken.borderRadiusSmall
                : undefined,
            borderRadiusLG: typeof oakToken.borderRadiusLarge === 'number'
                ? oakToken.borderRadiusLarge
                : undefined,
        };
        const antdTokenFromOak = Object.entries(rawAntdTokenFromOak).reduce((token, [key, value]) => {
            if (value !== undefined) {
                token[key] = value;
            }
            return token;
        }, {});
        const hasAntdTokenFromOak = Object.keys(antdTokenFromOak || {}).length > 0;
        if (!hasAntdTokenFromOak && !configTheme) {
            return configTheme;
        }
        return {
            ...configTheme,
            token: {
                ...antdTokenFromOak,
                ...(configTheme?.token || {}),
            },
        };
    }, [configTheme, mergedOakTheme]);
    const content = (<antd_1.ConfigProvider {...restConfigProviderProps} locale={configLocale ?? locale} theme={mergedAntdTheme}>
            <cssinjs_1.StyleProvider hashPriority="high" transformers={[cssinjs_1.legacyLogicalPropertiesTransformer]}>
                <antd_mobile_1.ConfigProvider {...restMobileConfigProviderProps} locale={mobileConfigLocale ?? mobileLocale}>
                    <theme_1.OakThemeProvider theme={mergedOakTheme}>
                        {children}
                    </theme_1.OakThemeProvider>
                </antd_mobile_1.ConfigProvider>
            </cssinjs_1.StyleProvider>
        </antd_1.ConfigProvider>);
    return (<>
            {renderProvider
            ? renderProvider({
                features,
                appName,
                children: content,
            })
            : content}
        </>);
}
function initialize(features, appName, routers, locales, error, format) {
    const options = normalizeInitializeOptions(locales, error, format);
    const { locales: locales2, namespaceConfigs, error: error2, format: format2, renderError, renderLoading, oakTheme, antdConfigProviderProps, antdMobileConfigProviderProps, iconLibraries, renderProvider, messageHandler, } = options;
    (0, iconLibrary_1.registerOakIconLibraries)([
        ...getCompilerIconLibraries(),
        ...(iconLibraries || []),
        ...collectNamespaceIconLibraries(namespaceConfigs),
    ]);
    const { language } = window.navigator;
    const isZhCN = ['zh-CN', 'zh_CN'].includes(language);
    dayjs_1.default.locale(locales2?.dayJs || (isZhCN ? 'zh-cn' : 'en-us'));
    const antdLocale = locales2?.antd || (isZhCN ? zh_CN_1.default : en_US_1.default);
    const antdMobileLocale = locales2?.antdMobile || (isZhCN ? zh_CN_2.default : en_US_2.default);
    const defaultError = error2 ? (<AppError_1.default error={error2} features={features}/>) : null;
    const Main = error2 ? (<OakBrowserRouter features={features}>
            <RouteAccessBoundary_1.RouteAccessProvider routers={routers}>
                <NamespaceConfigProvider_1.NamespaceConfigProvider configs={namespaceConfigs}>
                    <ThemeShell features={features} appName={appName} locale={antdLocale} mobileLocale={antdMobileLocale} oakTheme={oakTheme} antdConfigProviderProps={antdConfigProviderProps} antdMobileConfigProviderProps={antdMobileConfigProviderProps} renderProvider={renderProvider}>
                        {renderError
            ? renderError({
                error: error2,
                features,
                defaultError,
            })
            : defaultError}
                    </ThemeShell>
                </NamespaceConfigProvider_1.NamespaceConfigProvider>
            </RouteAccessBoundary_1.RouteAccessProvider>
        </OakBrowserRouter>) : (<OakBrowserRouter features={features}>
            <RouteAccessBoundary_1.RouteAccessProvider routers={routers}>
                <NamespaceConfigProvider_1.NamespaceConfigProvider configs={namespaceConfigs}>
                    <ThemeShell features={features} appName={appName} locale={antdLocale} mobileLocale={antdMobileLocale} oakTheme={oakTheme} antdConfigProviderProps={antdConfigProviderProps} antdMobileConfigProviderProps={antdMobileConfigProviderProps} renderProvider={renderProvider}>
                        <AppContainer_1.default messageHandler={messageHandler}>
                            <AppRouter_1.default features={features} appName={appName} routers={routers} renderLoading={renderLoading}/>
                        </AppContainer_1.default>
                    </ThemeShell>
                </NamespaceConfigProvider_1.NamespaceConfigProvider>
            </RouteAccessBoundary_1.RouteAccessProvider>
        </OakBrowserRouter>);
    if (format2) {
        return Main;
    }
    else {
        const root = client_1.default.createRoot(document.getElementById('root'));
        root.render(Main);
    }
}
