/**
 * 实体处理逻辑上下文参数对象
 *
 * @export
 * @class ActionContext
 */
export class ActionContext {

    /**
     * 实体行为服务context
     *
     * @type {IContext}
     * @memberof ActionContext
     */
    public appContext: any;

    /**
     * 逻辑处理参数集合
     *
     * @type {Map<string, any>}
     * @memberof ActionContext
     */
    public paramsMap: Map<string, any> = new Map();

    /**
     * 默认逻辑处理参数名称
     *
     * @type {string}
     * @memberof ActionContext
     */
    private defaultParamName: string = '';

    /**
     * 默认逻辑处理参数
     *
     * @readonly
     * @memberof ActionContext
     */
    get defaultParam() {
        return this.paramsMap.get(this.defaultParamName);
    }

    /**
     * 上一次调用返回参数名称
     *
     * @type {string}
     * @memberof ActionContext
     */
    private lastReturnParamName: string = '';

    /**
     * 绑定上一次调用返回参数
     *
     * @readonly
     * @memberof ActionContext
     */
    public bindLastReturnParam(value: any) {
        const lastReturnParam = this.paramsMap.get(this.lastReturnParamName);
        if (lastReturnParam) {
            lastReturnParam.bind(value);
        }
    }

    /**
     * 应用上下文参数名称
     *
     * @type {string}
     * @memberof ActionContext
     */
    public appContextParamName: string = '';

    /**
     * 上下文数据(包括应用上下文和逻辑局部上下文参数)
     *
     * @readonly
     * @memberof UIActionContext
     */
    get context() {
        const navContextParam = this.paramsMap.get(this.appContextParamName);
        if (navContextParam) {
            return navContextParam.getReal();
        } else {
            return this.appContext;
        }
    }

    /**
     * 获取逻辑处理参数
     *
     * @param {string} key 逻辑处理参数的codeName
     * @memberof ActionContext
     */
    public getParam(key: string) {
        return this.paramsMap.get(key);
    }

    /**
     * 返回结果
     *
     * @type {*}
     * @memberof ActionContext
     */
    private result: any;

    /**
     * 设置返回结果
     *
     * @param {*} opts
     * @memberof ActionContext
     */
    public setResult(opts: any) {
        this.result = opts;
    }

    /**
     * 获取返回结果
     *
     * @return {*} 
     * @memberof ActionContext
     */
    public getResult() {
        return this.result;
    }

    /**
     * 构造函数
     * 
     * @param {IPSAppDELogic} logic 处理逻辑模型对象
     * @param {IContext} context 实体行为服务context
     * @param {IParams} params 实体行为服务data
     * @memberof ActionContext
     */
    constructor(logicParams: any[], context: any, params: any) {
        this.appContext = context;
        // 初始化逻辑处理参数

        // if (logic.getPSDELogicParams() && (logic.getPSDELogicParams() as IPSDELogicParam[]).length > 0) {
        //     for (let logicParam of (logic.getPSDELogicParams() as IPSDELogicParam[])) {
        //         const initValue = logicParam.default ? params : undefined;
        //         const logicParamInstance = AppDeLogicParamService.getLogicParamInstance(this, logicParam, initValue);
        //         this.paramsMap.set(logicParam.codeName, logicParamInstance);
        //         if (logicParam.default) this.defaultParamName = logicParam.codeName;
        //         if (logicParam.lastReturnParam) this.lastReturnParamName = logicParam.codeName;
        //         if(logicParam.appContextParam) this.appContextParamName = logicParam.codeName;
        //     }
        // }
    }
}