/**
 * MSW 浏览器端 setup（ai14）
 *
 * 开发环境下在浏览器中启动 MSW Service Worker 拦截 GraphQL 请求。
 * 通过 NEXT_PUBLIC_API_MOCKING=enabled 控制是否启用。
 *
 * 重要：setupWorker 仅在浏览器环境调用，SSR 时不执行。
 * worker 实例延迟初始化，避免 Next.js prerender 时报错。
 */

import { handlers } from "./handlers";

/** MSW worker 类型（延迟初始化）*/
type MSWWorker = Awaited<
  ReturnType<(typeof import("msw/browser"))["setupWorker"]>
>;

/** MSW worker 单例（延迟初始化，仅在浏览器环境）*/
let workerInstance: MSWWorker | null = null;

/** MSW worker 是否已启动 */
let isStarted = false;

/**
 * 获取或创建 MSW worker 实例
 *
 * 仅在浏览器环境调用，SSR 时返回 null。
 * 使用动态 import 避免 Next.js prerender 时加载 msw/browser。
 */
async function getOrCreateWorker(): Promise<MSWWorker | null> {
  if (typeof window === "undefined") return null;
  if (workerInstance) return workerInstance;

  const { setupWorker } = await import("msw/browser");
  workerInstance = setupWorker(...handlers);
  return workerInstance;
}

/**
 * 初始化浏览器 MSW mock
 *
 * 仅在 NEXT_PUBLIC_API_MOCKING=enabled 时启动。
 * 启动后拦截 /api/v1/student/graphql 的请求并返回 mock 响应。
 *
 * @returns Promise<void>，启动完成后 resolve
 */
export async function initMocks(): Promise<void> {
  const isMockingEnabled = process.env.NEXT_PUBLIC_API_MOCKING === "enabled";

  if (!isMockingEnabled || isStarted) {
    return;
  }

  const worker = await getOrCreateWorker();
  if (!worker) return;

  await worker.start({
    onUnhandledRequest: "bypass",
    quiet: false,
    serviceWorker: {
      url: "/mockServiceWorker.js",
    },
  });

  isStarted = true;
}

/**
 * 获取 MSW worker 实例（测试用）
 * @returns worker 实例或 null（非浏览器环境）
 */
export function getWorker(): MSWWorker | null {
  return workerInstance;
}

/**
 * 停止 MSW worker
 * @returns Promise<void>
 */
export async function stopMocks(): Promise<void> {
  if (!isStarted || !workerInstance) {
    return;
  }
  await workerInstance.stop();
  isStarted = false;
}
