import "dotenv/config";
import os from "node:os";

function required(name: string, value: string | undefined): string {
  if (!value || value.trim() === "") {
    throw new Error(`Missing required environment variable: ${name}`);
  }

  return value.trim();
}

function optional(value: string | undefined, fallback: string): string {
  return value && value.trim() !== "" ? value.trim() : fallback;
}

export const config = {
  apiUrl: optional(process.env.COLIBRI_API_URL, "http://localhost:8000").replace(/\/$/, ""),
  apiToken: process.env.COLIBRI_RENDER_API_TOKEN ?? "",
  workerId:
    optional(process.env.COLIBRI_WORKER_ID, "") ||
    `${os.hostname()}-${process.pid}`,
  redisUrl: optional(process.env.REDIS_URL, "redis://127.0.0.1:6379"),
  renderQueue: optional(process.env.COLIBRI_RENDER_QUEUE, "colibri-render"),
  redisBlockSeconds: Number(optional(process.env.COLIBRI_REDIS_BLOCK_SECONDS, "5")),
  pollIntervalMs: Number(optional(process.env.COLIBRI_POLL_INTERVAL_MS, "10000")),
  storageDriver: optional(process.env.COLIBRI_STORAGE_DRIVER, "local") as "local" | "s3",
  localAssetsRoot: process.env.COLIBRI_LOCAL_ASSETS_ROOT ?? "",
  s3: {
    accessKeyId: process.env.R2_ACCESS_KEY_ID ?? "",
    secretAccessKey: process.env.R2_SECRET_ACCESS_KEY ?? "",
    bucket: process.env.R2_BUCKET ?? "",
    endpoint: process.env.R2_ENDPOINT ?? "",
    region: optional(process.env.R2_REGION, "auto"),
    publicUrl: process.env.R2_PUBLIC_URL ?? "",
  },
  remotion: {
    fps: Number(optional(process.env.REMOTION_FPS, "30")),
    width: Number(optional(process.env.REMOTION_WIDTH, "1920")),
    height: Number(optional(process.env.REMOTION_HEIGHT, "1080")),
    entryPoint: "src/remotion/index.ts",
  },
  tmpDir: optional(process.env.COLIBRI_TMP_DIR, ".tmp/renders"),
  healthPort: Number(optional(process.env.HEALTH_PORT, "3000")),
};

export function assertWorkerConfig(): void {
  required("COLIBRI_RENDER_API_TOKEN", config.apiToken);

  if (config.storageDriver === "local") {
    required("COLIBRI_LOCAL_ASSETS_ROOT", config.localAssetsRoot);
  } else {
    required("R2_ACCESS_KEY_ID", config.s3.accessKeyId);
    required("R2_SECRET_ACCESS_KEY", config.s3.secretAccessKey);
    required("R2_BUCKET", config.s3.bucket);
    required("R2_ENDPOINT", config.s3.endpoint);
  }
}
