<template>
  <Card>
    <Row class="operation">
      <Button @click="asyncRegion"  :loading="asyncLoading" type="primary" icon="md-add"
        >同步数据</Button
      >
    </Row>
    <div class="flex">
      <Spin size="large" fix v-if="spinShow"></Spin>
      <Tree
        class="tree"
        :data="data"
        :load-data="loadData"
        expand-node
        @on-select-change="changeTree"
      ></Tree>
      <div class="form">
        <Form
          ref="formValidate"
          :model="formValidate"
          :rules="ruleValidate"
          :label-width="100"
        >
          <FormItem v-if="formValidate.adCode" prop="adCode" label="区域编码">
            <Input v-model="formValidate.adCode" />
          </FormItem>
          <FormItem label="城市代码" prop="cityCode">
            <Input v-model="formValidate.cityCode" />
          </FormItem>
          <FormItem label="行政区划级别" prop="cityCode">
            <RadioGroup type="button" button-style="solid" v-model="formValidate.level">
              <Radio disabled label="country">国家</Radio>
              <Radio disabled label="province">省份</Radio>
              <Radio disabled label="city">市</Radio>
              <Radio disabled label="district">区县</Radio>
              <Radio disabled label="street">街道</Radio>
            </RadioGroup>
          </FormItem>

          <FormItem label="经纬度" prop="center">
            <Input v-model="formValidate.center" />
          </FormItem>
          <FormItem label="名称" prop="name">
            <Input v-model="formValidate.name" />
          </FormItem>
          <FormItem label="排序" prop="orderNum">
            <Input v-model="formValidate.orderNum" />
          </FormItem>

          <div class="button-list">
            <Button type="default" @click="handleUpdate('formValidate')"
              >修改</Button
            >
            <Button type="primary" ghost @click="handleInsert()">添加</Button>
            <Button type="error" @click="handleDel('formValidate')"
              >删除</Button
            >
          </div>
        </Form>
      </div>
    </div>

    <Modal v-model="modalFlag" title="添加" @on-ok="submit">
      <Form ref="addValidate" :model="addValidate" :label-width="100">
        <FormItem label="父级">
          <Input disabled v-model="addValidate.parentName" />
        </FormItem>
        <FormItem prop="adCode" label="区域编码">
          <Input v-model="addValidate.adCode" />
        </FormItem>
        <FormItem label="城市代码" prop="cityCode">
          <Input v-model="addValidate.cityCode" />
        </FormItem>

        <FormItem label="经纬度" prop="center">
          <Input v-model="addValidate.center" />
        </FormItem>
        <FormItem label="名称" prop="name">
          <Input v-model="addValidate.name" />
        </FormItem>
        <FormItem label="排序" prop="orderNum">
          <Input v-model="addValidate.orderNum" />
        </FormItem>
      </Form>
    </Modal>
  </Card>
