import { z } from "zod";

/**
 * parent-bff 环境变量 Zod 校验（对齐 02-architecture-design.md §12.1）。
 *
 * 配置项分组：
 * - 服务基础（NODE_ENV / PORT / LOG_LEVEL / DEV_MODE）
 * - 下游服务 URL（HTTP 模式，P4 兼容）
 * - 下游 gRPC target（P5+ 启用，覆盖 URL）
 * - Redis
 * - ChildGuard（缓存 TTL + singleflight）
 * - 缓存（dashboard / grades / permissions）
 * - GraphQL（depth / cost / introspection）
 * - 可观测性（OTLP / service name）
 * - Kafka（P5+ 启用）
 * - CORS
 */
const envSchema = z.object({
  // === 服务基础 ===
  NODE_ENV: z
    .enum(["development", "production", "test"])
    .default("development"),
  PORT: z.string().default("3010").transform(Number),
  LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
  DEV_MODE: z
    .string()
    .default("true")
    .transform((v) => v === "true"),

  // === 下游服务 URL（HTTP 模式，P4 fallback） ===
  IamServiceUrl: z.string().url().default("http://localhost:3002"),
  CoreEduServiceUrl: z.string().url().default("http://localhost:3004"),
  DataAnaServiceUrl: z.string().url().default("http://localhost:3006"),
  MsgServiceUrl: z.string().url().default("http://localhost:3007"),
  PushGatewayUrl: z.string().url().default("http://localhost:8081"),

  // === 下游 gRPC target（P5+ 启用，覆盖 URL） ===
  IamGrpcTarget: z.string().default("localhost:50052"),
  CoreEduGrpcTarget: z.string().default("localhost:50053"),
  DataAnaGrpcTarget: z.string().default("localhost:50055"),
  MsgGrpcTarget: z.string().default("localhost:50056"),

  // === Redis ===
  REDIS_URL: z.string().url().default("redis://localhost:6379"),
  REDIS_KEY_PREFIX: z.string().default("bff:parent:"),

  // === ChildGuard ===
  CHILD_GUARD_CACHE_TTL_SECONDS: z.string().default("30").transform(Number),
  CHILD_GUARD_SINGLEFLIGHT_ENABLED: z
    .string()
    .default("true")
    .transform((v) => v === "true"),

  // === 缓存 TTL ===
  DASHBOARD_CACHE_TTL_SECONDS: z.string().default("15").transform(Number),
  GRADES_CACHE_TTL_SECONDS: z.string().default("30").transform(Number),
  PERMISSIONS_CACHE_TTL_SECONDS: z.string().default("300").transform(Number),

  // === GraphQL ===
  GRAPHQL_DEPTH_LIMIT: z.string().default("7").transform(Number),
  GRAPHQL_COST_LIMIT: z.string().default("1000").transform(Number),
  GRAPHQL_INTROSPECTION_ENABLED: z
    .string()
    .default("true")
    .transform((v) => v === "true"),

  // === 可观测性 ===
  OTEL_EXPORTER_OTLP_ENDPOINT: z.string().url().optional(),
  OTEL_SERVICE_NAME: z.string().default("parent-bff"),
  OTEL_SERVICE_VERSION: z.string().optional(),

  // === Kafka（P5+ 启用） ===
  KAFKA_BROKERS: z.string().optional(),
  KAFKA_CONSUMER_GROUP_ID: z.string().default("parent-bff"),
  KAFKA_CONSUMER_TOPICS: z.string().optional(),

  // === CORS ===
  CORS_ORIGINS: z.string().default("http://localhost:4002"),
});

export type Env = z.infer<typeof envSchema>;

/**
 * 加载并校验环境变量。
 *
 * 兼容大小写：进程环境变量大小写敏感，但本项目惯例使用混合大小写
 * （如 IamServiceUrl），因此显式映射。
 */
export function loadEnv(): Env {
  const result = envSchema.safeParse({
    ...process.env,
    IamServiceUrl: process.env.IAM_SERVICE_URL || "http://localhost:3002",
    CoreEduServiceUrl:
      process.env.CORE_EDU_SERVICE_URL || "http://localhost:3004",
    DataAnaServiceUrl:
      process.env.DATA_ANA_SERVICE_URL || "http://localhost:3006",
    MsgServiceUrl: process.env.MSG_SERVICE_URL || "http://localhost:3007",
    PushGatewayUrl: process.env.PUSH_GATEWAY_URL || "http://localhost:8081",
    IamGrpcTarget: process.env.IAM_GRPC_TARGET || "localhost:50052",
    CoreEduGrpcTarget: process.env.CORE_EDU_GRPC_TARGET || "localhost:50053",
    DataAnaGrpcTarget: process.env.DATA_ANA_GRPC_TARGET || "localhost:50055",
    MsgGrpcTarget: process.env.MSG_GRPC_TARGET || "localhost:50056",
  });
  if (!result.success) {
    throw new Error(
      "Invalid parent-bff env: " + JSON.stringify(result.error.flatten()),
    );
  }
  return result.data;
}

export const env = loadEnv();
