<!--
  - Licensed to the Apache Software Foundation (ASF) under one or more
  - contributor license agreements.  See the NOTICE file distributed with
  - this work for additional information regarding copyright ownership.
  - The ASF licenses this file to You under the Apache License, Version 2.0
  - (the "License"); you may not use this file except in compliance with
  - the License.  You may obtain a copy of the License at
  -
  -     http://www.apache.org/licenses/LICENSE-2.0
  -
  - Unless required by applicable law or agreed to in writing, software
  - distributed under the License is distributed on an "AS IS" BASIS,
  - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  - See the License for the specific language governing permissions and
  - limitations under the License.
  -->

<template>
  <el-row class="box-card">
    <div class="btn-group">
      <el-button
        class="btn-plus"
        type="primary"
        icon="el-icon-plus"
        @click="add"
      >{{ $t("registryCenter.btnTxt") }}</el-button>
    </div>
    <div class="table-wrap">
      <el-table :data="tableData" border style="width: 100%">
        <el-table-column
          v-for="(item, index) in column"
          :key="index"
          :prop="item.prop"
          :label="item.label"
          :width="item.width"
        />
        <el-table-column :label="$t('registryCenter.table.operate')" fixed="right" width="200">
          <template slot-scope="scope">
            <el-tooltip
              :content="$t('registryCenter.table.operateEdit')"
              class="item"
              effect="dark"
              placement="top"
            >
              <el-button
                :disabled="scope.row.activated"
                size="small"
                type="primary"
                icon="el-icon-edit"
                @click="handleEdit(scope.row)"
              />
            </el-tooltip>
            <el-tooltip
              :content="!scope.row.activated ? $t('registryCenter.table.operateConnect'): $t('registryCenter.table.operateConnected')"
              class="item"
              effect="dark"
              placement="top"
            >
              <el-button
                type="primary"
                icon="el-icon-link"
                size="small"
                @click="handleConnect(scope.row)"
              />
            </el-tooltip>
            <el-tooltip
              :content="$t('registryCenter.table.operateDel')"
              class="item"
              effect="dark"
              placement="top"
            >
              <el-button
                size="small"
                type="danger"
                icon="el-icon-delete"
                @click="handlerDel(scope.row)"
              />
            </el-tooltip>
          </template>
        </el-table-column>
      </el-table>
      <div class="pagination">
        <el-pagination
          :total="total"
          :current-page="currentPage"
          background
          layout="prev, pager, next"
          @current-change="handleCurrentChange"
        />
      </div>
    </div>
    <el-dialog
      :title="$t('registryCenter.registDialog.title')"
      :visible.sync="regustDialogVisible"
      width="1010px"
    >
      <el-form ref="form" :model="form" :rules="rules" label-width="170px">
        <el-form-item :label="$t('registryCenter.registDialog.name')" prop="name">
          <el-input :placeholder="$t('registryCenter.rules.name')" v-model="form.name" autocomplete="off" />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.governanceName')" prop="governanceName">
          <el-input
            :placeholder="$t('registryCenter.rules.governanceName')"
            v-model="form.governanceName"
            autocomplete="off"
          />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.centerType')" prop="instanceType">
          <el-radio-group v-model="form.instanceType">
            <el-radio label="Zookeeper">Zookeeper</el-radio>
            <el-radio label="Etcd">Etcd</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.address')" prop="serverLists">
          <el-input
            :placeholder="$t('registryCenter.rules.address')"
            v-model="form.serverLists"
            autocomplete="off"
          />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.digest')" id="add-digest" v-show="showAddDigest">
          <el-input
            :placeholder="$t('registryCenter.rules.digest')"
            v-model="form.digest"
            autocomplete="off"
          />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.additionalCenterType')" prop="additionalConfigCenterType">
          <el-radio-group v-model="form.additionalConfigCenterType">
            <el-radio label="Zookeeper">Zookeeper</el-radio>
            <el-radio label="Etcd">Etcd</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.additionalAddress')" prop="additionalConfigCenterServerList">
          <el-input
            :placeholder="$t('registryCenter.rules.address')"
            v-model="form.additionalConfigCenterServerList"
            autocomplete="off"
          />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.digest')" id="add-digest-additional" v-show="showAddDigestAdditional">
          <el-input
            :placeholder="$t('registryCenter.rules.digest')"
            v-model="form.additionalDigest"
            autocomplete="off"
          />
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="regustDialogVisible = false">{{ $t("registryCenter.registDialog.btnCancelTxt") }}</el-button>
        <el-button
          type="primary"
          @click="onConfirm('form')"
        >{{ $t("registryCenter.registDialog.btnConfirmTxt") }}</el-button>
      </div>
    </el-dialog>
    <el-dialog
      :title="$t('registryCenter.registDialog.editTitle')"
      :visible.sync="editDialogVisible"
      width="1010px"
    >
      <el-form ref="editForm" :model="editForm" :rules="rules" label-width="170px">
        <el-form-item :label="$t('registryCenter.registDialog.name')" prop="name">
          <el-input :placeholder="$t('registryCenter.rules.name')" v-model="editForm.name" autocomplete="off" />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.governanceName')" prop="governanceName">
          <el-input
            :placeholder="$t('registryCenter.rules.governanceName')"
            v-model="editForm.governanceName"
            autocomplete="off"
          />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.centerType')" prop="instanceType">
          <el-radio-group v-model="editForm.instanceType">
            <el-radio label="Zookeeper">Zookeeper</el-radio>
            <el-radio label="Etcd">Etcd</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.address')" prop="serverLists">
          <el-input
            :placeholder="$t('registryCenter.rules.address')"
            v-model="editForm.serverLists"
            autocomplete="off"
          />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.digest')" v-show="showEditDigest">
          <el-input
            :placeholder="$t('registryCenter.rules.digest')"
            v-model="editForm.digest"
            autocomplete="off"
          />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.additionalCenterType')" prop="additionalConfigCenterType">
          <el-radio-group v-model="editForm.additionalConfigCenterType">
            <el-radio label="Zookeeper">Zookeeper</el-radio>
            <el-radio label="Etcd">Etcd</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.additionalAddress')" prop="additionalConfigCenterServerList">
          <el-input
            :placeholder="$t('registryCenter.rules.address')"
            v-model="editForm.additionalConfigCenterServerList"
            autocomplete="off"
          />
        </el-form-item>
        <el-form-item :label="$t('registryCenter.registDialog.digest')" v-show="showEditDigestAdditional">
          <el-input
            :placeholder="$t('registryCenter.rules.digest')"
            v-model="editForm.additionalDigest"
            autocomplete="off"
          />
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="cancelEdit">{{ $t("registryCenter.registDialog.btnCancelTxt") }}</el-button>
        <el-button
          type="primary"
          @click="confirmEdit('editForm')"
        >{{ $t("registryCenter.registDialog.btnConfirmTxt") }}</el-button>
      </div>
    </el-dialog>
  </el-row>
