import axios from "axios";
import Cookies from 'js-cookie';
import { CustomToast } from "../CustomToast";
import { BaseURL } from "./Endpoints";

const instance = axios.create({
    baseURL: BaseURL,
});

const getRequestLocale = () => Cookies.get('NEXT_LOCALE') || 'en';

instance.interceptors.request.use((config) => {
    const locale = getRequestLocale();
    config.headers.set('Accept-Language', locale);
    config.headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');
    config.headers.set('Pragma', 'no-cache');
    config.headers.set('Expires', '0');

    const method = (config.method ?? 'get').toLowerCase();
    if (method === 'get') {
        config.params = { language_code: locale, ...(config.params ?? {}) };
    }

    return config;
});

const CustomFetch = async ({ ...options }, customURL: any, customHeaders, noMessage: any = true) => {
    let accessToken = Cookies.get('aat') || Cookies.get('bat') || Cookies.get('iat') || Cookies.get('verifyUAT');
    if (customURL) {
        instance.defaults.baseURL = customURL;
    }
    if (customHeaders) {
        instance.defaults.headers.post['Content-Type'] = 'multipart/form-data';
    } else {
        instance.defaults.headers.post['Content-Type'] = 'application/json';
    }
    instance.defaults.headers.authorization = `bearer ${accessToken}`;
    const onSuccess = (response: any) => {
        return response
    }
    const onError = (error: any) => {
        return error
    }
    try {
        const response = await instance(options)
        return onSuccess(response);
    } catch (error: any) {
        if (error?.response?.status == 401) {
            Cookies.remove('aat')
            Cookies.remove('bat')
            Cookies.remove('iat')
            Cookies.remove('verifyUAT')
            Cookies.remove('user_info');

            localStorage.clear();
            sessionStorage.clear();
            CustomToast("error", error?.response?.data?.message)
            window.location.href = '/login';
            return;
        }
        
        noMessage ? CustomToast("error", error?.response?.data?.message ?? error) : null
        return onError(error)
    }
}

export default CustomFetch