import { useEffect, useState } from "react";
import { httpClient } from "../api/httpClient";

/**
 * 前端可读的后端运行时配置。
 *
 * 这些配置由后端 ``.env`` 决定，不涉及敏感信息，
 * 通过 ``GET /api/v1/config/runtime`` 暴露。
 * 为了避免每个组件都重复请求，这里维护一个模块级缓存。
 */
export interface RuntimeConfig {
  /** PDF 预览渲染策略：``iframe`` 使用浏览器内置预览器，``pdfjs`` 使用自托管 pdfjs-dist。 */
  pdfViewerEngine: "iframe" | "pdfjs";
}

const DEFAULT_CONFIG: RuntimeConfig = { pdfViewerEngine: "iframe" };

let inflight: Promise<RuntimeConfig> | null = null;
let cached: RuntimeConfig | null = null;

function normalizeConfig(value: unknown): RuntimeConfig {
  if (!value || typeof value !== "object") return DEFAULT_CONFIG;
  const engine = (value as { pdfViewerEngine?: unknown }).pdfViewerEngine;
  return {
    pdfViewerEngine:
      engine === "pdfjs" || engine === "iframe" ? engine : "iframe",
  };
}

/**
 * 加载运行时配置；同进程内只发起一次请求并缓存结果。
 * 失败时静默回退到默认值，确保离线/降级时仍可使用 iframe 兜底。
 */
export function loadRuntimeConfig(): Promise<RuntimeConfig> {
  if (cached) return Promise.resolve(cached);
  if (inflight) return inflight;
  inflight = httpClient
    .get<RuntimeConfig>("config/runtime", { auth: false })
    .then((result) => {
      cached = normalizeConfig(result.data);
      return cached;
    })
    .catch(() => {
      cached = DEFAULT_CONFIG;
      return cached;
    })
    .finally(() => {
      inflight = null;
    });
  return inflight;
}

/** 仅用于测试：重置模块级缓存。 */
export function __resetRuntimeConfigForTests(): void {
  cached = null;
  inflight = null;
}

/**
 * 在 React 组件中订阅 PDF 预览引擎。
 * 默认返回 ``iframe``，待运行时配置加载完成后切换。
 */
export function usePdfViewerEngine(): "iframe" | "pdfjs" {
  const [engine, setEngine] = useState<"iframe" | "pdfjs">("iframe");
  useEffect(() => {
    let cancelled = false;
    void loadRuntimeConfig().then((config) => {
      if (!cancelled) setEngine(config.pdfViewerEngine);
    });
    return () => {
      cancelled = true;
    };
  }, []);
  return engine;
}
