
import { VNode } from 'vue';
import { DynamicInstanceConfig, IPSAppDataEntity, IPSAppDERedirectView, IPSAppDEView, IPSAppView, IPSAppViewRef, IPSNavigateContext, IPSNavigateParam } from '@ibizstudio-ex/runtime';
import { GetModelService, LogUtil, ModelTool, RedirectViewInterface, StringUtil, Util, ViewTool } from '@ibizstudio-ex/runtime';
import { MainViewBase } from "./mainview-base";

/**
 * 实体数据重定向视图基类
 *
 * @export
 * @class DeRedirectViewBase
 * @extends {MDViewBase}
 */
export class DeRedirectViewBase extends MainViewBase implements RedirectViewInterface {

  /**
   * 视图实例
   *
   * @memberof DeRedirectViewBase
   */
  declare viewInstance: IPSAppDERedirectView;

  /**
   * 视图是否被导航部件引用
   *
   * @memberof DeRedirectViewBase
   */
  viewUseByExpBar: boolean = false;

  /**
   * 视图内容节点
   *
   * @memberof DeRedirectViewBase
   */
  viewNodeContent?: VNode;

  /**
   * 是否首次加载
   *
   * @memberof DeRedirectViewBase
   */
  isFirstLoad: boolean = true;

  /**
   * 监听静态参数变化
   *
   * @memberof DeRedirectViewBase
   */
  onStaticPropsChange(newVal: any, oldVal: any) {
    super.onStaticPropsChange(newVal, oldVal);
    this.viewUseByExpBar = newVal.viewUseByExpBar ? true : false;
  }

  /**
   * 监听动态参数变化
   *
   * @memberof DeRedirectViewBase
   */
  onDynamicPropsChange(newVal: any, oldVal: any) {
    super.onDynamicPropsChange(newVal, oldVal);
    if (!this.isFirstLoad && this.viewUseByExpBar) {
      this.executeRedirectLogic();
    }
    this.isFirstLoad = false;
  }

  /**
    * 初始化视图实例
    *
    * @param opts
    * @memberof DeRedirectViewBase
    */
  async viewModelInit() {
    this.viewInstance = (this.staticProps.modeldata) as IPSAppDERedirectView;
    await super.viewModelInit();
    this.executeRedirectLogic();
  }

  /**
    * 执行重定向逻辑
    *
    * @memberof DeRedirectViewBase
    */
  async executeRedirectLogic() {
    let tempContext: any = Util.deepCopy(this.context);
    let tempViewParams: any = Util.deepCopy(this.viewparams);
    let localParams: any = {};
    if (this.viewparams && this.viewparams.srfwf) {
      localParams = { srfwf: this.viewparams.srfwf.toLowerCase() };
    } else {
      const appDataEntity = this.viewInstance.getPSAppDataEntity() as IPSAppDataEntity;
      localParams = { enableWorkflow: this.viewInstance?.enableWorkflow && appDataEntity?.enableWFActions };
    }
    let dataSetParams: any = {};
    if (this.viewUseByExpBar && this.viewInstance.enableCustomGetDataAction) {
      const action = this.viewInstance.getGetDataPSAppDEAction();
      if (action) {
        Object.assign(dataSetParams, {
          action: action.codeName
        });
      }
    }
    this.appUIService.getRDAppView(this.context, this.context[this.appDeCodeName.toLowerCase()], localParams, dataSetParams).then(async (result: any) => {
      if (!result) {
        return;
      }
      if(result.isError){
          const data = result?.response?.data;
          this.$throw(data?.messages?data.messages:this.$t('components.500.errortext1'));
          return;
      }
      let targetOpenViewRef: IPSAppViewRef | null | undefined = null;
      if (this.viewUseByExpBar) {
        //  重定向视图识别属性
        const typeFieldCodeName = this.viewInstance.getTypePSAppDEField?.()?.codeName;
        if (typeFieldCodeName && result.srfdata && result.srfdata[typeFieldCodeName.toLowerCase()]) {
          targetOpenViewRef = (this.viewInstance.getRedirectPSAppViewRefs() as IPSAppViewRef[]).find((item: any) => {
            return item.name.toLowerCase() === result.srfdata[typeFieldCodeName.toLowerCase()].toLowerCase();
          })
        }
      } else {
        if (this.viewparams && this.viewparams.srfwf) {
          targetOpenViewRef = (this.viewInstance.getRedirectPSAppViewRefs() as IPSAppViewRef[]).find((item: any) => {
            return item.name === `${result.param.split(":")[0]}:${this.viewparams.srfwf.toUpperCase()}`;
          })
        }
        if (!targetOpenViewRef) {
          targetOpenViewRef = (this.viewInstance.getRedirectPSAppViewRefs() as IPSAppViewRef[]).find((item: any) => {
            return item.name === result.param.split(":")[0];
          })
        }
      }
      if (!targetOpenViewRef) {
        return;
      }
      //  导航上下文
      if (
        targetOpenViewRef.getPSNavigateContexts() &&
        (targetOpenViewRef.getPSNavigateContexts() as IPSNavigateContext[]).length > 0
      ) {
          let localContextRef: any = Util.formatNavParam(targetOpenViewRef.getPSNavigateContexts(), true);
          let _context: any = Util.computedNavData(result.srfdata, tempContext, tempViewParams, localContextRef);
          //  填充字符串数据
          if (_context && Object.keys(_context).length > 0) {
            for (const key of Object.keys(_context)) {
              _context[key] = StringUtil.fillStrData(_context[key], tempContext, result.srfdata);
            }
          }
          Object.assign(tempContext, _context);
      }
      //  导航视图参数
      if (
        targetOpenViewRef.getPSNavigateParams() &&
        (targetOpenViewRef.getPSNavigateParams() as IPSNavigateParam[]).length > 0
      ) {
          let localViewParamsRef: any = Util.formatNavParam(targetOpenViewRef.getPSNavigateParams(), true);
          let _viewParams: any = Util.computedNavData(result.srfdata, tempContext, tempViewParams, localViewParamsRef);
          //  填充字符串数据
          if (_viewParams && Object.keys(_viewParams).length > 0) {
            for (const key of Object.keys(_viewParams)) {
              _viewParams[key] = StringUtil.fillStrData(_viewParams[key], tempContext, result.srfdata);
            }
          }
          Object.assign(tempViewParams, _viewParams);
      }
      // 存在动态实例
      let splitArray: Array<any> = result.param.split(":");
      if (splitArray && (splitArray.length == 3)) {
        let curDynaInst: DynamicInstanceConfig = (await GetModelService({ instTag: splitArray[2], instTag2: splitArray[1] }))?.getDynaInsConfig();
        if (curDynaInst) {
          Object.assign(tempContext, { srfdynainstid: curDynaInst.id });
        }
      }
      if (result && result.hasOwnProperty('srfsandboxtag')) {
        Object.assign(tempContext, { 'srfsandboxtag': result['srfsandboxtag'] });
        Object.assign(tempViewParams, { 'srfsandboxtag': result['srfsandboxtag'] });
      }
      if (targetOpenViewRef.getRefPSAppView()) {
        let targetOpenView: IPSAppView | null = targetOpenViewRef.getRefPSAppView();
        if (!targetOpenView) {
          return;
        }
        await targetOpenView.fill(true);
        const view: any = {
          viewname: 'app-view-shell',
          height: targetOpenView.height,
          width: targetOpenView.width,
          title: targetOpenView.title
        };
        let parameters: Array<any> = [];
        if (!targetOpenView.openMode || targetOpenView.openMode == 'INDEXVIEWTAB') {
          if (targetOpenView.getPSAppDataEntity()) {
            parameters = [
              { pathName: Util.srfpluralize((targetOpenView.getPSAppDataEntity() as IPSAppDataEntity)?.codeName).toLowerCase(), parameterName: (targetOpenView.getPSAppDataEntity() as IPSAppDataEntity)?.codeName.toLowerCase() },
              { pathName: "views", parameterName: ((targetOpenView as IPSAppDEView).getPSDEViewCodeName() as string).toLowerCase() },
            ];
          } else {
            parameters = [
              { pathName: targetOpenView.codeName.toLowerCase(), parameterName: targetOpenView.codeName.toLowerCase() }
            ];
          }
        } else {
          if (targetOpenView.getPSAppDataEntity()) {
            parameters = [{ pathName: Util.srfpluralize((targetOpenView.getPSAppDataEntity() as IPSAppDataEntity)?.codeName).toLowerCase(), parameterName: (targetOpenView.getPSAppDataEntity() as IPSAppDataEntity)?.codeName.toLowerCase() }];
          }
          if (targetOpenView && targetOpenView.modelPath) {
            Object.assign(tempContext, { viewpath: targetOpenView.modelPath });
          }
        }
        if (this.viewUseByExpBar) {
          this.openTargetViewByExpBar(targetOpenView, view, tempContext, tempViewParams, [], parameters, []);
        } else {
          this.openTargetView(targetOpenView, view, tempContext, tempViewParams, [], parameters, []);
        }
      }
    })
  }

