/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */

import { makeGetRequest, makeDeleteRequest, makePostBodyRequest } from '../requests/requests'
import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'

function getAccountBlocklistByAccount (
  url: string,
  token: string,
  start: number,
  count: number,
  sort = '-createdAt',
  statusCodeExpected = HttpStatusCode.OK_200
) {
  const path = '/api/v1/users/me/blocklist/accounts'

  return makeGetRequest({
    url,
    token,
    query: { start, count, sort },
    path,
    statusCodeExpected
  })
}

function addAccountToAccountBlocklist (
  url: string,
  token: string,
  accountToBlock: string,
  statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
  const path = '/api/v1/users/me/blocklist/accounts'

  return makePostBodyRequest({
    url,
    path,
    token,
    fields: {
      accountName: accountToBlock
    },
    statusCodeExpected
  })
}

function removeAccountFromAccountBlocklist (
  url: string,
  token: string,
  accountToUnblock: string,
  statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
  const path = '/api/v1/users/me/blocklist/accounts/' + accountToUnblock

  return makeDeleteRequest({
    url,
    path,
    token,
    statusCodeExpected
  })
}

function getServerBlocklistByAccount (
  url: string,
  token: string,
  start: number,
  count: number,
  sort = '-createdAt',
  statusCodeExpected = HttpStatusCode.OK_200
) {
  const path = '/api/v1/users/me/blocklist/servers'

  return makeGetRequest({
    url,
    token,
    query: { start, count, sort },
    path,
    statusCodeExpected
  })
}

function addServerToAccountBlocklist (
  url: string,
  token: string,
  serverToBlock: string,
  statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
  const path = '/api/v1/users/me/blocklist/servers'

  return makePostBodyRequest({
    url,
    path,
    token,
    fields: {
      host: serverToBlock
    },
    statusCodeExpected
  })
}

function removeServerFromAccountBlocklist (
  url: string,
  token: string,
  serverToBlock: string,
  statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
  const path = '/api/v1/users/me/blocklist/servers/' + serverToBlock

  return makeDeleteRequest({
    url,
    path,
    token,
    statusCodeExpected
  })
}

function getAccountBlocklistByServer (
  url: string,
  token: string,
  start: number,
  count: number,
  sort = '-createdAt',
  statusCodeExpected = HttpStatusCode.OK_200
) {
  const path = '/api/v1/server/blocklist/accounts'

  return makeGetRequest({
    url,
    token,
    query: { start, count, sort },
    path,
    statusCodeExpected
  })
}

function addAccountToServerBlocklist (
  url: string,
  token: string,
  accountToBlock: string,
  statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
  const path = '/api/v1/server/blocklist/accounts'

  return makePostBodyRequest({
    url,
    path,
    token,
    fields: {
      accountName: accountToBlock
    },
    statusCodeExpected
  })
}

function removeAccountFromServerBlocklist (
  url: string,
  token: string,
  accountToUnblock: string,
  statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
  const path = '/api/v1/server/blocklist/accounts/' + accountToUnblock

  return makeDeleteRequest({
    url,
    path,
    token,
    statusCodeExpected
  })
}

function getServerBlocklistByServer (
  url: string,
  token: string,
  start: number,
  count: number,
  sort = '-createdAt',
  statusCodeExpected = HttpStatusCode.OK_200
) {
  const path = '/api/v1/server/blocklist/servers'

  return makeGetRequest({
    url,
    token,
    query: { start, count, sort },
    path,
    statusCodeExpected
  })
}

function addServerToServerBlocklist (
  url: string,
  token: string,
  serverToBlock: string,
  statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
  const path = '/api/v1/server/blocklist/servers'

  return makePostBodyRequest({
    url,
    path,
    token,
    fields: {
      host: serverToBlock
    },
    statusCodeExpected
  })
}

function removeServerFromServerBlocklist (
  url: string,
  token: string,
  serverToBlock: string,
  statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
  const path = '/api/v1/server/blocklist/servers/' + serverToBlock

  return makeDeleteRequest({
    url,
    path,
    token,
    statusCodeExpected
  })
}

// ---------------------------------------------------------------------------

export {
  getAccountBlocklistByAccount,
  addAccountToAccountBlocklist,
  removeAccountFromAccountBlocklist,
  getServerBlocklistByAccount,
  addServerToAccountBlocklist,
  removeServerFromAccountBlocklist,

  getAccountBlocklistByServer,
  addAccountToServerBlocklist,
  removeAccountFromServerBlocklist,
  getServerBlocklistByServer,
  addServerToServerBlocklist,
  removeServerFromServerBlocklist
}
