// TODO: Set according return types and don't use 'any' explicitly. Nor implicitly.
// Basically don't use 'any' in any context whatsoever. Despite it being the easiest solution.

/* eslint-disable @typescript-eslint/explicit-function-return-type */
/* eslint-disable @typescript-eslint/no-explicit-any */
import axios from 'axios';

require('dotenv').config();

const instance = axios.create({
  baseURL: process.env.AUTH_BASE_URL,
});

export const validate = async (token: string) => {
  const id = await instance.post('/validate', { token });
  return id.data;
};

const create = async (user: any) => {
  const res = await instance.post('/', user);
  return res.data;
};

const login = async (user: any) => {
  const res = await instance.post('/login', user);
  return res.data;
};

const listUsers = async (userType: any, givenLimit: any, givenOffset: any,
  givenSearch: any, token: string) => {
  const res = await instance.get('/', {
    headers: { authorization: token },
    params: {
      type: userType,
      limit: givenLimit,
      offset: givenOffset,
      search: givenSearch,
    },
  });
  return res.data;
};

const update = async (user: any, idUser: string, token: string) => {
  const url = `/${idUser}`;
  const res = await instance.put(url, user, { headers: { authorization: token } });
  return res.data;
};

// const password = async (user: any, idUser: string, token: string) => {
//   const url = `/${idUser}/password`;
//   const res = await instance.put(url, user, { headers: { authorization: token } });
//   return res.data;
// };

const approve = async (idUser: string, token: string) => {
  const url = `/${idUser}/approve`;
  const res = await instance.put(url, {}, { headers: { authorization: token } });
  return res.data;
};

const cancel = async (idUser: string, token: string) => {
  const url = `/${idUser}/cancel`;
  const res = await instance.put(url, {}, { headers: { authorization: token } });
  return res.data;
};

const giveAdminPermission = async (idUser: string, token: string) => {
  const url = `/${idUser}/admin`;
  const res = await instance.put(url, {}, { headers: { authorization: token } });
  return res.data;
};

const removeAdminPermission = async (idUser: string, token: string) => {
  const url = `/${idUser}/client`;
  const res = await instance.put(url, {}, { headers: { authorization: token } });
  return res.data;
};

const listUsersById = async (userIds: any, token: any) => {
  const url = '/usersById';
  const res = await instance.post(url, userIds, { headers: { authorization: token } });
  return res.data;
};

export const checkUser = async (token: string) => {
  const url = '/check-user';
  const res = await instance.post(url, {}, { headers: { authorization: token } });
  return res.data;
};

const getUser = async (userId: number, token: string) => {
  const url = `/${userId}`;
  const res = await instance.get(url, { headers: { authorization: token } });
  return res.data;
};

const verifyEmail = async (userToken: string) => {
  const url = '/verify-email';
  const res = await instance.put(url, {}, { params: { token: userToken } });
  return res.data;
};

const resendVerification = async (userEmail: string) => {
  const url = '/resend-verification';
  const res = await instance.post(url, { email: userEmail });
  return res.data;
};

const recoverPassword = async (userEmail: string) => {
  const url = '/recover-password';
  const res = await instance.post(url, { email: userEmail });
  return res.data;
};

const recoveryPasswordChange = async (userToken: string, userPassword: string,
  userRepeat: string) => {
  const url = '/password';
  const res = await instance.put(url,
    { token: userToken, password: userPassword, repeat: userRepeat });
  return res.data;
};

export default {
  create,
  login,
  listUsers,
  update,
  // password,
  approve,
  cancel,
  giveAdminPermission,
  removeAdminPermission,
  listUsersById,
  getUser,
  verifyEmail,
  resendVerification,
  recoverPassword,
  recoveryPasswordChange,
};