/*
 * Licensed 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.
 */
import request from '@/utils/request'

const SPRING_BASE_URL_V2 = '/pulsar-manager/admin/v2'

const BASE_URL_V2 = '/admin/v2'

const LOOP_V2 = '/lookup/v2/topic'

export function fetchTopics(tenant, namespace, query) {
  return request({
    url: BASE_URL_V2 + `/persistent/${tenant}/${namespace}`,
    method: 'get',
    params: { query }
  })
}

export function fetchTopicsByPulsarManager(tenant, namespace, query) {
  return request({
    url: SPRING_BASE_URL_V2 + `/topics/${tenant}/${namespace}`,
    method: 'get',
    params: { query }
  })
}

export function fetchTopicsStatsByPulsarManager(tenant, namespace, query) {
  return request({
    url: SPRING_BASE_URL_V2 + `/topics/${tenant}/${namespace}/stats`,
    method: 'get',
    params: { query }
  })
}

export function fetchPersistentPartitonsTopics(tenant, namespace) {
  return request({
    url: BASE_URL_V2 + `/persistent/${tenant}/${namespace}/partitioned`,
    method: 'get'
  })
}

export function fetchNonPersistentPartitonsTopics(tenant, namespace) {
  return request({
    url: BASE_URL_V2 + `/non-persistent/${tenant}/${namespace}/partitioned`,
    method: 'get'
  })
}

export function fetchTopicStats(persistent, tenantNamespaceTopic) {
  return request({
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/stats`,
    method: 'get'
  })
}

export function fetchTopicStatsInternal(persistent, tenantNamespaceTopic) {
  return request({
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/internalStats`,
    method: 'get'
  })
}

export function fetchPartitionTopicStats(persistent, tenantNamespaceTopic, perPartition) {
  return request({
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/partitioned-stats?perPartition=${perPartition}`,
    method: 'get'
  })
}

export function putTopic(persistent, tenant, namespace, topic, data) {
  var url = `/${persistent}/${tenant}/${namespace}/${topic}`
  if (data > 0) {
    url += '/partitions'
  }
  return request({
    headers: { 'Content-Type': 'application/json' },
    url: BASE_URL_V2 + url,
    method: 'put',
    data
  })
}

export function putTopicByPartition(persistent, tenant, namespace, topic, data) {
  return request({
    headers: { 'Content-Type': 'application/json' },
    url: BASE_URL_V2 + `/${persistent}/${tenant}/${namespace}/${topic}/partitions`,
    method: 'put',
    data
  })
}

export function putNonPersistentTopic(tenant, namespace, topic) {
  return request({
    headers: { 'Content-Type': 'application/json' },
    url: BASE_URL_V2 + `/non-persistent/${tenant}/${namespace}/${topic}`,
    method: 'put'
  })
}

export function putNonPersistentPartitionedTopic(tenant, namespace, topic, data) {
  return request({
    headers: { 'Content-Type': 'application/json' },
    url: BASE_URL_V2 + `/non-persistent/${tenant}/${namespace}/${topic}`,
    method: 'put',
    data
  })
}

export function getPartitionMetadata(tenantNamespaceTopic) {
  return request({
    url: BASE_URL_V2 + `/persistent/${tenantNamespaceTopic}/partitions`,
    method: 'get'
  })
}

export function updateTopic(tenantNamespaceTopic, data) {
  return request({
    headers: { 'Content-Type': 'application/json' },
    url: BASE_URL_V2 + `/persistent/${tenantNamespaceTopic}/partitions`,
    method: 'post',
    data
  })
}

export function deleteTopic(persistent, tenantNamespaceTopic) {
  return deleteTopicOnCluster('', persistent, tenantNamespaceTopic)
}

export function deleteTopicOnCluster(cluster, persistent, tenantNamespaceTopic) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}`,
    method: 'delete'
  })
}

export function deletePartitionTopicOnCl(persistent, tenantNamespaceTopic) {
  return deletePartitionTopicOnCluster('', persistent, tenantNamespaceTopic)
}

export function deletePartitionTopicOnCluster(cluster, persistent, tenantNamespaceTopic) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/partitions`,
    method: 'delete'
  })
}

export function getPermissionsOnCluster(cluster, persistent, tenantNamespaceTopic) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/permissions`,
    method: 'get'
  })
}

export function grantPermissionsOnCluster(cluster, persistent, tenantNamespaceTopic, role, data) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/permissions/${role}`,
    method: 'post',
    data
  })
}

export function revokePermissionsOnCluster(cluster, persistent, tenantNamespaceTopic, role) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/permissions/${role}`,
    method: 'delete'
  })
}

export function getPermissions(tenantNamespaceTopic) {
  return request({
    url: BASE_URL_V2 + `/persistent/${tenantNamespaceTopic}/permissions`,
    method: 'get'
  })
}

export function grantPermissions(tenantNamespaceTopic, role, data) {
  return request({
    url: BASE_URL_V2 + `/persistent/${tenantNamespaceTopic}/permissions/${role}`,
    method: 'post',
    data
  })
}

export function revokePermissions(tenantNamespaceTopic, role) {
  return request({
    url: BASE_URL_V2 + `/persistent/${tenantNamespaceTopic}/permissions/${role}`,
    method: 'delete'
  })
}

export function unload(persistent, tenantNamespaceTopic) {
  return unloadOnCluster('', persistent, tenantNamespaceTopic)
}

