import { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from "axios";
import { getApiAuthorization } from "../api";

const onRequest = (request: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {
  request.headers.Authorization = getApiAuthorization();
  return request;
};

const onRequestError = (error: AxiosError): Promise<AxiosError> => {
  /*console.group("[request error]");
  console.dir(error);
  console.groupEnd();*/

  return Promise.reject(error);
};

const onResponse = (response: AxiosResponse): AxiosResponse => {
  /*console.group("[response]");
  console.dir(response);
  console.groupEnd();*/

  const config = response?.config;
  if (config.raw) {
    return response;
  }

  /*if (response.status === 200) {
    const data = response?.data;
    if (!data) {
      throw new HttpError("API Error. No data!");
    }
    return data;
  }*/
  //throw new HttpError("API Error! Invalid status code!");

  return response;
};

const onResponseError = (error: AxiosError): Promise<AxiosError> => {
  console.debug("[response error]");

  if (error.response) {
    // La respuesta fue hecha y el servidor respondió con un código de estado
    // que esta fuera del rango de 2xx
    console.debug("1 => El servidor respondió con un código de estado > 200");

    const data = error.response.data;
    const status = error.response.status;

    console.debug(data);
    console.debug(status);

    /*

      {
        detail: "Quote data not valid",
        instance: "/api/v1/quotes",
        status: 422,
        title: "Unprocessable Entity",
        type: "about:blank",
        context: {
          params: {
          },
          query: {
          },
          body: {
            date: "2024-08-13",
            customer_information: "",
            reference: "",
            status: "draft",
            id: "9c1c6073-127a-4bde-a73c-6229efb51ad0",
          },
        },
        extra: {
          errors: [
            {
              reference: "{reference} is not allowed to be empty",
            },
            {
              customer_information: "{customer_information} is not allowed to be empty",
            },
          ],
        },
      }
  
  */

    switch (status) {
      case 400:
        console.error("Bad Request");
        break;
      case 401:
        console.error("UnAuthorized");
        //window.location.href = "/logout";
        break;
      case 403:
        console.error("Forbidden");
        break;
      /*AppEvents.publish(Events.N_Error, {
      message: "Forbidden",
      description: "Operation ",
    });*/
      case 404:
        console.error("Not found");
        break;

      case 422:
        console.error("Unprocessable Content");
        break;
    }
    return Promise.reject(data);
  } else if (error.request) {
    // La petición fue hecha pero no se recibió respuesta
    console.debug("2 => El servidor no respondió");
    console.error(error);
  } else {
    if (error.code === "ERR_CANCELED") {
      // La petición fue hecha pero se ha cancelado
      console.debug("3 => Petición cancelada");
    } else {
      // Algo paso al preparar la petición que lanzo un Error
      console.debug("4 => Error desconocido");
      console.error(error);
    }
  }
  console.groupEnd();
  return Promise.reject(error);
};

export function setupInterceptorsTo(axiosInstance: AxiosInstance): AxiosInstance {
  axiosInstance.interceptors.request.use(onRequest, onRequestError);
  axiosInstance.interceptors.response.use(onResponse, onResponseError);
  return axiosInstance;
}
