import type { $Fetch } from "ofetch";
import { useRuntimeConfig, useRouter } from "#app"; // 引入 useRouter
import { ofetch } from "ofetch";

type RequestStatusErrorHandler = (message: string, statusCode: number) => void;
let requestStatusErrorHandler: RequestStatusErrorHandler;

let request: $Fetch;

export function setupRequest() {
  if (request) return request;

  const config = useRuntimeConfig();
  const baseURL = config.public.apiBase as string;
  request = ofetch.create({
    baseURL,
    headers: { "Content-Type": "application/json" },
    async onRequest({ options }) {
      const token = useCookie("token").value;
      if (token) {
        options.headers = {
          ...options.headers,
          ...(token && { Authorization: `${token}` }), // 确保 token 被添加到 headers
        }
      }
    },
    async onResponseError({ response }) {
      const { message } = response._data;
      console.log(response._data)
      if (response._data.statusCode == 500) {
        const router = useRouter();
        router.push('/login'); // 跳转到登录页面
        showFailToast('连接失败,请联系在线客服')
      }
      // 检查状态码并处理跳转
      if (Array.isArray(message)) {
        message.forEach((item) => {
          requestStatusErrorHandler?.(item, response.status);
        });
      } else {
        requestStatusErrorHandler?.(message, response.status);
      }
      return Promise.reject(response._data);
    },
    retry: 3,
    retryDelay: 1000,
  });
}

export function injectRequestStatusErrorHandler(
  handler: RequestStatusErrorHandler
) {
  requestStatusErrorHandler = handler;
}

export function getRequest() {
  if (!request) {
    throw new Error("Request client not initialized. Call setupRequest first.");
  }
  return request;
}

// 封装 GET 请求
export const get = async (url: string, params: Record<string, any> = {}) => {
  const response = await getRequest()(url, {
    method: "GET",
    params,
  });
  return handleResponse(response);
};

// 封装 POST 请求
export const post = async (url: string, data: Record<string, any> = {}) => {
  const response = await getRequest()(url, {
    method: "POST",
    body: data,
  });
  return handleResponse(response);
};

// 封装 PUT 请求
export const put = async (url: string, data: Record<string, any> = {}) => {
  const response = await getRequest()(url, {
    method: "PUT",
    body: data,
  });
  return handleResponse(response);
};

// 封装 DELETE 请求
export const del = async (url: string, data: Record<string, any> = {}) => {
  const response = await getRequest()(url, {
    method: "DELETE",
    body: data,
  });
  return handleResponse(response);
};

// 处理响应对象
const handleResponse = (response) => {
  if (response.code === 401) {
    const router = useRouter();
    router.push('/login'); // 跳转到登录页面
  }
  if (response && response.data) {
    return response; // 返回处理后的数据
  }
  return response; // 如果没有数据,直接返回响应
};

export default request;