function parseNumber(value: string | undefined, fallback: number): number {
  const parsed = Number.parseInt(value || "", 10);
  return Number.isFinite(parsed) ? parsed : fallback;
}

function parseCsv(value: string | undefined, fallback: string[]): string[] {
  if (!value?.trim()) {
    return fallback;
  }

  return value
    .split(",")
    .map((item) => item.trim())
    .filter(Boolean);
}

export const serverConfig = {
  llmProxyUrl: process.env.LITELLM_PROXY_URL || "http://localhost:4141",
  llmModel: process.env.LLM_MODEL || "gpt-5-mini",
  llmHealthcheckTimeoutMs: parseNumber(process.env.LLM_HEALTHCHECK_TIMEOUT_MS, 5_000),
  reposPath: process.env.REPOS_PATH || "./repos",
  repositoryImport: {
    zipExtractTimeoutMs: parseNumber(process.env.REPOSITORY_ZIP_EXTRACT_TIMEOUT_MS, 120_000),
    gitCloneTimeoutMs: parseNumber(process.env.REPOSITORY_GIT_CLONE_TIMEOUT_MS, 300_000),
  },
  rustAgent: {
    binaryPath: process.env.RUST_AGENT_BINARY_PATH || "../rust-agent-sdk/target/release/agent",
  },
  agent: {
    sourcePath: process.env.SOURCE_PATH || process.env.WORKSPACE_ROOT || "/workspace",
    timeoutMs: parseNumber(process.env.AGENT_TIMEOUT_MS, 75_000),
    maxThinkingTokens: parseNumber(process.env.AGENT_MAX_THINKING_TOKENS, 4_000),
    maxTurns: parseNumber(process.env.AGENT_MAX_TURNS, 16),
    toolset: parseCsv(process.env.AGENT_ALLOWED_TOOLS, [
      "read_file",
      "search_files",
      "list_directory",
    ]),
    conversationSummaryMaxChars: parseNumber(
      process.env.AGENT_CONVERSATION_SUMMARY_MAX_CHARS,
      5_000,
    ),
    conversationAssistantMaxChars: parseNumber(
      process.env.AGENT_CONVERSATION_ASSISTANT_MAX_CHARS,
      2_800,
    ),
    conversationUserMaxChars: parseNumber(
      process.env.AGENT_CONVERSATION_USER_MAX_CHARS,
      1_800,
    ),
    conversationHistoryMessages: parseNumber(
      process.env.AGENT_CONVERSATION_HISTORY_MESSAGES,
      8,
    ),
  },
  compaction: {
    model: process.env.CHAT_COMPACTION_MODEL || process.env.LLM_MODEL || "gpt-5-mini",
    maxTurns: parseNumber(process.env.CHAT_COMPACTION_MAX_TURNS, 3),
  },
  wikiAgent: {
    model: process.env.WIKI_AGENT_MODEL || process.env.LLM_MODEL || "gpt-5-mini",
    maxTurns: parseNumber(process.env.WIKI_AGENT_MAX_TURNS, 24),
    concurrency: parseNumber(process.env.WIKI_AGENT_CONCURRENCY, 4),
    toolset: parseCsv(process.env.WIKI_AGENT_ALLOWED_TOOLS, [
      "read_file",
      "search_files",
      "list_directory",
      "write_file",
      "verify_mermaid",
    ]),
  },
} as const;
