// picker/picker.js
import { isString,isPlainObject } from './tool';

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    scrollType:{
      type: String,
      value: "normal"//"link": scroll间联动  "normal": scroll相互独立
    },
    
    listData: {
      type: Array,
      value: [],
      observer: function(newVal) {
        if (newVal.length === 0 || this._compareDate()) return;
        this._setTempData();
        let tempArr = [...new Array(newVal.length).keys()].map(() => 0)
        // console.log(tempArr,'测试~')
        this.data.lastValue = this.data.tempValue =tempArr;
        console.log(this.data.tempValue,'测试2')
        this._setDefault()

        // let {defaultPickData} = this.properties;
        // if(newVal.length === 0) return;
        //
        // this._setDefault(newVal, defaultPickData)
      }
    },
    defaultPickData:{
      type: Array,
      value: [],
      observer: function (newVal) {
        if (newVal.length === 0 || this._compareDate()) return;
        this._setTempData();
        this._setDefault()
      }
    },
    keyWordsOfShow:{
      type: String,
      value: "name"
    },
    isShowPicker:{
      type: Boolean,
      value: false,
      observer: function(newVal) {
        if (newVal) {
          this.setData({
            donghua:true
          })
          this._openPicker()
        }else{
 
          this._closePicker()

        }
      }
    },
    titleText: {//标题文案
      type: String,
      value: "标题"
    },
    cancelText:{//取消按钮文案
      type: String,
      value: "取消"
    },
    sureText:{//确定按钮文案
      type: String,
      value: "确定"
    },
    pickerHeaderStyle: String,//标题栏样式 view
    sureStyle: String, //标题栏确定样式  text
    cancelStyle: String,//标题栏取消样式 text
    titleStyle: String,//标题栏标题样式  view
    maskStyle: String,//设置蒙层的样式(详见picker-view) view
    indicatorStyle: String,//设置选择器中间选中框的样式(详见picker-view) view
    chooseItemTextStyle: String//设置picker列表文案样式 text
  },

  /**
   * 组件的初始数据
   */
  data: {
    columnsData:[],
    value:[],
    backData:[],
    height:0,
    isOpen: false,
    isUseKeywordOfShow: false,
    scrollEnd : true,//滚动是否结束
    lastValue : [],//上次各个colum的选择索引
    tempValue : [],
    isFirstOpen : true,
    onlyKey : '',
    defaultPickDataTemp: '',
    listDataTemp: '',
  },
  /**
   * 组件的方法列表
   */
  methods: {
    tapModal () {
      this.properties.isShowPicker = false;
      this._closePicker()
    },
    cancle () {
      this.setData({
        donghua:false
      })
      this.triggerEvent('cancle')
      this._closePicker()
    },
    sure () {
      let that=this
      this.setData({
        donghua: false
      })
      setTimeout(function(){

      let { scrollEnd, tempValue} = that.data;
      console.log(scrollEnd,"滚动")
        
        // if (!that.data.scrollEnd) return;
   
    
      let backData = that._getBackDataFromValue(tempValue);
      that.setData({
        backData
      })
      that.triggerEvent('sure', {
        choosedData:backData,
        choosedIndexArr:tempValue
      })
      that._closePicker()

    },900)
    },
    _bindChange (e) {
      console.log(e)
      let {scrollType} = this.properties;
      let { lastValue } = this.data;
      let val = e.detail.value;
      let backData = [];
      switch (scrollType) {
        case "normal":
          this.data.tempValue = val.concat();
          this.data.tempValue = val.concat();
          break;
        case "link":
           //let column_02 = this._getColumnData(this.properties.listData[val[0]].children);
           //let column_03 = this._getColumnData(this.properties.listData[val[0]].children[val[1]].children);
          let tempArray = [];
          if(val.length>1){
            val.slice(0,val.length-1).reduce((t,c,i) => {
              let v = t[c].children;
              tempArray.push(this._getColumnData(v))
              return v
            },this.properties.listData)
          }
          //let columnsData = [this.data.columnsData[0],column_02,column_03];
          let columnsData = [this.data.columnsData[0], ...tempArray];

          //设置value关联
          let compareIndex = this._getScrollCompareIndex(lastValue, val);
          if(compareIndex > -1){
            let tempI = 1;
            while(val[compareIndex+tempI]!==undefined){
              val[compareIndex+tempI] = 0;
              tempI++;
            }
          }
          val = this._validate(val);
          this.data.lastValue = val.concat();
          this.data.tempValue = val.concat();
          this.setData({
            columnsData,
            // value: val
          })
      }

    },
    _validate (val) {
      let { columnsData } = this.data;
      columnsData.forEach((v, i) => {
        if(columnsData[i].length - 1 < val[i]){
          val[i] = columnsData[i].length - 1;
        }
      })
      this.setData({
        value: val
      })
      return val;
    },
    _bindpickend(){
      console.log("滚动结束")
      this.data.scrollEnd = true;
    },
    _bindpickstart(){
      this.data.scrollEnd = false;
      console.log("滚动开始")
    },
    _openPicker () {

      if(!this.data.isFirstOpen){
        if(this.properties.listData.length !== 0){
          this._setDefault(this._computedBackData(this.data.backData))
        }
      }
      this.data.isFirstOpen = false;
      this.setData({
        isOpen: true
      })

    },
    _closePicker () {
     this.setData({
       isOpen: false
     })
    },
    _getColumnData (arr) {
      return arr.map((v) => this._fomateObj(v))
    },
    _fomateObj (o) {
      let tempO = {};
      for(let k in o){
        k !== "children" && (tempO[k] = o[k]);
      }
      return tempO;
    },
    _getScrollCompareIndex (arr1, arr2)  {
      let tempIndex = -1;
      for(let i = 0, len = arr1.length; i<len; i++){
        if(arr1[i] !== arr2[i]){
          tempIndex = i;
          break;
        }
      }
      return tempIndex;
    },
    //根据id获取索引
    _getIndexByIdOfObject (listData,idArr,key,arr) {
      if(!Array.isArray(listData)) return;
      for(let i = 0,len = listData.length; i<len; i++){
       if(listData[i][key] == idArr[arr.length][key]){
         arr.push(i)
         return this._getIndexByIdOfObject(listData[i].children,idArr,key,arr)
       }
      }

    },
    _setDefault (inBackData) {
      let {listData,defaultPickData,scrollType} = this.properties;
      let { lastValue, tempValue, onlyKey } = this.data;
      if(inBackData){
        defaultPickData = inBackData;
      }
      let backData = [];
      switch (scrollType) {
        case "normal":
          if(isPlainObject(listData[0][0])){
            this.setData({
              isUseKeywordOfShow: true
            })
          }
          if(Array.isArray(defaultPickData) && defaultPickData.length>0){
            backData = listData.map((v, i) => v[defaultPickData[i]]);
            this.data.tempValue = defaultPickData;
            this.data.lastValue = defaultPickData;
          }else{
            backData = listData.map((v) => v[0]);
          }
          this.setData({
            columnsData: listData,
            backData: backData,
            value: defaultPickData
          })
          break;
        case "link":
          // let column_01 = this._getColumnData(newVal);
          // let column_02 = this._getColumnData(newVal[0].children);
          // let column_03 = this._getColumnData(newVal[0].children[0].children);
          // let columnsData = [column_01,column_02,column_03];
          let columnsData = [];
          //如果默认值
          if(Array.isArray(defaultPickData) && defaultPickData.length>0 && defaultPickData.every((v, i) => isPlainObject(v))){
            let key = onlyKey = Object.keys(defaultPickData[0])[0];
            let arr = [];
            this._getIndexByIdOfObject(listData, defaultPickData, key, arr);
            defaultPickData = arr;
            let tempI = 0;
            do{
              lastValue.push(defaultPickData[tempI]);
              columnsData.push(this._getColumnData(listData))
              listData = listData[defaultPickData[tempI]].children;
              tempI++;
            }while (listData)
            backData = columnsData.map((v, i) => v[defaultPickData[i]]);
            //如果没有默认值
          }else{
            this.data.onlyKey = this.properties.keyWordsOfShow||'name';
            do{
              lastValue.push(0);
              columnsData.push(this._getColumnData(listData))
              listData = listData[0].children;
            }while (listData)
            backData = columnsData.map((v) => v[0]);
          }
          this.data.tempValue = defaultPickData;
          this.data.lastValue = defaultPickData;
          this.setData({
            isUseKeywordOfShow: true,
            columnsData,
            backData,
          })
          setTimeout(()=>{
            this.setData({
              value: defaultPickData
            })
          },0)
          break;
      }
    },
    _computedBackData(backData) {
      let {scrollType, listData} = this.properties;
      let { onlyKey } = this.data;
      if(scrollType === 'normal'){
        return backData.map((v, i) => listData[i].findIndex((vv, ii) => this._compareObj(v, vv)))
      }else{
        return backData.map((v, i) => {
          let o = {};
          o[onlyKey] = v[onlyKey]
          return o;
        })
      }
    },
    _compareObj (o1, o2) {
      let {keyWordsOfShow} = this.properties;
      if(typeof o1 !== "object"){
        return o1 === o2
      }else{
        return o1[keyWordsOfShow] === o2[keyWordsOfShow]
      }
    },
    _getBackDataFromValue (val) {
      let tempArr = [];
      if(val.length > 0){
        tempArr = this.data.columnsData.reduce((t, v, i) => {
          return t.concat(v[val[i]])
        }, [])
      }else{
        tempArr = this.data.columnsData.map((v, i) => v[0])
      }
      return tempArr
    },
    _compareDate () { //完全相等返回true
      let {defaultPickDataTemp, listDataTemp} = this.data;
      let {defaultPickData, listData}  = this.properties

      return defaultPickDataTemp === defaultPickData && listDataTemp === listData
    },
    _setTempData () {
      let {defaultPickData, listData}  = this.properties;
      this.data.defaultPickDataTemp = defaultPickData;
      this.data.listDataTemp = listData;
    }
  }

  })