<template>
  <div class="columns">
    <div class="column is-3">
      <div class="field">
        <label class="label">Code</label>
        <div class="control">
          <input
            class="input"
            type="text"
            placeholder=""
            v-model="current.code"
          />
        </div>
      </div>
      <div class="field mt-4">
        <label class="label">Name</label>
        <div class="control">
          <input
            class="input"
            type="text"
            placeholder=""
            v-model="current.name"
          />
        </div>
      </div>
      <div class="field mt-4">
        <label class="label">Api</label>
        <div class="control">
          <input
            class="input"
            type="text"
            placeholder=""
            v-model="current.api"
          />
        </div>
      </div>
      <div class="mt-5 py-2 border-bottom">
        <a @click="updateFromModel()">Thêm cài đặt cột từ Model</a>
      </div>
      <div class="py-2 border-bottom">
        <a @click="createUserSetting()">Tạo thiết lập (user setting)</a>
      </div>
      <div class="buttons mt-5">
        <button
          class="button is-primary"
          @click="saveData()"
        >
          Lưu lại
        </button>
      </div>
    </div>
    <div class="column is-5">
      <DataTable
        v-bind="{ pagename: pagename1 }"
        @delete="remove"
        @open="showAttr()"
        v-if="pagedata1"
      />
    </div>
    <div class="column is-4">
      <DataTable
        v-bind="{ pagename: pagename2 }"
        v-if="pagedata2"
      />
    </div>
  </div>
  <Modal
    @close="showmodal = undefined"
    @update="updateAttr"
    v-bind="showmodal"
    v-if="showmodal"
  />
</template>
<script>
export default {
  props: ["row"],
  data() {
    return {
      data: [],
      current: {},
      showmodal: undefined,
      report: undefined,
      setting: {},
      pagename: "page0",
      pagename1: "page1",
      pagename2: "page2",
      pagename3: "page3",
    };
  },
  async created() {
    let conn1 = this.$findapi("usersetting");
    conn1.params.filter = { name__in: ["import-setting", "model-fields"] };
    let rs = await this.$getapi([conn1]);
    let obj = this.$find(rs, { name: "usersetting" });
    let found = this.$find(obj.data.rows, { name: "import-setting" });
    this.pagedata1 = this.$getpage();
    this.$setpage(this.pagename1, found);
    this.pagedata2 = this.$getpage();
    found = this.$find(obj.data.rows, { name: "model-fields" });
    this.$setpage(this.pagename2, found);
    this.doClick(this.row);
  },
  computed: {
    pagedata1: {
      get: function () {
        return this.$store[this.pagename1];
      },
      set: function (val) {
        this.$store.commit(this.pagename1, val);
      },
    },
    pagedata2: {
      get: function () {
        return this.$store[this.pagename2];
      },
      set: function (val) {
        this.$store.commit(this.pagename2, val);
      },
    },
    pagedata3: {
      get: function () {
        return this.$store[this.pagename3];
      },
      set: function (val) {
        this.$store.commit(this.pagename3, val);
      },
    },
  },
  methods: {
    updateAttr(v) {
      this.current.detail = v;
      this.showSetting();
      this.showmodal = undefined;
    },
    createUserSetting() {
      this.pagedata3 = this.$getpage();
      const fields = [];
      const arr = ["AutoField", "ForeignKey", "FloatField", "IntegerField"];
      this.pagedata2.data.forEach((v) => {
        const field = this.$createField(
          v.name,
          v.name,
          arr.findIndex((x) => x == v.datatype) >= 0 ? "number" : "string",
          true,
          true,
        );
        fields.push(field);
      });
      this.$store.commit(this.pagename3, { update: { fields } });
      this.showmodal = {
        component: "menu/MenuSave",
        title: "Lưu thiết lập",
        width: "600px",
        height: "auto",
        vbind: { pagename: this.pagename3, classify: "data-field" },
      };
    },
    remove(v) {
      let copy = this.$copy(this.current.detail);
      delete copy[v.key];
      this.current.detail = copy;
      this.doClick(this.current);
    },
    async insertData() {
      let copy = this.$copy(this.current);
      copy.id = undefined;
      await this.$insertrow("importsetting", copy, undefined, this.pagename);
    },
    async saveData() {
      if (!this.row) return this.insertData();
      await this.$updateapi("importsetting", this.current, undefined, this.pagename);
    },
    updateFromModel() {
      let filter = this.$filter(this.pagedata2.data, {
        datatype: ["FloatField", "IntegerField"],
      });
      let copy = this.$copy(this.current.detail);
      filter.map((v) => {
        copy[v.name] = { type: "number", empty: v.null ? "yes" : "no" };
      });
      this.current.detail = copy;
      this.showSetting();
    },
    showAttr() {
      this.showmodal = {
        component: "datatable/FieldAttribute",
        width: "40%",
        height: "300px",
        title: "Danh sách thuộc tính",
        vbind: { field: this.current.detail },
      };
    },
    async doClick(v) {
      this.current = this.$copy(v);
      this.showSetting();
      let found = this.$findapi(v.api);
      let conn = this.$findapi("modelfields");
      conn.url += found.url.replace("data/", "");
      let rs = await this.$getapi([conn]);
      let copy = this.$copy(this.pagedata2);
      copy.update = { data: rs[0].data };
      this.pagedata2 = copy;
    },
    showSetting() {
      let arr = [];
      let i = 0;
      for (let key in this.current.detail) {
        i += 1;
        arr.push({
          id: i,
          key: key,
          value: this.current.detail[key],
          text: JSON.stringify(this.current.detail[key]),
        });
      }
      let copy = this.$copy(this.pagedata1);
      copy.update = { data: arr };
      this.pagedata1 = copy;
    },
  },
};
</script>