  /**
   * 打开目标视图
   *
   * @memberof DeRedirectViewBase
   */
  openTargetView(openView: any, view: any, tempContext: any, data: any, deResParameters: any, parameters: any, args: any) {
    if (tempContext.srfdynainstid) {
      Object.assign(data, { srfdynainstid: tempContext.srfdynainstid });
    }
    const routePath = ViewTool.buildUpRoutePath(this.$route, tempContext, deResParameters, parameters, args, data);
    this.closeRedirectView(args);
    this.$router.replace({ path: routePath }).catch((error: any) => {
      LogUtil.log("重定向跳转......");
    })
  }

  /**
   * 打开目标视图（被导航栏引用的情况）
   *
   * @memberof DeRedirectViewBase
   */
  openTargetViewByExpBar(openView: any, view: any, tempContext: any, data: any, deResParameters: any, parameters: any, args: any) {
    this.viewNodeContent = undefined;
    if (openView && openView.modelPath) {
      Object.assign(tempContext, { viewpath: openView.modelPath });
    }
    const content = this.$createElement('app-view-shell', {
      key: Util.createUUID(),
      props: {
        staticProps:{
            viewDefaultUsage: false,
        },
        dynamicProps:{
            viewdata: JSON.stringify(tempContext),
            viewparam: JSON.stringify(data)
        }
      },
      class: 'viewcontainer3',
    })
    this.viewNodeContent = content;
    this.$forceUpdate();
  }

  /**
   * 关闭当前重定向视图
   *
   * @memberof DeRedirectViewBase
   */
  closeRedirectView(args: Array<any>) {
    let view: any = this;
    if (view.viewdata) {
      view.$emit('view-event', { action: 'viewdataschange', data: Array.isArray(args) ? args : [args] });
      view.$emit('view-event', { action: 'close', data: Array.isArray(args) ? args : [args] });
    } else {
      if (this.viewInstance && this.viewInstance.viewStyle && Object.is(this.viewInstance.viewStyle, "STYLE2")) {
        this.closeViewWithStyle2(view);
      } else {
        this.closeViewWithDefault(view);
      }
    }
  }

  /**
   * 渲染视图内容节点
   *
   * @memberof DeRedirectViewBase
   */
  renderContent() {
    if (this.viewNodeContent) {
      return this.viewNodeContent;
    }
  }

}
