<template>
  <div class="app-container">
    <div class="filter-container">
      <el-input :placeholder="$t('cluster.searchClusters')" v-model="listQuery.cluster" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter"/>
      <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"/>
      <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-plus" @click="handleCreate">{{ $t('cluster.addCluster') }}</el-button>
    </div>

    <el-row :gutter="24">
      <el-col :xs="{span: 24}" :sm="{span: 24}" :md="{span: 24}" :lg="{span: 24}" :xl="{span: 24}" style="padding-right:8px;margin-bottom:30px;">
        <el-table
          v-loading="listLoading"
          :key="tableKey"
          :data="list"
          border
          fit
          highlight-current-row
          style="width: 100%;">
          <el-table-column :label="$t('table.cluster')" min-width="150px" align="center">
            <template slot-scope="scope">
              <router-link :to="'/management/clusters/' + scope.row.cluster + '/cluster?tab=config'" class="link-type">
                <span>{{ scope.row.cluster }}</span>
              </router-link>
            </template>
          </el-table-column>
          <el-table-column label="Brokers" min-width="150px" align="center">
            <template slot-scope="scope">
              <router-link :to="'/management/clusters/' + scope.row.cluster + '/cluster?tab=brokers'" class="link-type">
                <span>{{ scope.row.brokers }}</span>
              </router-link>
            </template>
          </el-table-column>
          <el-table-column label="Service Urls" min-width="150px" align="center">
            <template slot-scope="scope">
              <span>
                data: {{ scope.row.brokerServiceUrl }}
                <br>
                admin: {{ scope.row.serviceUrl }}
              </span>
            </template>
          </el-table-column>
          <el-table-column :label="$t('table.actions')" align="center" width="240" class-name="small-padding fixed-width">
            <template slot-scope="scope">
              <router-link :to="'/management/clusters/' + scope.row.cluster + '/cluster?tab=config'">
                <el-button type="primary" size="mini">{{ $t('table.edit') }}</el-button>
              </router-link>
              <el-button size="mini" type="danger" @click="handleDelete(scope.row)">{{ $t('table.delete') }}</el-button>
            </template>
          </el-table-column>
        </el-table>
      </el-col>
    </el-row>
    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
      <el-form
        ref="temp"
        :rules="rules"
        :model="temp"
        label-position="top"
        style="margin-left:30%; margin-right:10%">
        <div v-if="dialogStatus==='create'">
          <el-form-item :label="$t('cluster.name')" prop="cluster">
            <el-input v-model="temp.cluster"/>
          </el-form-item>
          <el-form-item :label="$t('cluster.webServiceUrlPrefix')" prop="serviceUrl">
            <el-input v-model="temp.serviceUrl" placeholder="http://"/>
          </el-form-item>
          <el-form-item :label="$t('cluster.webServiceUrlTlsPrefix')" prop="serviceUrlTls">
            <el-input v-model="temp.serviceUrlTls" placeholder="https://"/>
          </el-form-item>
          <el-form-item :label="$t('cluster.brokerServiceUrlPrefix')" prop="brokerServiceUrl">
            <el-input v-model="temp.brokerServiceUrl" placeholder="pulsar://"/>
          </el-form-item>
          <el-form-item :label="$t('cluster.brokerServiceUrlTlsPrefix')" prop="brokerServiceUrlTls">
            <el-input v-model="temp.brokerServiceUrlTls" placeholder="pulsar+ssl://"/>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="handleOptions()">{{ $t('table.confirm') }}</el-button>
            <el-button @click="dialogFormVisible = false">{{ $t('table.cancel') }}</el-button>
          </el-form-item>
        </div>
        <div v-if="dialogStatus==='delete'">
          <el-form-item>
            <h4>Are you sure you want to delete this cluster?</h4>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="deleteCluster()">{{ $t('table.confirm') }}</el-button>
            <el-button @click="dialogFormVisible = false">{{ $t('table.cancel') }}</el-button>
          </el-form-item>
        </div>
      </el-form>
    </el-dialog>
  </div>
</template>

<script>
import {
  fetchClusters,
  putCluster,
  fetchClusterConfig,
  deleteCluster
} from '@/api/clusters'
import waves from '@/directive/waves' // Waves directive
import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
import jsonEditor from '@/components/JsonEditor'
import { validateEmpty } from '@/utils/validate'
import MdInput from '@/components/MDinput'

