// plugins/axios.ts
import axios from "axios";
// @ts-ignore
import {defineNuxtPlugin, useRuntimeConfig} from "#app";

function makeid(length: number) {
    let result = "";
    const characters =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    const charactersLength = characters.length;
    let counter = 0;
    while (counter < length) {
        result += characters.charAt(Math.floor(Math.random() * charactersLength));
        counter += 1;
    }
    return result;
}

export default defineNuxtPlugin(() => {
    const config = useRuntimeConfig();

    const api = axios.create({
        // @ts-ignore
        baseURL: config.public.apiBaseUrl,
    });

    // Request interceptor
    api.interceptors.request.use(
        // @ts-ignore
        (cfg) => {
            const imei = useCookie("imei", {maxAge: 60 * 60 * 24 * 365});
            const token = useCookie("token");

            // @ts-ignore
            if (typeof imei.value === "undefined") {
                // @ts-ignore
                imei.value = makeid(32);
            }

            // تضمین اینکه headers وجود دارد
            cfg.headers = cfg.headers || {};

            // @ts-ignore
            cfg.headers["IMEI"] = imei.value;

            // @ts-ignore
            if (typeof token.value !== "undefined") {
                // @ts-ignore
                cfg.headers["Authorization"] = "Bearer " + token.value;
            }

            return cfg;
        },
        // @ts-ignore
        (error) => Promise.reject(error)
    );

    // Response interceptor
    api.interceptors.response.use(
        // @ts-ignore
        (response) => response,
        // @ts-ignore
        (error) => {
            /**
             * ✅ Cancel / Abort requests:
             * - axios v1 وقتی cancel بشه معمولاً:
             *   error.code === 'ERR_CANCELED'
             * - یا name ممکنه CanceledError / AbortError باشه
             * - در این حالت error.response معمولاً undefined است
             */
            const isCanceled =
                error?.code === "ERR_CANCELED" ||
                error?.name === "CanceledError" ||
                error?.name === "AbortError";

            if (isCanceled) {
                return Promise.reject(error);
            }

            // ✅ safe access
            const status = error?.response?.status;
            const responseData = error?.response?.data;

            // if (status === 401) {
            //   window.location.replace("/auth/login/code");
            // }

            if (status === 500) {
                console.error("Server Error:", responseData);
            }

            return Promise.reject(error);
        }
    );

    return {
        provide: {
            api,
        },
    };
});
