import { IPSDEUIEndLogic } from '@ibiz/dynamic-model-api';
import { LogUtil } from 'ibiz-core';
import { LogicReturnType } from '../const/logic-return-type';
import { UIActionContext } from '../uiaction-context';
import { AppUILogicNodeBase } from './logic-node-base';
/**
 * 结束节点
 *
 * @export
 * @class AppUILogicEndNode
 */
export class AppUILogicEndNode extends AppUILogicNodeBase {

    constructor() {
        super();
    }

    /**
     * 执行节点
     *
     * @param {IPSDEUIEndLogic} logicNode 逻辑节点模型数据
     * @param {UIActionContext} actionContext 界面逻辑上下文
     * @memberof AppUILogicEndNode
     */
    public async executeNode(logicNode: IPSDEUIEndLogic, actionContext: UIActionContext) {
        try {
            this.handleEndNode(logicNode, actionContext);
            LogUtil.log(`已完成执行${logicNode?.name}节点，操作参数数据如下:`);
            if (actionContext.paramsMap && (actionContext.paramsMap.size > 0)) {
                for (let [key, value] of actionContext.paramsMap) {
                    LogUtil.log(`${key}:`, value.getReal());
                }
            }
            return { nextNodes: [], actionContext };
        } catch (error: any) {
            throw new Error(`逻辑节点 ${logicNode.name}${error?.message ? error?.message : '发生未知错误！'}`);
        }
    }

    /**
     * 处理结束节点
     *
     * @private
     * @param {IPSDEUIEndLogic} logicNode
     * @param {ActionContext} actionContext
     * @memberof AppUILogicEndNode
     */
    private handleEndNode(logicNode: IPSDEUIEndLogic, actionContext: UIActionContext) {
        const strReturnType: string = logicNode.returnType;
        if (Object.is(strReturnType, LogicReturnType.NONEVALUE) || Object.is(strReturnType, LogicReturnType.NULLVALUE)) {
            actionContext.setResult(null);
        } else if (Object.is(strReturnType, LogicReturnType.SRCVALUE)) {
            actionContext.setResult(logicNode.rawValue);
        } else if (Object.is(strReturnType, LogicReturnType.BREAK)) {
            actionContext.setResult(LogicReturnType.BREAK);
        } else if (Object.is(strReturnType, LogicReturnType.LOGICPARAM) || Object.is(strReturnType, LogicReturnType.LOGICPARAMFIELD)) {
            const returnParam = actionContext.getParam(logicNode.getReturnParam()?.codeName as string);
            if (Object.is(strReturnType, LogicReturnType.LOGICPARAM)) {
                actionContext.setResult(returnParam.getReal());
            } else {
                actionContext.setResult(returnParam.get(logicNode.dstFieldName));
            }
        } else {
            throw new Error(`无法识别的返回值类型${strReturnType}`);
        }
    }
}