// server/src/config.ts
import dotenv from 'dotenv';
dotenv.config();

export const config = {
  // Server
  PORT: parseInt(process.env.PORT ?? '8001', 10),

  // Database
  DB_HOST: process.env.DB_HOST ?? 'localhost',
  DB_PORT: parseInt(process.env.DB_PORT ?? '3306', 10),
  DB_USER: process.env.DB_USER ?? 'root',
  DB_PASSWORD: process.env.DB_PASSWORD ?? '',
  DB_NAME: process.env.DB_NAME ?? 'lifesim',

  // AI Provider Configuration
  // Options: 'openai', 'together', 'mistral', 'openrouter'
  AI_PROVIDER: process.env.AI_PROVIDER ?? 'openai',

  // OpenAI
  OPENAI_API_KEY: process.env.OPENAI_API_KEY ?? '',
  OPENAI_MODEL: process.env.OPENAI_MODEL ?? 'gpt-4o-mini',

  // Together AI (recommended - cheaper & less restrictive)
  TOGETHER_API_KEY: process.env.TOGETHER_API_KEY ?? '',
  TOGETHER_MODEL: process.env.TOGETHER_MODEL ?? 'Qwen/Qwen3-235B-A22B-Instruct-2507-tput',

  // Mistral AI Direct
  MISTRAL_API_KEY: process.env.MISTRAL_API_KEY ?? '',
  MISTRAL_MODEL: process.env.MISTRAL_MODEL ?? 'mistral-small-latest',

  // OpenRouter (access to many models)
  OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY ?? '',
  OPENROUTER_MODEL: process.env.OPENROUTER_MODEL ?? 'mistralai/mistral-small-3.1-24b-instruct',

  // Legacy - for backwards compatibility
  CONVERSATION_MODEL: process.env.CONVERSATION_MODEL ?? process.env.OPENAI_MODEL ?? 'gpt-4o-mini',

  // Tool Calling - enables rich AI interactions (activities, dates, emotions)
  // Set to 'false' to use simpler JSON schema mode
  AI_USE_TOOL_CALLING: process.env.AI_USE_TOOL_CALLING !== 'false',

  // Game - Python uses TARGET_FPS=5000, so 0.2ms per tick
  // Using 1ms (1000 ticks/sec) as a balance between speed and CPU usage
  TICK_INTERVAL: 1, // ms (1000 ticks/sec) - closer to Python's 5000 FPS
  // Speed values = ticks needed per game minute (higher = slower)
  SPEED_PAUSED: 999999999, // Effectively infinite - use for manual pause
  SPEED_DEFAULT: 10000, // Default/slowest normal speed
  SPEED_QUESTION_PAUSE: 999999999, // Pause game during questions (effectively infinite)
  SPEED_BUTTON_VALUES: [10000, 1000, 500, 50, 20, 1] as const,

  // Limits
  MAX_CONNECTIONS: 20,
  RATE_LIMIT_PER_MINUTE: 30,

  // Auth
  JWT_SECRET: process.env.JWT_SECRET ?? 'default-secret-change-me-in-production',
  SESSION_TIMEOUT: parseInt(process.env.SESSION_TIMEOUT ?? '86400', 10), // 24 hours

  // Rate Limiting
  OPENAI_MAX_REQUESTS_PER_HOUR: parseInt(process.env.OPENAI_MAX_REQUESTS_PER_HOUR ?? '600', 10),
  WEBSOCKET_MAX_MESSAGES_PER_MINUTE: parseInt(process.env.WEBSOCKET_MAX_MESSAGES_PER_MINUTE ?? '30', 10),

  // Debug
  DEBUG: process.env.DEBUG === 'true',

  // In-App Purchase receipt validation (server-side anti-fraud).
  // Defaults OFF so existing dev/test behavior is unchanged. Only enable in
  // production AFTER provisioning APPLE_SHARED_SECRET and shipping an iOS build
  // that sends `receiptData` + `transactionId` in the purchaseInAppItem payload.
  // When ON, the in-app purchase handler validates the receipt with Apple
  // before granting diamonds and fails closed if the receipt is missing.
  IAP_VALIDATION_ENABLED: process.env.IAP_VALIDATION_ENABLED === 'true',

  // Image Generation
  FAL_AI_KEY: process.env.FAL_AI_KEY ?? '',
  REPLICATE_API_TOKEN: process.env.REPLICATE_API_TOKEN ?? '',
  IMAGE_GENERATION_PROVIDER: (process.env.IMAGE_GENERATION_PROVIDER ?? 'imagen4') as 'imagen4' | 'flux' | 'dalle3',
  IMAGE_GENERATION_DEFAULT_COST: parseFloat(process.env.IMAGE_GENERATION_DEFAULT_COST ?? '0.04'),
} as const;

export type Config = typeof config;
