<template>
  <section class="datasourcePicker">
    <config-item label="数据类型">
      <ai-select v-model="source.dataType" placeholder="请选择数据类型" :select-list="dataTypes"/>
    </config-item>
    <div class="codeEditor" v-if="['htmlData'].includes(source.dataType)">
      <ai-dialog-btn :modal="false" dialog-title="编辑器" :customFooter="false"
                     @confirm="changeData(JSON.parse(content))" @open="content=contentstr">
        <code-editor slot="btn" readonly :value="contentstr" :lang="dataLang" theme="github" width="100%" height="250"/>
        <code-editor v-model="content" :lang="dataLang" theme="github" width="100%" height="440" wrap/>
      </ai-dialog-btn>
    </div>
    <template v-else-if="source.dataType === 'staticData'">
      <table-editor label="设置数据" v-model="tableData" :configs.sync="colConfigs" @data="changeData"/>
    </template>
    <config-item v-else-if="source.dataType === 'dynamicData'" label="数据源">
      <ai-select v-model="source.sourceDataId" placeholder="请选择数据源" :instance="instance"
                 :prop="{label:'description'}" @change="changeData"
                 action="/app/appdiylargescreen/allDatasourceByPage"/>
    </config-item>
    <config-item label="接口地址" v-else-if="source.dataType === 'apiData'">
      <el-input size="small" v-model="source.api" @change="changeData" placeholder="请输入数据接口URL"/>
    </config-item>
  </section>
</template>
<script>
import AiDialogBtn from "dui/packages/layout/AiDialogBtn.vue";
import ConfigItem from "./configItem.vue";
import {DvCompData} from "../config";
import CodeEditor from 'bin-ace-editor'
import 'brace/mode/json'
import 'brace/snippets/json';
import 'brace/theme/github';
import 'brace/theme/monokai';
import TableEditor from "./tableEditor.vue";

export default {
  name: "datasourcePicker",
  components: {TableEditor, ConfigItem, AiDialogBtn, CodeEditor},
  model: {
    event: "input",
    prop: "options"
  },
  props: {
    options: Object,
    instance: Function
  },
  data() {
    return {
      dataTypes: Object.entries(DvCompData.types).map(e => ({id: e[0], label: e[1]})),
      content: "",
      loading: false,
      tableData: [],
      colConfigs: []
    }
  },
  computed: {
    contentstr: v => JSON.stringify(v.options.staticData),
    dataLang: v => v.options.dataType == 'htmlData' ? 'html' : 'json',
    source: {
      set(v) {
        this.$emit("input", v)
      },
      get() {
        return this.options
      }
    }
  },
  methods: {
    changeData(sdata) {
      this.source.dataType == 'staticData' ? this.source.staticData = sdata :
          new DvCompData(this.source.dataType, this.source, this.instance).getData().then(data => {
            this.source[this.source.dataType] = data
          })
    },
    initStaticDataProps() {
      const columnProp = "name"
      this.options.staticData.map((row, i) => {
        const prop = `c${i || ""}`
        this.colConfigs.push({label: row[columnProp], prop})
        Object.entries(row).map(([k, v]) => {
          if (/^v/.test(k)) {
            const item = this.tableData[k.substring(1) || 0] || {}
            item[prop] = v
            this.tableData[k.substring(1) || 0] = item
          }
        })
      })
      this.tableData = this.tableData.map(e => ({...e, $cellEdit: false}))
    }
  },
  created() {
    //新版静态数据
    this.initStaticDataProps()
  }
}
</script>
<style scoped lang="scss">
.datasourcePicker {
  .codeEditor {
    position: relative;
    padding-left: 10px;
  }
}
</style>