</template>
<script>
import { mapActions } from 'vuex'
import clone from 'lodash/clone'
import API from '../api'
export default {
  name: 'RegistryCenter',
  data() {
    return {
      regustDialogVisible: false,
      editDialogVisible: false,
      showAddDigest:true,
      showAddDigestAdditional:true,
      showEditDigest:true,
      showEditDigestAdditional:true,
      column: [
        {
          label: this.$t('registryCenter').registDialog.name,
          prop: 'name'
        },
        {
          label: this.$t('registryCenter').registDialog.governanceName,
          prop: 'governanceName'
        },
        {
          label: this.$t('registryCenter').registDialog.centerType,
          prop: 'instanceType'
        },
        {
          label: this.$t('registryCenter').registDialog.address,
          prop: 'serverLists'
        },
        {
          label: this.$t('registryCenter').registDialog.additionalCenterType,
          prop: 'additionalConfigCenterType'
        },
        {
          label: this.$t('registryCenter').registDialog.additionalAddress,
          prop: 'additionalConfigCenterServerList'
        },
      ],
      form: {
        name: '',
        serverLists: '',
        instanceType: 'Zookeeper',
        governanceName: '',
        digest: '',
        additionalConfigCenterType: '',
        additionalConfigCenterServerList: '',
        additionalDigest: ''
      },
      editForm: {
        primaryName: '',
        name: '',
        serverLists: '',
        instanceType: 'Zookeeper',
        governanceName: '',
        digest: '',
        additionalConfigCenterType: '',
        additionalConfigCenterServerList: '',
        additionalDigest: ''
      },
      rules: {
        name: [
          {
            required: true,
            message: this.$t('registryCenter').rules.name,
            trigger: 'change'
          }
        ],
        serverLists: [
          {
            required: true,
            message: this.$t('registryCenter').rules.address,
            trigger: 'change'
          }
        ],
        namespace: [
          {
            required: true,
            message: this.$t('registryCenter').rules.namespaces,
            trigger: 'change'
          }
        ],
        instanceType: [
          {
            required: true,
            message: this.$t('registryCenter').rules.centerType,
            trigger: 'change'
          }
        ],
        governanceName: [
          {
            required: true,
            message: this.$t('registryCenter').rules.governanceName,
            trigger: 'change'
          }
        ]
      },
      tableData: [],
      cloneTableData: [],
      currentPage: 1,
      pageSize: 10,
      total: null
    }
  },
  created() {
    this.getRegCenter()
  },
  methods: {
    ...mapActions(['setRegCenterActivated']),
    handleCurrentChange(val) {
      const data = clone(this.cloneTableData)
      this.tableData = data.splice(val - 1, this.pageSize)
    },
    getRegCenter() {
      API.getRegCenter().then(res => {
        const data = res.model
        this.total = data.length
        this.cloneTableData = clone(res.model)
        this.tableData = data.splice(0, this.pageSize)
      })
      this.getRegCenterActivated()
    },
    getRegCenterActivated() {
      API.getRegCenterActivated().then(res => {
        this.setRegCenterActivated(res.model.name)
      })
    },
    handleConnect(row) {
      if (row.activated) {
        this.$notify({
          title: this.$t('common').notify.title,
          message: this.$t('common').connected,
          type: 'success'
        })
      } else {
        const params = {
          name: row.name
        }
        API.postRegCenterConnect(params).then(res => {
          this.$notify({
            title: this.$t('common').notify.title,
            message: this.$t('common').notify.conSucMessage,
            type: 'success'
          })
          this.getRegCenter()
        })
      }
    },
    handlerDel(row) {
      const params = {
        name: row.name
      }
      API.deleteRegCenter(params).then(res => {
        this.$notify({
          title: this.$t('common').notify.title,
          message: this.$t('common').notify.delSucMessage,
          type: 'success'
        })
        this.getRegCenter()
      })
    },
    onConfirm(formName) {
      this.$refs[formName].validate(valid => {
        if (valid) {
          API.postRegCenter(this.form).then(res => {
            this.regustDialogVisible = false
            this.$notify({
              title: this.$t('common').notify.title,
              message: this.$t('common').notify.addSucMessage,
              type: 'success'
            })
            this.getRegCenter()
          })
        } else {
          console.log('error submit!!')
          return false
        }
      })
    },
    add() {
      this.regustDialogVisible = true
    },
    handleEdit(row) {
      this.editDialogVisible = true
      this.editForm = Object.assign({}, row)
      this.editForm.primaryName = row.name
    },
    confirmEdit(formName) {
      this.$refs[formName].validate(valid => {
        if (valid) {
          API.updateRegCenter(this.editForm).then(res => {
            this.editDialogVisible = false
            this.$notify({
              title: this.$t('common').notify.title,
              message: this.$t('common').notify.editSucMessage,
              type: 'success'
            })
            this.getRegCenter()
          })
        } else {
          console.log('error submit!!')
          return false
        }
      })
    },
    cancelEdit() {
      this.editDialogVisible = false
    },
    centerTypeChanged(value) {
      if (value === 'Zookeeper') {
        this.showAddDigest = true
      } else {
        this.showAddDigest = false
        this.form.digest = '';
      }
    },
    additionalCenterTypeChanged(value) {
      if (value === 'Zookeeper') {
        this.showAddDigestAdditional = true
      } else {
        this.showAddDigestAdditional = false
        this.form.additionalDigest = '';
      }
    },
    editCenterTypeChanged(value) {
      if (value === 'Zookeeper') {
        this.showEditDigest = true
      } else {
        this.showEditDigest = false
        this.editForm.digest = '';
      }
    },
    editAdditionalCenterTypeChanged(value) {
      if (value === 'Zookeeper') {
        this.showEditDigestAdditional = true
      } else {
        this.showEditDigestAdditional = false
        this.editForm.additionalDigest = '';
      }
    }
  }
}
</script>
<style lang='scss' scoped>
.btn-group {
  margin-bottom: 20px;
}
.pagination {
  float: right;
  margin: 10px -10px 10px 0;
}
</style>
