import base from './baseMixin';
import util from './util.js';
import NumUtils from './numUtils.js';
export default {
    data() {
        return {
          value:null,
          promptType:"none",
          message:"",
          state:"",
          isSet:false,
          isContent:false,
          textAlign:false,
          textColor:false,
          customStyle:{},
          dyConditions:[],
          controlDisplay:true
        }
    },
    inject: ['viewData'],
    methods: {
        setValue(value) {
            this.isSet = true;
            this.value = value;
            this.isSet = false;
            this.formatFieldValue&&this.formatFieldValue();
        },
        onBlur() {
            this.context.bill.changeTempformulaType(this.define.config.field, 2);
            if(this.define.config.formulas&&this.define.config.formulas.confirm){
                let _message = this.context.bill.getControlState(`confirm`,this.define.name);
                if(_message){
                    this.$Modal.confirm({
                        title: '提示',
                        content: _message,
                        onOk: () => {
                            this.setDataObjectValue(this.value);
                        },
                        onCancel: () => {
                            this.value = this.context.dataObject.getValue(this.define.config.field.split('.')[1]);
                        }
                    })
                }else{
                    this.setDataObjectValue(this.value);
                }
            }else{
                this.setDataObjectValue(this.value);
            }
            
        },
        setDataObjectValue(valueChange){
            this.context.dataObject.setValue(this.define.config.field, valueChange);
        },
        getContentStatus(){
          this.isContent = false;
          if(this.define.config.content){
              this.isContent = true;
          }
      },
      getValue(key,format){
          let val = {};
          if(this.context.dataObject){
              val = this.context.dataObject.getValue(this.define.config.field);
              if(val){
                  val = this.formatValue(val,format);
              }
              if(key){
                  if(val){
                      return val[key];
                  }else{
                      return '';
                  }
              }else if(val instanceof Object){
                  return val.title?val.title:val.name;
              }else{
                  return val;
              }
          }else if(this.context.card){
              let _data = this.context.card.getGlobalParam('gams_card_cardData');
              let _key = this.define.config.field.split('.').length > 1?this.define.config.field.split('.')[1]:this.define.config.field;
              val = _data[_key];
              val = this.formatValue(val,format);
              return val;
          }
      },
      formatValue(val,format){
          if(this.define.config.format){
               
              //TODO
          }else if(format){
              return this[`${format}Format`](val);
          }else if(this.define.type === 'NumberControl'){
            return this.numberFormat(val);
          }else{
            return val;
          }
      },
      dateFormat(val){
          return GAMS.Common.getDateStrs(val);
      },
      numberFormat(val){
          if(this.define.config.precision){
              val = GAMS.Common.roundIng(val,this.define.config.precision);
              return NumUtils.splitThousand(val,this.define.config.precision);
          }else{
              val = GAMS.Common.roundIng(val,2);
              return NumUtils.splitThousand(val,2);
          }
      },
      getConditions(){
           
          this.context.bill.runGetFilterConditionsFormula(this.define.config.field);
      },
      dealWithCondition(conditions,key){
          return conditions[key];
      },
      getTextAlign(style){
          this.deleteCustomStyleAttibute('center');
          this.deleteCustomStyleAttibute('left');
          this.deleteCustomStyleAttibute('right');
          if(this.define.layout&&this.define.layout.textAlign){
              this.customStyle[`input-${this.define.layout.textAlign}`] = true;
              style['textAlign'] = this.define.layout.textAlign;
          }
      },
      getTextColor(style){
          if(this.define.layout&&this.define.layout.color){
              style['color'] = this.define.layout.color;
          }
      },
      getInputHeight(style){
          this.deleteCustomStyleAttibute('height');
          if(this.define.layout&&this.define.layout.height){
              this.customStyle['input-height'] = true;
              style['height'] = util.analyUnit(this.define.layout.height);
          }
      },
      deleteCustomStyleAttibute(key){
          delete this.customStyle[`input-${key}`];
      },
      getInputWidth(style){
          if(this.define.layout&&this.define.layout.width){
              style['width'] = util.analyUnit(this.define.layout.width);
          }
      },
      setInputCorlor(){
          if(this.$refs.setfocus&&this.$refs.setfocus.$el.children&&this.$refs.setfocus.$el.children[1]){
              if(this.define.layout.color){
                  this.$refs.setfocus.$el.children[1].style['color'] = util.analyColor(this.define.layout.color);
              }
              if(this.define.layout.fontSize){
                  let _fz = util.analyUnit(this.define.layout.fontSize);
                  this.$refs.setfocus.$el.children[1].style.setProperty('font-size', _fz, 'important');
              }
          }
      },
        getControlHideStatus(name){
            this.context.bill.getControlHideStatus(name,'runtime');
        },
        addControlDisplayListener(){
            this.hideRemove = this.context.bill.addControlHideListener(this.define.name,{
                hideControl:function(type){
                    if(type){
                        this.controlDisplay = true;
                    }else{
                        this.controlDisplay = false;
                    }
                }.bind(this)
            });
        },
        addControlStateListener(){
            this.controlState = this.context.bill.addControlStateListener(this.define.name,{
                display:function(type){
                    if(type){
                        this.controlDisplay = true;
                    }else{
                        this.controlDisplay = false;
                    }
                }.bind(this),
                editable:function(nv){
                    this.state = nv;
                }.bind(this),
                enable:function(){

                }.bind(this),
                confirm:function(msg){
                    /**
                     * 主动调用
                     */
                    // if(msg){
                    //     this.showTipMessage(msg);
                    //     return false;
                    // }
                }.bind(this)
            });
        },
        getControlState(config){
            if(config&&config.formulas){
                for (const key in config.formulas) {
                    if(config.formulas[key] === "false"){
                        this[`setControl${key}`]&&this[`setControl${key}`]();
                    }else{
                        this.context.bill.getControlState(key,this.define.name,this.define.config.field);
                    }
                }
            }
        },
        setControldisplay(){
            this.controlDisplay = false;
        },
        setControleditable(){
            this.state = 'readOnly';
        },
        showTipMessage(message){
            this.$Modal.confirm({
                title: '提示',
                content: message,
                onOk: () => {
                    
                },
                onCancel: () => {
                    if(this.context.dataObject){
                      this.context.dataObject.resetFieldValue();
                    }
                    return ;
                }
            })
        }
    },
    mixins:[base],
    mounted() {
        this.$nextTick(function () {
            let obj = this.context.dataObject;
            if (this.define.config.field) {
                // 暂时注释
                this.remove = obj.addListener(this.define.config.field, {
                    messageChange: function (nm, om) {
                        this.promptType = nm.promptType;
                        this.message = nm.message;
                    }.bind(this),
                    valueChange: function (nv) {
                        this.setValue(nv);
                    }.bind(this),
                    stateChange: function (nv) {
                        this.state = nv;
                    }.bind(this),
                });
                if (obj.getValue) {
                    this.setValue(obj.getValue(this.define.config.field, this.define.config.detailTableName||'master'));
                } else {
                    let field = this.define.config.field.split('.')[1]
                    this.setValue(obj[field])
                }
                
                if(this.define.config&&this.define.config.formulaName){
                    this.addControlDisplayListener();
                    this.getControlHideStatus(this.define.config.formulaName);
                }else{
                    this.context.bill.setGlobalParam(this.define.name,this.define.config.field);
                    this.addControlStateListener();
                }

                if(this.context.controlState === 'readOnly'){
                    this.state = 'readOnly';
                }else if(!this.context.bill.getGlobalParam('_old_action_status')){
                    this.getControlState(this.define.config);
                }
            }
        }.bind(this));
    },
    created(){
        if(this.define.config.formulas){
            let _fieldNameRelation = this.context.bill.getGlobalParam('_field_name_relation_')||{};
            _fieldNameRelation[this.define.config.field] = {name:this.define.name,editable:this.define.config.formulas.editable};
            this.context.bill.setGlobalParam('_field_name_relation_',_fieldNameRelation);
        }else{
            let _fieldNameRelation = this.context.bill.getGlobalParam('_field_name_relation_')||{};
            _fieldNameRelation[this.define.config.field] = {name:this.define.name,editable:true};
            this.context.bill.setGlobalParam('_field_name_relation_',_fieldNameRelation);
        }
        this.getContentStatus();
    },
    props: {
        define: {
            type: Object,
            default: () => { }
        },
        context: {
            type: Object,
            default: () => { }
        },
        tableStyle: {
            type: Boolean,
            default: false
        }
    },
    watch: {
        value: function (nv, ov) {
            if (this.isSet || nv == ov) {
                return;
            }
        },
        viewData:{
            handler: function(nv,ov){
                let editableObj = this.define.config["editable"];
                if(editableObj && editableObj.type && editableObj.type.toLowerCase&&editableObj.type.toLowerCase() == "viewdata"){
                  if(nv[editableObj.attr]){
                    this.state = 'readOnly';
                  }else{
                    this.state = 'edit';
                  }
                }
            },
            deep: true,
            immediate: true
        }
    },
    beforeDestroy() {
        this.remove();
        this.hideRemove&&this.hideRemove();
        this.controlState&&this.controlState();
    },
    computed:{
      getInputStyle(){
          let style = {};
          this.getTextAlign(style);
          this.getTextColor(style);
          this.getInputHeight(style);
          this.getInputWidth(style);
          return style;
      }
  }
}