export default {
  name: 'Clusters',
  components: {
    Pagination,
    jsonEditor,
    MdInput
  },
  directives: { waves },
  filters: {
    statusFilter(status) {
      const statusMap = {
        published: 'success',
        draft: 'info',
        deleted: 'danger'
      }
      return statusMap[status]
    }
  },
  data() {
    return {
      tableKey: 0,
      list: null,
      localList: [],
      peerClustersListOptions: [],
      domainNamesListOptions: [],
      searchList: [],
      total: 0,
      listLoading: true,
      jsonValue: {},
      listQuery: {
        cluster: '',
        page: 1,
        limit: 10
      },
      currentCluster: '',
      currentCommand: '',
      temp: {
        cluster: '',
        serviceUrl: '',
        serviceUrlTls: '',
        brokerServiceUrl: '',
        brokerServiceUrlTls: '',
        peerClusters: [],
        domainNames: '',
        brokerList: '',
        domainName: ''
      },
      dialogFormVisible: false,
      dialogStatus: '',
      textMap: {
        delete: 'Delete Cluster',
        create: 'Add a new cluster'
      },
      dialogPvVisible: false,
      rules: {
        cluster: [{ required: true, message: 'cluster name is required', trigger: 'change' }],
        serviceUrl: [{ required: true, message: 'serviceUrl is required', trigger: 'change' }],
        domainName: [{ required: true, message: 'domainName is required', trigger: 'change' }],
        domainNames: [{ required: true, message: 'domainNames is required', trigger: 'change' }]
      }
    }
  },
  created() {
    this.getClusters()
  },
  methods: {
    getClusters() {
      if (this.localList.length > 0) {
        setTimeout(() => {
          this.localPaging()
        }, 0.5 * 1000)
      } else {
        this.listLoading = true
        fetchClusters(this.listQuery).then(response => {
          for (var i = 0; i < response.data.data.length; i++) {
            this.localList.push({
              'cluster': response.data.data[i]['cluster'],
              'brokers': response.data.data[i]['brokers'],
              'serviceUrl': response.data.data[i]['serviceUrl'],
              'brokerServiceUrl': response.data.data[i]['brokerServiceUrl']
            })
          }
          this.total = this.localList.length
          this.list = this.localList.slice((this.listQuery.page - 1) * this.listQuery.limit, this.listQuery.limit * this.listQuery.page)
          // Just to simulate the time of the request
          setTimeout(() => {
            this.listLoading = false
          }, 1.5 * 1000)
        })
      }
    },
    localPaging() {
      this.listLoading = true
      if (!validateEmpty(this.listQuery.cluster)) {
        this.searchList = []
        for (var i = 0; i < this.localList.length; i++) {
          if (this.localList[i]['cluster'].indexOf(this.listQuery.cluster) !== -1) {
            this.searchList.push(this.localList[i])
          }
        }
        this.total = this.searchList.length
        this.list = this.searchList.slice((this.listQuery.page - 1) * this.listQuery.limit, this.listQuery.limit * this.listQuery.page)
      } else {
        this.total = this.localList.length
        this.list = this.localList.slice((this.listQuery.page - 1) * this.listQuery.limit, this.listQuery.limit * this.listQuery.page)
      }
      this.listLoading = false
    },
    handleGetConfig(row) {
      this.temp = Object.assign({}, row) // copy obj
      fetchClusterConfig(this.temp.cluster).then(response => {
        this.jsonValue = {
          'serviceUrl': response.data.serviceUrl,
          'serviceUrlTls': response.data.serverUrlTls,
          'brokerServiceUrl': response.data.brokerServiceUrl,
          'brokerServiceUrlTsl': response.data.brokerServiceUrlTls
        }
      })
    },
    handleFilter() {
      this.listQuery.page = 1
      this.getClusters()
    },
    resetTemp() {
      this.temp = {
        cluster: '',
        serviceUrl: '',
        serviceUrlTls: '',
        brokerServiceUrl: '',
        brokerServiceUrlTls: ''
      }
    },
    handleCreate() {
      this.resetTemp()
      this.dialogStatus = 'create'
      this.dialogFormVisible = true
      this.$nextTick(() => {
        this.$refs['temp'].clearValidate()
      })
    },
    createData() {
      putCluster(this.temp.cluster, this.temp).then(response => {
        this.dialogFormVisible = false
        this.localList = []
        this.getClusters()
        this.$notify({
          title: 'success',
          message: 'create success',
          type: 'success',
          duration: 2000
        })
      })
    },
    handleOptions() {
      this.$refs['temp'].validate((valid) => {
        if (valid) {
          switch (this.dialogStatus) {
            case 'create':
              this.createData()
              break
          }
        }
      })
    },
    handleCommand(command) {
      if (this.currentCluster.length <= 0) {
        this.$notify({
          title: 'error',
          message: 'Please select any cluster in table',
          type: 'error',
          duration: 2000
        })
        return
      }
      this.currentCommand = command
      switch (this.currentCommand) {
        case 'domain-name-create':
          this.handleDomainNameCreate()
          break
      }
    },
    handleDelete(row) {
      this.dialogStatus = 'delete'
      this.dialogFormVisible = true
      this.temp.cluster = row.cluster
    },
    deleteCluster() {
      deleteCluster(this.temp.cluster).then(response => {
        this.$notify({
          title: 'success',
          message: 'Delete success',
          type: 'success',
          duration: 2000
        })
        this.dialogFormVisible = false
        this.localList = []
        this.getClusters()
      })
    }
  }
}
</script>

<style>
.el-dialog {
  width: 35%;
}
.el-form {
  margin-left: 0% !important;
  margin-right: 0% !important;
}
</style>