export function unloadOnCluster(cluster, persistent, tenantNamespaceTopic) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/unload`,
    method: 'put'
  })
}

export function skip(persistent, tenantNamespaceTopic, subName, numMessages) {
  return request({
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/skip/${numMessages}`,
    method: 'post'
  })
}

export function skipOnCluster(cluster, persistent, tenantNamespaceTopic, subName, numMessages) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/skip/${numMessages}`,
    method: 'post'
  })
}

export function clearBacklog(persistent, tenantNamespaceTopic, subName) {
  return request({
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/skip_all`,
    method: 'post'
  })
}

export function clearBacklogOnCluster(cluster, persistent, tenantNamespaceTopic, subName) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/skip_all`,
    method: 'post'
  })
}

export function expireMessage(persistent, tenantNamespaceTopic, subName, expireTimeInSeconds) {
  return request({
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/expireMessages/${expireTimeInSeconds}`,
    method: 'post'
  })
}

export function expireMessageOnCluster(cluster, persistent, tenantNamespaceTopic, subName, expireTimeInSeconds) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/expireMessages/${expireTimeInSeconds}`,
    method: 'post'
  })
}

export function expireMessagesAllSubscriptionsOnCluster(cluster, persistent, tenantNamespaceTopic, expireTimeInSeconds) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/all_subscription/expireMessages/${expireTimeInSeconds}`,
    method: 'post'
  })
}

export function peekMessages(persistent, tenantNamespaceTopic, subName, messagePosition) {
  return request({
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/position/${messagePosition}`,
    method: 'get'
  })
}

export function resetCursorByTimestamp(persistent, tenantNamespaceTopic, subName, timestamp) {
  return request({
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/resetcursor/${timestamp}`,
    method: 'post'
  })
}

export function resetCursorByTimestampOnCluster(cluster, persistent, tenantNamespaceTopic, subName, timestamp) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/resetcursor/${timestamp}`,
    method: 'post'
  })
}

export function resetCursorByPosition(persistent, tenantNamespaceTopic, subName, data) {
  return request({
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/resetcursor`,
    method: 'post',
    data
  })
}

export function resetCursorByPositionOnCluster(cluster, persistent, tenantNamespaceTopic, subName, data) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/subscription/${subName}/resetcursor`,
    method: 'post',
    data
  })
}

export function resetPersistentCursor(tenantNamespaceTopic, subName, timestamp, data) {
  return request({
    url: BASE_URL_V2 + `/persistent/${tenantNamespaceTopic}/subscription/${subName}/resetcursor/${timestamp}`,
    method: 'post',
    data
  })
}

export function resetNonPersistentCursor(tenantNamespaceTopic, subName, timestamp, data) {
  return request({
    url: BASE_URL_V2 + `/non-persistent/${tenantNamespaceTopic}/subscription/${subName}/resetcursor/${timestamp}`,
    method: 'post',
    data
  })
}

export function terminate(persistent, tenantNamespaceTopic) {
  return terminateOnCluster('', persistent, tenantNamespaceTopic)
}

export function terminateOnCluster(cluster, persistent, tenantNamespaceTopic) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/terminate`,
    method: 'post'
  })
}

export function compact(persistent, tenantNamespaceTopic) {
  return compactOnCluster('', persistent, tenantNamespaceTopic)
}

export function compactOnCluster(cluster, persistent, tenantNamespaceTopic) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/compaction`,
    method: 'put'
  })
}

export function compactionStatus(persistent, tenantNamespaceTopic, data) {
  return compactionStatusOnCluster('', persistent, tenantNamespaceTopic, data)
}

export function compactionStatusOnCluster(cluster, persistent, tenantNamespaceTopic, data) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/compaction`,
    method: 'get',
    data
  })
}

export function offload(persistent, tenantNamespaceTopic, data) {
  return offloadOnCluster('', persistent, tenantNamespaceTopic, data)
}
export function offloadOnCluster(cluster, persistent, tenantNamespaceTopic, data) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/offload`,
    method: 'put',
    data
  })
}

export function offloadStatus(persistent, tenantNamespaceTopic, data) {
  return offloadStatusOnCluster('', persistent, tenantNamespaceTopic, data)
}

export function offloadStatusOnCluster(cluster, persistent, tenantNamespaceTopic, data) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: BASE_URL_V2 + `/${persistent}/${tenantNamespaceTopic}/offload`,
    method: 'get',
    data
  })
}

export function getBundleRange(persistent, tenantNamespaceTopic) {
  return getBundleRangeOnCluster('', persistent, tenantNamespaceTopic)
}

export function getBundleRangeOnCluster(cluster, persistent, tenantNamespaceTopic) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: LOOP_V2 + `/${persistent}/${tenantNamespaceTopic}/bundle`,
    method: 'get'
  })
}

export function getTopicBroker(persistent, tenantNamespaceTopic) {
  return getTopicBrokerOnCluster('', persistent, tenantNamespaceTopic)
}

export function getTopicBrokerOnCluster(cluster, persistent, tenantNamespaceTopic) {
  return request({
    headers: {
      'Content-Type': 'application/json',
      'x-pulsar-cluster': cluster
    },
    url: LOOP_V2 + `/${persistent}/${tenantNamespaceTopic}`,
    method: 'get'
  })
}
