/*
 * 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 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'
  })
}
