import Request from 'request'

const request = Request.defaults({
  baseUrl: 'http://127.0.0.1:3010',
})

async function asyncRequest(options) {
  return await new Promise((resolve, reject) => {
    request(options, (err, response, body) => {
      if (err) {
        reject(err)
      } else {
        resolve({ response, body })
      }
    })
  })
}

export async function sendGlobalMessage(projectId, userId, content) {
  return await asyncRequest({
    method: 'post',
    url: `/project/${projectId}/messages`,
    json: {
      user_id: userId,
      content,
    },
  })
}

export async function getGlobalMessages(projectId) {
  return await asyncRequest({
    method: 'get',
    url: `/project/${projectId}/messages`,
    json: true,
  })
}

export async function sendMessage(projectId, threadId, userId, content) {
  return await asyncRequest({
    method: 'post',
    url: `/project/${projectId}/thread/${threadId}/messages`,
    json: {
      user_id: userId,
      content,
    },
  })
}

export async function getThreads(projectId) {
  return await asyncRequest({
    method: 'get',
    url: `/project/${projectId}/threads`,
    json: true,
  })
}

export async function resolveThread(projectId, threadId, userId) {
  return await asyncRequest({
    method: 'post',
    url: `/project/${projectId}/thread/${threadId}/resolve`,
    json: {
      user_id: userId,
    },
  })
}

export async function getResolvedThreadIds(projectId) {
  return await asyncRequest({
    method: 'get',
    url: `/project/${projectId}/resolved-thread-ids`,
    json: true,
  })
}

export async function editMessage(projectId, threadId, messageId, content) {
  return await asyncRequest({
    method: 'post',
    url: `/project/${projectId}/thread/${threadId}/messages/${messageId}/edit`,
    json: {
      content,
    },
  })
}

export async function editMessageWithUser(
  projectId,
  threadId,
  messageId,
  userId,
  content
) {
  return await asyncRequest({
    method: 'post',
    url: `/project/${projectId}/thread/${threadId}/messages/${messageId}/edit`,
    json: {
      content,
      userId,
    },
  })
}

export async function checkStatus() {
  return await asyncRequest({
    method: 'get',
    url: `/status`,
    json: true,
  })
}

export async function getMetric(matcher) {
  const { body } = await asyncRequest({
    method: 'get',
    url: `/metrics`,
  })
  const found = body.split('\n').find(matcher)
  if (!found) return 0
  return parseInt(found.split(' ')[1], 0)
}

export async function reopenThread(projectId, threadId) {
  return await asyncRequest({
    method: 'post',
    url: `/project/${projectId}/thread/${threadId}/reopen`,
  })
}

export async function deleteThread(projectId, threadId) {
  return await asyncRequest({
    method: 'delete',
    url: `/project/${projectId}/thread/${threadId}`,
  })
}

export async function deleteMessage(projectId, threadId, messageId) {
  return await asyncRequest({
    method: 'delete',
    url: `/project/${projectId}/thread/${threadId}/messages/${messageId}`,
  })
}

export async function destroyProject(projectId) {
  return await asyncRequest({
    method: 'delete',
    url: `/project/${projectId}`,
  })
}

export async function duplicateCommentThreads(projectId, threads) {
  return await asyncRequest({
    method: 'post',
    url: `/project/${projectId}/duplicate-comment-threads`,
    json: {
      threads,
    },
  })
}

export async function generateThreadData(projectId, threads) {
  return await asyncRequest({
    method: 'post',
    url: `/project/${projectId}/generate-thread-data`,
    json: {
      threads,
    },
  })
}
