import dotenv from 'dotenv';

// Load environment variables
dotenv.config();

/**
 * Application configuration
 * Centralizes all environment-based settings
 */
export const config = {
  // Server configuration
  server: {
    port: parseInt(process.env.PORT || '3000', 10),
    host: process.env.HOST || '0.0.0.0',
    nodeEnv: process.env.NODE_ENV || 'development',
  },

  // Browser pool configuration
  browserPool: {
    maxConcurrentSessions: parseInt(process.env.MAX_CONCURRENT_SESSIONS || '200', 10),
    browserTimeout: parseInt(process.env.BROWSER_TIMEOUT_MS || '300000', 10),
    idleTimeout: parseInt(process.env.IDLE_TIMEOUT_MS || '600000', 10),
    cleanupInterval: parseInt(process.env.SESSION_CLEANUP_INTERVAL_MS || '60000', 10),
  },

  // Session configuration
  session: {
    secret: process.env.SESSION_SECRET || 'default-secret-change-me',
    maxAge: parseInt(process.env.SESSION_MAX_AGE_MS || '3600000', 10),
  },

  // JWT configuration
  jwt: {
    secret: process.env.JWT_SECRET || 'default-jwt-secret-change-me',
    expiresIn: process.env.JWT_EXPIRES_IN || '24h',
  },

  // Rate limiting
  rateLimit: {
    windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '900000', 10),
    maxRequests: parseInt(process.env.RATE_LIMIT_MAX_REQUESTS || '100', 10),
  },

  // Redis configuration
  redis: {
    url: process.env.REDIS_URL || 'redis://localhost:6379',
    password: process.env.REDIS_PASSWORD || undefined,
  },

  // Upstream proxy configuration
  upstreamProxy: {
    enabled: process.env.UPSTREAM_PROXY_ENABLED === 'true',
    server: process.env.UPSTREAM_PROXY_SERVER || '',
    username: process.env.UPSTREAM_PROXY_USERNAME || undefined,
    password: process.env.UPSTREAM_PROXY_PASSWORD || undefined,
  },

  // Anti-bot configuration
  antiBot: {
    enableHeaderSpoofing: process.env.ENABLE_HEADER_SPOOFING !== 'false',
    enableUARandomization: process.env.ENABLE_UA_RANDOMIZATION !== 'false',
    enableTimezoneSpoofing: process.env.ENABLE_TIMEZONE_SPOOFING !== 'false',
  },

  // Logging configuration
  logging: {
    level: process.env.LOG_LEVEL || 'info',
    file: process.env.LOG_FILE || 'logs/app.log',
  },

  // Metrics configuration
  metrics: {
    enabled: process.env.METRICS_ENABLED !== 'false',
    port: parseInt(process.env.METRICS_PORT || '9090', 10),
  },

  // Google OAuth configuration
  google: {
    clientId: process.env.GOOGLE_CLIENT_ID || '',
    clientSecret: process.env.GOOGLE_CLIENT_SECRET || '',
  },

  // Decodo / Smartproxy scraping API
  decodo: {
    apiUrl: process.env.DECODO_API_URL || 'https://scraper-api.decodo.com/v2/scrape',
    auth: process.env.DECODO_AUTH || 'Basic VTAwMDAzNjI3NTY6UFdfMTA2MTdmZWFkYjEyMTgwMmY3N2YzZDM1MjA5YjAwNTgx',
  },

  // Security configuration
  security: {
    enableIpBanning: process.env.ENABLE_IP_BANNING === 'true',
    maxFailedAuthAttempts: parseInt(process.env.MAX_FAILED_AUTH_ATTEMPTS || '5', 10),
    banDuration: parseInt(process.env.BAN_DURATION_MS || '3600000', 10),
  },

  // CORS allowed origins (comma-separated in env)
  allowedOrigins: process.env.ALLOWED_ORIGINS
    ? process.env.ALLOWED_ORIGINS.split(',').map(o => o.trim())
    : [
        'https://cahootravel.com',
        'https://www.cahootravel.com',
        'http://localhost:3002',
        'http://localhost:3009',
        'http://localhost:3010',
      ],
};

/**
 * Validates that required configuration is present
 */
export function validateConfig(): void {
  const errors: string[] = [];

  if (config.server.port < 1 || config.server.port > 65535) {
    errors.push('Invalid PORT value');
  }

  if (config.browserPool.maxConcurrentSessions < 1) {
    errors.push('MAX_CONCURRENT_SESSIONS must be at least 1');
  }

  if (config.session.secret === 'default-secret-change-me' && config.server.nodeEnv === 'production') {
    errors.push('SESSION_SECRET must be set in production');
  }

  if (config.jwt.secret === 'default-jwt-secret-change-me' && config.server.nodeEnv === 'production') {
    errors.push('JWT_SECRET must be set in production');
  }

  if (errors.length > 0) {
    throw new Error(`Configuration validation failed:\n${errors.join('\n')}`);
  }
}
