import { IPSAppDEPickupView, IPSDEPickupViewPanel, IPSTreeExpBar } from '@ibizstudio/runtime';
import { ModelTool, PickupView2Engine, PickupView2Interface } from '@ibizstudio/runtime';
import { MainViewBase } from './mainview-base';

/**
 * 实体选择视图(左右关系)
 *
 * @export
 * @class PickupView2Base
 * @extends {MainViewBase}
 * @implements {PickupView2Interface}
 */
export class PickupView2Base extends MainViewBase implements PickupView2Interface {
  /**
   * 视图实例
   *
   * @memberof PickupView2Base
   */
  declare viewInstance: IPSAppDEPickupView;

  /**
   * 选择视图面板实例对象
   *
   * @memberof PickupView2Base
   */
  pickupViewInstance!: IPSDEPickupViewPanel;

  /**
   * 树导航实例对象
   *
   * @memberof PickupView2Base
   */
  treeExpBarInstance!: IPSTreeExpBar;

  /**
   * 视图引擎
   *
   * @public
   * @type {Engine}
   * @memberof PickupView2Base
   */
  engine: PickupView2Engine = new PickupView2Engine();

  /**
   * 选中数据的字符串
   *
   * @type {string}
   * @memberof PickupView2Base
   */
  selectedData: string = '';

  /**
   * 视图选中数据
   *
   * @type {any[]}
   * @memberof PickupView2Base
   */
  viewSelections: any[] = [];

  /**
   * 是否显示按钮
   *
   * @type {boolean}
   * @memberof PickupView2Base
   */
  isShowButton: boolean = true;

  /**
   * 监听部件动态参数变化
   *
   * @param {*} newVal
   * @param {*} oldVal
   * @memberof PanelControlBase
   */
  onDynamicPropsChange(newVal: any, oldVal: any) {
    super.onDynamicPropsChange(newVal, oldVal);
    if (this.viewparams?.selectedData) {
      this.selectedData = JSON.stringify(this.viewparams.selectedData);
    }
  }

  /**
   * 监听部件静态参数变化
   *
   * @param {*} newVal
   * @param {*} oldVal
   * @memberof PickupView2Base
   */
  onStaticPropsChange(newVal: any, oldVal: any) {
    this.isShowButton = newVal?.isShowButton !== false;
    super.onStaticPropsChange(newVal, oldVal);
  }

  /**
   * 引擎初始化
   *
   * @public
   * @memberof PickupView2Base
   */
  engineInit(): void {
    if (this.Environment && this.Environment.isPreviewMode) {
      return;
    }
    this.engine.init({
      view: this,
      parentContainer: this.$parent,
      treeExpBar: (this.$refs[this.treeExpBarInstance?.name] as any).ctrl,
      keyPSDEField: this.appDeCodeName.toLowerCase(),
      majorPSDEField: this.appDeMajorFieldName.toLowerCase(),
    });
  }

  /**
   * 确定
   *
   * @memberof PickupView2Base
   */
  onClickOk(): void {
    this.$emit('view-event', { viewName: this.viewInstance.name, action: 'viewdataschange', data: this.viewSelections });
    this.$emit('view-event', { viewName: this.viewInstance.name, action: 'close', data: null });
  }

  /**
   * 取消
   *
   * @memberof PickupView2Base
   */
  onClickCancel(): void {
    this.$emit('view-event', { viewName: this.viewInstance.name, action: 'viewdataschange', data: null });
    this.$emit('view-event', { viewName: this.viewInstance.name, action: 'close', data: null });
  }

  /**
   *  视图挂载
   *
   * @memberof PickupView2Base
   */
  async viewMounted() {
    super.viewMounted();
    if (this.viewparams?.selectedData) {
      this.engine.onCtrlEvent('pickupviewpanel', 'selectionchange', this.viewparams.selectedData);
    }
  }

  setIsMounted(name: string = 'self') {
    super.setIsMounted(name);
  }

  /**
   * 初始化数据选择视图实例
   *
   * @memberof PickupView2Base
   */
  async viewModelInit() {
    this.viewInstance = this.staticProps?.modeldata as IPSAppDEPickupView;
    await super.viewModelInit();
    const pickupViewInstance = ModelTool.findPSControlByType('PICKUPVIEWPANEL', this.viewInstance.getPSControls());
    Object.defineProperty(pickupViewInstance, 'embeddedpsappdeview', {
      enumerable: false,
      writable: true
    })
    this.pickupViewInstance = pickupViewInstance;
    this.treeExpBarInstance = ModelTool.findPSControlByType('TREEEXPBAR', this.viewInstance.getPSControls());
  }

  /**
   * 计算目标部件所需参数
   *
   * @param {string} [controlType]
   * @returns
   * @memberof PickupView2Base
   */
  computeTargetCtrlData(controlInstance: any) {
    const { targetCtrlName, targetCtrlParam, targetCtrlEvent } = super.computeTargetCtrlData(controlInstance);
    Object.assign(targetCtrlParam.dynamicProps, {
      selectedData: this.selectedData,
    });
    Object.assign(targetCtrlParam.staticProps, {
      isSingleSelect: true,
      isShowButton: this.isShowButton,
    });
    return { targetCtrlName, targetCtrlParam, targetCtrlEvent };
  }
}
