<!--
  ~ 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>
  <div class="__container_services_tabs_distribution">
    <a-flex vertical>
      <a-flex class="service-filter">
        <a-radio-group v-model:value="type" button-style="solid" @click="debounceSearch">
          <a-radio-button value="producer">生产者</a-radio-button>
          <a-radio-button value="consumer">消费者</a-radio-button>
        </a-radio-group>
        <a-input-search
          v-model:value="searchValue"
          placeholder="搜索应用，ip，支持前缀搜索"
          class="service-filter-input"
          @search="debounceSearch"
          enter-button
        />
      </a-flex>
      <a-table
        :columns="tableColumns"
        :data-source="tableData"
        :scroll="{ y: '45vh' }"
        :pagination="pagination"
      >
        <template #bodyCell="{ column, text }">
          <template v-if="column.dataIndex === 'applicationName'">
            <span class="link" @click="router.push('/resources/applications/detail/' + text)">
              <b>
                <Icon
                  style="margin-bottom: -2px"
                  icon="material-symbols:attach-file-rounded"
                ></Icon>
                {{ text }}
              </b>
            </span>
          </template>
          <template v-if="column.dataIndex === 'instanceName'">
            <span class="link" @click="router.push('/resources/instances/detail/' + text)">
              <b>
                <Icon
                  style="margin-bottom: -2px"
                  icon="material-symbols:attach-file-rounded"
                ></Icon>
                {{ text }}
              </b>
            </span>
          </template>
          <template v-if="column.dataIndex === 'label'">
            <a-tag :color="PRIMARY_COLOR">{{ text }}</a-tag>
          </template>
        </template>
      </a-table>
    </a-flex>
  </div>
</template>

<script setup lang="ts">
import type { ComponentInternalInstance } from 'vue'
import { ref, reactive, getCurrentInstance } from 'vue'
import { useRouter } from 'vue-router'
import { getServiceDistribution } from '@/api/service/service'
import { debounce } from 'lodash'
import { PRIMARY_COLOR } from '@/base/constants'
import { Icon } from '@iconify/vue'

let __null = PRIMARY_COLOR
const router = useRouter();
const {
  appContext: {
    config: { globalProperties }
  }
} = <ComponentInternalInstance>getCurrentInstance()

const searchValue = ref('')
const versionAndGroupOptions = reactive([
  {
    label: '不指定',
    value: ''
  },
  {
    label: 'version=1.0.0',
    value: 'version=1.0.0'
  },
  {
    label: 'group=group1',
    value: 'group=group1'
  },
  {
    label: 'version=1.0.0,group=group1',
    value: 'version=1.0.0,group=group1'
  }
])
const versionAndGroup = ref(versionAndGroupOptions[0].value)
const type = ref('producer')

const tableColumns = [
  {
    title: '应用名',
    dataIndex: 'applicationName',
    width: '20%',
    customCell: (_, index) => {
      if (index === 0) {
        return { rowSpan: tableData.value.length }
      } else {
        return { rowSpan: 0 }
      }
    }
  },
  {
    title: '实例数',
    dataIndex: 'instanceNum',
    width: '15%',
    customCell: (_, index) => {
      if (index === 0) {
        return { rowSpan: tableData.value.length }
      } else {
        return { rowSpan: 0 }
      }
    }
  },
  {
    title: '实例名',
    dataIndex: 'instanceName',
    width: '15%'
  },
  {
    title: 'RPC端口',
    dataIndex: 'rpcPort',
    width: '15%'
  },
  {
    title: '超时时间',
    dataIndex: 'timeout',
    width: '10%'
  },
  {
    title: '重试次数',
    dataIndex: 'retryNum',
    width: '10%'
  },
  {
    title: '标签',
    dataIndex: 'label',
    width: '15%'
  }
]

const tableData = ref([])

const onSearch = async () => {
  let { data } = await getServiceDistribution({})
  tableData.value = data.data
}
onSearch()

const debounceSearch = debounce(onSearch, 300)

const pagination = {
  showTotal: (v: any) =>
    globalProperties.$t('searchDomain.total') +
    ': ' +
    v +
    ' ' +
    globalProperties.$t('searchDomain.unit')
}
</script>

<style lang="less" scoped>
.__container_services_tabs_distribution {
  .service-filter {
    margin-bottom: 20px;
    .service-filter-select {
      margin-left: 10px;
      width: 250px;
    }
    .service-filter-input {
      margin-left: 30px;
      width: 300px;
    }
  }
  .link {
    padding: 4px 10px 4px 4px;
    border-radius: 4px;
    color: v-bind('PRIMARY_COLOR');
    &:hover {
      cursor: pointer;
      background: rgba(133, 131, 131, 0.13);
    }
  }
}
</style>
