<template>
  <div>
    <avue-map v-model="map" placeholder="请选择地图"></avue-map>
    <template v-if="typeof resultFormat === 'string'">
      <el-input size="small" :prop="value" @input="e => $emit('input',e)"></el-input>
    </template>
    <template v-else-if="resultFormat instanceof Array">
      <div class="loc-editor">
        <el-input :placeholder="item" v-for="(item, index) in resultFormat" size="small" :value="map[item]" @input="e => inputHandle(e,item)">
        </el-input>
      </div>
    </template>
    <template v-else>
      <el-input :placeholder="key" v-for="(value, key) of resultFormat" size="small" :value="map[key]" @input="e => inputHandle(e,key)">
      </el-input>
    </template>
  </div>
</template>

<script>
export default {
  props: {
    value: [String, Object, Array, Number, Boolean],
    resultFormat: {
      type: [String, Object, Array],
      default: () => ['longitude','latitude'] //latitude纬度，longitude经度,formattedAddress地址
    }
  },
  data() {
    return {
      map: {},
    }
  },
  methods: {
    inputHandle (e, key) {
      this.map[key] = e;
      this.map = Object.assign({}, this.map)
    }
  },
  computed: {},
  watch: {
    map(newVal) {
      if(!newVal) return
      let info = {
        ...newVal,
        latitude: newVal.location?.lat || newVal.latitude,
        longitude: newVal.location?.lng || newVal.longitude,
      }
      let res = ''
      if(typeof this.resultFormat === 'string') {
        res = info[this.resultFormat]
      }
      if(this.resultFormat instanceof Array) {
        res = this.resultFormat.map(i => info[i])?.toString()
      }
      if(typeof this.resultFormat === 'object' && (!this.resultFormat instanceof Array)) {
        let obj = {}
        for(let key in this.resultFormat) {
          obj[key] = info[this.resultFormat[key]]
        }
        res = obj;
      }
      console.log(res)
      this.$emit('input', res)
    },
    value: {
      handler: function(newVal) {
        if (newVal) {
          if(typeof this.resultFormat === 'string') {
            this.map[this.resultFormat] = newVal
          }
          if(this.resultFormat instanceof Array && newVal) {
            let valArr = newVal.split(',')
            this.resultFormat.forEach((i,index) => {
              this.map[i] = Number(valArr[index])
            })
          }
          if(typeof this.resultFormat === 'object' && (!this.resultFormat instanceof Array)) {
            for(let key in this.resultFormat) {
              this.map[key] = newVal[key]
            }
          }

          this.map = Object.assign(this.map, {})
          this.$forceUpdate()
        }
      },
      immediate: true
    }
  }
}
</script>

<style scoped lang="scss">
.loc-editor {
  display: flex;
  margin-top: 4px;

  & > ::v-deep.el-input {
    margin-left: 4px;
  }
  & > ::v-deep.el-input:first-child {
    margin-left: 0;
  }
}
</style>
