import { Singleton, Container, Scope, Inject } from "typescript-ioc";
import { sysServiceCenterQueryList, sysEnvQueryList, sysAppQueryList } from '../refs/register-master'
import * as schedule from 'node-schedule'
import { logger } from 'mslib'

/**
 * 系统基础配置Dao
 * @date 2021-05-31 15:37:34
 * @author 吴锋霖
 */
@Singleton
export class SysBasicCache {

    private serviceCenterMap: Map<string, any> = new Map();
    private sysAppMap: Map<string, any> = new Map();
    private envMap: Map<string, any> = new Map();


    /**
        * 示例函数fun1
        */
    async init(): Promise<any> {
        try {
            schedule.scheduleJob('0 30 * * * *', async () => {
                await this.reloadAll()
            });
            await this.reloadAll()
        } catch (e) {
            logger.error('刷新基础配置信息缓存异常', e)
        }
    }

    private async reloadAll() {
        try {
            await this.reloadServiceCenter()
        } catch (e) {
            logger.error('刷新服务中心缓存异常', e)
        }
        try {
            await this.reloadSysEnv()
        } catch (e) {
            logger.error('刷新环境设置缓存异常', e)
        }
        try {
            await this.reloadSysApp()
        } catch (e) {
            logger.error('刷新应用信息缓存异常', e)
        }
    }

    /**
     * 通过主键获取服务中心信息
     */
    getServiceCenter(id: string) {
        return this.serviceCenterMap.get(id)
    }


    /**
     * 通过环境ID获取环境配置
     */
    getSysEnv(id: string) {
        return this.envMap.get(id)
    }


    /**
     * 通过应用ID获取应用信息
     */
    getSysApp(id: string) {
        return this.sysAppMap.get(id)
    }


    /**
     * 加载服务中心
     * @param parameters
     */
    private async reloadServiceCenter() {
        const op = await sysServiceCenterQueryList({})
        if (op && op.data) {
            for (let row of op.data) {
                this.serviceCenterMap.set(row.id, row)
                
            }
        }
    }


    /**
     * 加载服务中心
     * @param parameters
     */
    private async reloadSysEnv() {
        const op = await sysEnvQueryList({})
        if (op && op.data) {
            for (let row of op.data) {
                this.envMap.set(row.id, row)
            }
        }
    }


    /**
     * 加载应用信息
     * @param parameters
     */
    private async reloadSysApp() {
        const op = await sysAppQueryList({})
        if (op && op.data) {
            for (let row of op.data) {
                this.sysAppMap.set(row.id, row)
            }
        }
    }
}

