const numberFromEnv = (name: string, fallback: number): number => {
  const value = Number(process.env[name]);
  return Number.isFinite(value) ? value : fallback;
};

// Source: ai.google.dev Gemini Flash model docs, checked 2026-08-22 (hard output-token cap).
export const GEMINI_MAX_OUTPUT_TOKENS = numberFromEnv('GEMINI_MAX_OUTPUT_TOKENS', 65536);

// Source: worst-case planning ratio for Hebrew, Arabic, and CJK output.
export const CHARS_PER_OUTPUT_TOKEN = numberFromEnv('CHARS_PER_OUTPUT_TOKEN', 1);

// Source: safety window applied to the Gemini output-token cap.
export const OUTPUT_SAFETY_FACTOR = numberFromEnv('OUTPUT_SAFETY_FACTOR', 0.5);

// Source: Gemini output cap × worst-case character ratio × safety window; env override: GEMINI_CALL_CHAR_BUDGET.
export const GEMINI_CALL_CHAR_BUDGET = numberFromEnv(
  'GEMINI_CALL_CHAR_BUDGET',
  Math.floor(GEMINI_MAX_OUTPUT_TOKENS * CHARS_PER_OUTPUT_TOKEN * OUTPUT_SAFETY_FACTOR)
);

// Source: JSON-parse reliability cap per Gemini call; env override: GEMINI_CALL_MAX_STRINGS.
export const GEMINI_CALL_MAX_STRINGS = numberFromEnv('GEMINI_CALL_MAX_STRINGS', 100);

// Source: half of the 20 MB documented Gemini inline request-payload cap.
export const GEMINI_CALL_MAX_PAYLOAD_BYTES = numberFromEnv('GEMINI_CALL_MAX_PAYLOAD_BYTES', 10485760);

// Source: existing synchronous bulk schema bound.
export const BULK_SYNC_MAX_STRINGS = numberFromEnv('BULK_SYNC_MAX_STRINGS', 2000);

// Source: existing asynchronous bulk-strings job schema bound.
export const BULK_ASYNC_MAX_STRINGS = numberFromEnv('BULK_ASYNC_MAX_STRINGS', 10000);

// Source: existing per-string bulk schema bound.
export const BULK_MAX_CHARS_PER_STRING = numberFromEnv('BULK_MAX_CHARS_PER_STRING', 5000);

// Source: existing maximum number of target languages per bulk job.
export const BULK_MAX_TARGET_LANGS = numberFromEnv('BULK_MAX_TARGET_LANGS', 20);

// Source: ten Gemini-call character budgets per HTTP request; env override: BULK_REQUEST_CHAR_BUDGET.
export const BULK_REQUEST_CHAR_BUDGET = numberFromEnv(
  'BULK_REQUEST_CHAR_BUDGET',
  10 * GEMINI_CALL_CHAR_BUDGET
);

// Source: owner-directed retry window for incomplete Gemini bulk output; env override: MAX_TRUNCATION_RETRIES.
export const MAX_TRUNCATION_RETRIES = numberFromEnv('MAX_TRUNCATION_RETRIES', 3);
