import { IApp, MustardName } from '../typings';

type TMustardAppInfos = typeof window['mustardAppInfos'];

export const mustardAppInfos:TMustardAppInfos = window.mustardAppInfos = window?.mustardAppInfos ?? {
    currentReadDocMAppName: '', // 子应用临时标识
    appInstanceMap: new Map<MustardName, IApp>(), // 当前子应用的实例
    getAppProxyWindow (appName: MustardName) {
        // eslint-disable-next-line no-use-before-define
        const app = getAppFromInstance(appName);
        if(app) {
            return app.sandbox.proxyWindow;
        }
        return null;
    }
};

/**
 * 获取所以实例app.name
 * @returns IApp[]
 */
export function getAllApp () {
    return Array.from(mustardAppInfos.appInstanceMap.keys());
}

/**
 * 实例写入缓存
 * @param name 子应用标识
 * @param app 实例
 * @returns 
 */
export function addInstance (name:MustardName, app: IApp) {
    return mustardAppInfos.appInstanceMap.set(name, app);
}

/**
 * 删除实例
 * @param name 子应用标识
 */
export function removeInstance (name:MustardName) {
    mustardAppInfos.appInstanceMap.delete(name);
}

/**
 * 获取实例
 * @param name 子应用标识
 * @returns IApp
 */
export function getAppFromInstance (name:MustardName) {
    return mustardAppInfos.appInstanceMap.get(name);
}

/**
 * 子应用是否存在
 * @param name 子应用标识
 * @returns 
 */
export function appIsExist (name:MustardName) {
    return mustardAppInfos.appInstanceMap.has(name);
}


/**
 * 设置子应用标识
 * 用于后续同步步骤的消费
 * e.g document.querySelector
 * @param appName 
 */
export function setReadDocumentName (appName:MustardName) {
    return mustardAppInfos.currentReadDocMAppName = appName;
}

/**
 * 消费标识
 * @returns 
 */
export function consumption () {
    const name = mustardAppInfos.currentReadDocMAppName;
    mustardAppInfos.currentReadDocMAppName = '';
    return name;
}