import axios from "axios";
import { requestHeaders } from "../utils/common-helper";
import { refreshToken } from "src/utils/refresh-token";
import { REFRESH_TOKEN } from "./routes";

export const postRequest: any = async (
  URL: any,
  formData?: any,
  token?: any,
  multipart?: boolean
) => {
  try {
    let error: any = null;
    const response: any = await axios
      .post(URL, formData, requestHeaders(token, multipart))
      .catch((e) => {
        error = e.response;
        return error;
      });
    if (response && response.data && response.data.code) {
      const code: any = response.data.code;

      if (code === 401 && URL !== REFRESH_TOKEN) {
        const refreshSuccess = await refreshToken();
        if (refreshSuccess) {
          return postRequest(URL, formData, token, multipart);
        }
      }
    }
    return response;
  } catch (error) {}
};

export const getRequest: any = async (URL: any, token?: any) => {
  try {
    let error: any = null;
    const response: any = await axios
      .get(URL, requestHeaders(token))
      .catch((e) => {
        error = e.response;
        return error;
      });

    if (response && response.data && response.data.code) {
      const code: any = response.data.code;

      if (code === 401) {
        const refreshSuccess = await refreshToken();
        if (refreshSuccess) {
          return getRequest(URL, token);
        }
      }
    }
    return response;
  } catch (error) {}
};

export const putRequest = async (
  URL: any,
  formData: any,
  token?: any,
  multipart?: boolean
) => {
  let error: any = null;
  const response: any = await axios
    .put(URL, formData, requestHeaders(token, multipart))
    .catch((e) => {
      error = e.response;
      return error;
    });

  return response;
};

export const patchRequest: any = async (
  URL: any,
  formData: any,
  token?: any
) => {
  try {
    let error: any = null;
    const response: any = await axios
      .patch(URL, formData, requestHeaders(token))
      .catch((e) => {
        error = e.response;
        return error;
      });

    if (response && response.data && response.data.code) {
      const code: any = response.data.code;

      if (code === 401) {
        const refreshSuccess = await refreshToken();
        if (refreshSuccess) {
          return patchRequest(URL, formData, token);
        }
      }
    }
    return response;
  } catch (error) {}
};

export const deleteRequest: any = async (URL: any, token?: any) => {
  try {
    let error: any = null;
    const response: any = await axios
      .delete(URL, requestHeaders(token))
      .catch((e) => {
        error = e.response;
        return error;
      });

    if (response && response.data && response.data.code) {
      const code: any = response.data.code;

      if (code === 401) {
        const refreshSuccess = await refreshToken();
        if (refreshSuccess) {
          return deleteRequest(URL, token);
        }
      }
    }
    return response;
  } catch (error) {}
};
