/**
 * Web Vitals 上报（ai14，P6 硬化）
 *
 * 采集 LCP / INP / CLS / TTFB，通过 sendBeacon 上报到 /api/v1/admin/web-vitals。
 * 仅在配置了可观测性端点时上报，避免开发环境噪音。
 */

/** Web Vital 指标结构（与 next/web-vitals Metric 对齐） */
interface WebVitalMetric {
  name: string;
  value: number;
  rating: string;
  id: string;
}

const ENDPOINT = "/api/v1/admin/web-vitals";

/** 是否启用上报（配置了任一可观测性变量即启用） */
function shouldReport(): boolean {
  return Boolean(
    process.env.NEXT_PUBLIC_SENTRY_DSN ||
    process.env.NEXT_PUBLIC_OTEL_EXPORTER_URL,
  );
}

/**
 * 上报单个 Web Vital 指标。
 * 由根 layout 通过 export function reportWebVitals(metric) 调用。
 */
export function reportWebVitals(metric: WebVitalMetric): void {
  if (typeof window === "undefined") return;
  if (!shouldReport()) return;

  const payload = {
    name: metric.name,
    value: metric.value,
    rating: metric.rating,
    id: metric.id,
    service: "student-portal",
    timestamp: Date.now(),
  };

  try {
    const blob = new Blob([JSON.stringify(payload)], {
      type: "application/json",
    });
    if (navigator.sendBeacon) {
      navigator.sendBeacon(ENDPOINT, blob);
      return;
    }
    // sendBeacon 不可用时降级 fetch keepalive
    void fetch(ENDPOINT, {
      method: "POST",
      body: JSON.stringify(payload),
      headers: { "Content-Type": "application/json" },
      keepalive: true,
    });
  } catch {
    // 上报失败不影响用户体验，静默忽略
  }
}

export default reportWebVitals;