</template>
<script>
import {
  getChildRegion,
  updateRegion,
  getRegionDetail,
  delRegion,
  asyncRegion,
  addRegion,
} from "@/api/index";
export default {
  data() {
    return {
      asyncLoading:false, // 加载状态
      num: 10, // 更新倒计时
      modalFlag: false,  // 新增编辑标识
      spinShow: false, // 全局加载状态
      timerNum: 10, // 定时器
      data: [], // 加载数据
      id: 0, // id
      addValidate: { // 添加级别
        parentName: "无父级",
      },
      formValidate: { // 表单数据
        adCode: "",
        cityCode: "",
        center: "",
        name: "",
        orderNum: "",
        level: "",
      },
      ruleValidate: { // 验证规则
        adCode: [
          {
            required: true,
            message: "区域编码不能为空",
            trigger: "blur",
          },
        ],

        center: [
          {
            required: true,
            message: "经纬度不能为空",
            trigger: "blur",
          },
        ],
        name: [
          {
            required: true,
            message: "名称不能为空",
            trigger: "blur",
          },
        ],
      },
    };
  },
  mounted() {
    this.init();
  },
  methods: {
    submit() {
      delete this.addValidate.children;
      addRegion(this.addValidate).then((res) => {
        if (res.success) {
          this.$Message.success("添加成功!请稍后查看");
        }
      });
    },

    // 添加
    handleInsert() {
      if (!this.formValidate.parentId) {
        this.$Message.error("请选择要添加的数据");
        return false;
      }
      this.addValidate = JSON.parse(JSON.stringify(this.formValidate));

      let level = ["country", "province", "city", "district", "street"];

      let child;
      level.forEach((item, index) => {
        if (this.addValidate.level == item) {
          if (index == level.length - 1) {
            child = level[index - 1];
          } else {
            child = level[index + 1];
          }
        }
      });

      this.addValidate.level = child;

      this.addValidate.parentId = this.formValidate.id;
      this.addValidate.parentName = this.formValidate.name;

      delete this.addValidate.id;
      delete this.addValidate.createBy;
      delete this.addValidate.createTime;
      delete this.addValidate.updateBy;
      delete this.addValidate.updateTime;
      delete this.addValidate.selected;

      this.addValidate.name = "";
      this.addValidate.center = "";
      this.modalFlag = true;
    },

    handleDel() {
      this.$Modal.confirm({
        title: "确定删除？",
        content: "删除后店铺以及用户地区绑定数据将全部错乱",
        onOk: () => {
          delRegion(this.formValidate.id).then((res) => {
            if (res.success) {
              this.$Message.success("删除成功!,请稍后查看数据");
            }
          });
        },
      });
    },

    // 修改
    handleUpdate(name) {
      delete this.formValidate.createBy;
      delete this.formValidate.createTime;
      delete this.formValidate.updateBy;
      delete this.formValidate.updateTime;
      delete this.formValidate.selected;
      this.$refs[name].validate((valid) => {
        if (valid) {
          this.formValidate.adCode
            ? this.formValidate.adCode
            : (this.formValidate.adCode = "");
          updateRegion(this.formValidate.id, this.formValidate).then((res) => {
            if (res.result) {
              this.$Message.success("修改成功!,请稍后查看数据");
            }
          });
        } else {
          this.$Message.error("请选择数据");
        }
      });
    },

    changeTree(array, val) {
      this.formValidate = val;
    },

    loadData(item, callback) {
      item.loading = true;
      console.log(item);
      getChildRegion(item.id).then((res) => {
        if (res.result.length <= 0) {
          item.loading = false;
        } else {
          let way = [];
          res.result.forEach((child, index) => {
            item.loading = false;
            let data;
            data = {
              ...child,
              title: child.name,
              loading: false,
              children: [],
            };

            if (
              child.level == "street" ||
              item.label == "香港特别行政区" ||
              item.label == "澳门特别行政区"
            ) {
              data = {
                ...child,
                title: child.name,
              };
            }

            way.push(data);
          });
          callback(way);
        }
      });
    },

    init() {
      getChildRegion(this.id).then((res) => {
        if (res.result) {
          res.result.forEach((item) => {
            let data;

            // 台湾省做处理
            if (item.name == "台湾省") {
              data = {
                ...item,
                title: item.name,
              };
            } else {
              data = {
                ...item,
                title: item.name,
                loading: false,
                children: [],
              };
            }

            this.data.push(data);
          });
        }
      });
    },

    asyncRegion() {
      this.num = 10;
      this.$Modal.confirm({
        title: "确定更新？",
        content: "更新后店铺以及用户地区绑定数据将全部错乱",
        onOk: () => {
          let timer;
          let number;

          this.asyncLoading = true

          this.$Message.info({
            duration: this.timerNum,
            render: (h) => {
              return h("span", [
                `地区数据将在${this.num}秒后更新`,
                h(
                  "a",
                  {
                    on: {
                      click: () => {
                        this.$Message.destroy();
                        this.asyncLoading = false
                        clearInterval(number);
                        clearTimeout(timer)
                      },
                    },
                  },
                  "点击撤销"
                ),
              ]);
            },
          });

          number = setInterval(() => {
            this.num--;
          }, 1000);

          timer = setTimeout(() => {
            clearInterval(number)
            asyncRegion().then((res) => {
              this.asyncLoading = false
              this.$Message.loading("地区数据正在更新中！");
            });
          }, 10000);
        },
      });
    },
  },
};
</script>
<style scoped lang="scss">
.flex {
  display: flex;
  position: relative;
}
.tree {
  flex: 2;
}
.form {
  flex: 8;
}
.button-list {
  margin-left: 80px;
  > * {
    margin: 0 4px;
  }
}
</style>
