<template>
  <div class="edit-nginx-content">
    <div class="tab-btns tab-nowrap">
      <el-button
        v-for="env in envList"
        :key="env.id"
        size="mini"
        :type="curEnv.id == env.id ? 'primary' : 'default'"
        @click="selectEnv(env)"
        >{{ env.name }}
      </el-button>
    </div>
    <div class="part-box part-box-pad nginx-body">
      <div v-if="checkEditPrivilege()" class="nginx-body-action">
        <el-button
          v-if="isEdit"
          type="primary"
          size="mini"
          :loading="loading"
          @click="confirm"
          >提交</el-button
        >
        <el-button
          :type="isEdit ? 'success' : 'default'"
          size="mini"
          @click="isEdit = !isEdit"
          >编辑</el-button
        >
      </div>

      <div
        v-if="!isEdit"
        :class="['nginx-body-cont', { 'is-none': !nginxContent }]"
      >
        {{ nginxContent || "暂无内容" }}
      </div>
      <div v-else class="nginx-body-edit">
        <el-input v-model="nginxContent" type="textarea"></el-input>
      </div>
    </div>
  </div>
</template>

<script>
import { appNginxConfig, appNginxConfigUpdate, appEnvList } from "../api";

export default {
  name: "EditNginxContent",
  props: {
    filterData: {
      type: Object,
      default() {
        return {
          appId: "",
          moduleId: "",
        };
      },
    },
    isBaseline: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      envList: [],
      curEnv: {},
      nginxContent: "",
      isEdit: false,
      loading: false,
      user: {},
    };
  },
  computed: {
    IS_MAINTAINER() {
      return this.curEnv.user && this.curEnv.user.id === this.user.id;
    },
  },
  created() {
    this.user = this.$ls.get("user", {});
    this.initData();
  },
  methods: {
    async initData() {
      if (this.isBaseline) {
        this.envList = [{ id: null, name: "基线" }];
      } else {
        await this.getEnvList();
      }
      this.selectEnv(this.envList[0]);
    },
    async getEnvList() {
      const res = await appEnvList({
        appId: this.filterData.appId,
        moduleId: this.filterData.moduleId,
      });
      let envList = res || [];
      const testValid = this.checkPrivilege("app_nginx_test");
      const prodValid = this.checkPrivilege("app_nginx_prod");
      this.envList = envList.filter((env) => {
        return (
          (testValid && env.type === "TEST") ||
          (prodValid && env.type === "PROD")
        );
      });
    },
    selectEnv(env) {
      this.curEnv = env || {};
      this.search();
      this.isEdit = false;
    },
    checkEditPrivilege() {
      const privilege =
        (this.checkPrivilege("app_nginx_test_edit") &&
          this.curEnv.type === "TEST") ||
        (this.checkPrivilege("app_nginx_prod_edit") &&
          this.curEnv.type === "PROD") ||
        (this.checkPrivilege("app_nginx_baseline_edit") && this.isBaseline);

      return privilege || (!this.isBaseline && this.IS_MAINTAINER);
    },
    async search() {
      if (!this.isBaseline && !this.curEnv.id) {
        this.$message.error("请选择环境!");
        return;
      }
      const data = await appNginxConfig({
        ...this.filterData,
        envId: this.curEnv.id,
      });
      this.nginxContent = data.content || "";
    },
    async confirm() {
      if (!this.checkEditPrivilege()) return;

      if (!this.nginxContent) {
        this.$message.error("请输入配置内容!");
        return;
      }
      if (this.nginxContent.length > 9999) {
        this.$message.error("请输入配置内容过长!");
        return;
      }

      if (this.loading) return;
      this.loading = true;

      const res = await appNginxConfigUpdate({
        ...this.filterData,
        envId: this.curEnv.id,
        content: this.nginxContent,
      }).catch(() => {});
      this.loading = false;

      if (!res) return;

      this.$message.success("保存成功!");
    },
  },
};
</script>