/**
 * 可观测性环境变量集中管理（P6 硬化）
 *
 * - 类型安全的环境变量访问
 * - 统一所有可观测性模块（Sentry / Web Vitals / OTel）的配置入口
 * - 所有变量必须以 NEXT_PUBLIC_ 前缀（project_rules §4 安全规范）
 *
 * 关联：02-architecture-design.md §12 可观测性
 */

/**
 * 可观测性配置对象（运行时只读快照）
 */
export interface ObservabilityConfig {
  /** Sentry DSN（未配置则禁用 Sentry） */
  readonly sentryDsn: string | null;
  /** Sentry release 版本号 */
  readonly sentryRelease: string | null;
  /** 运行环境（development / production） */
  readonly environment: string;
  /** 采样率（0~1） */
  readonly tracesSampleRate: number;
  /** 是否启用 OTel browser SDK */
  readonly otelEnabled: boolean;
  /** OTLP collector 上报端点 */
  readonly otelEndpoint: string | null;
  /** Web Vitals 上报端点 */
  readonly webVitalsEndpoint: string;
  /** 服务名（用于上报标识） */
  readonly serviceName: string;
}

/** 默认 Web Vitals 上报端点（ARB-022 §24.4 双 /v1 前缀） */
const DEFAULT_WEB_VITALS_ENDPOINT = "/api/v1/parent/v1/web-vitals";

/** 解析环境变量为布尔值（"true" / "1" 视为真） */
function parseBoolean(value: string | undefined): boolean {
  return value === "true" || value === "1";
}

/** 解析采样率（默认 0.1，非法值回退到默认） */
function parseSampleRate(value: string | undefined): number {
  const parsed = Number.parseFloat(value ?? "");
  if (Number.isNaN(parsed) || parsed < 0 || parsed > 1) {
    return 0.1;
  }
  return parsed;
}

/**
 * 读取并构建可观测性配置。
 *
 * Next.js 在构建时将 NEXT_PUBLIC_* 变量内联到客户端 bundle，
 * 因此此处直接读取 process.env。
 */
function buildConfig(): ObservabilityConfig {
  return {
    sentryDsn: process.env.NEXT_PUBLIC_SENTRY_DSN ?? null,
    sentryRelease: process.env.NEXT_PUBLIC_SENTRY_RELEASE ?? null,
    environment: process.env.NODE_ENV ?? "development",
    tracesSampleRate: parseSampleRate(
      process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE,
    ),
    otelEnabled: parseBoolean(process.env.NEXT_PUBLIC_OTEL_ENABLED),
    otelEndpoint:
      process.env.NEXT_PUBLIC_OTEL_EXPORTER_OTLP_ENDPOINT ??
      process.env.NEXT_PUBLIC_OTEL_ENDPOINT ??
      null,
    webVitalsEndpoint:
      process.env.NEXT_PUBLIC_WEB_VITALS_ENDPOINT ??
      DEFAULT_WEB_VITALS_ENDPOINT,
    serviceName: "parent-portal",
  };
}

/** 配置单例（模块级缓存，避免重复读取） */
let cachedConfig: ObservabilityConfig | null = null;

/**
 * 获取可观测性配置（单例）。
 */
export function getObservabilityConfig(): ObservabilityConfig {
  if (cachedConfig === null) {
    cachedConfig = buildConfig();
  }
  return cachedConfig;
}

/** 是否启用 Sentry（DSN 已配置） */
export function isSentryEnabled(): boolean {
  return getObservabilityConfig().sentryDsn !== null;
}

/** 是否启用 OTel browser SDK */
export function isOTelEnabled(): boolean {
  return getObservabilityConfig().otelEnabled;
}

/** 是否启用 Web Vitals 上报 */
export function isWebVitalsReportingEnabled(): boolean {
  const config = getObservabilityConfig();
  // 配置了 Sentry 或 OTel 任一即启用上报（避免开发环境噪音）
  return config.sentryDsn !== null || config.otelEnabled;
}
