/**
 * PM2 进程管理器配置文件
 *
 * 环境区分说明：
 * 1. 通过 --env 参数指定环境：pm2 start ecosystem.config.js --env <环境名>
 * 2. 环境配置会自动合并：基础配置(env) + 环境特定配置(env_<环境名>)
 * 3. 测试环境: --env test   (端口 3001, 2个实例)
 * 4. 生产环境: --env production (端口 3000, 最大实例数)
 */

const baseAppConfig = {
  script: './dist/src/main.js',

  // 日志文件路径
  error_file: './logs/pm2-error.log',
  out_file: './logs/pm2-out.log',
  log_file: './logs/pm2-combined.log',

  // 日志日期格式
  log_date_format: 'YYYY-MM-DD HH:mm:ss Z',

  // 合并日志（所有实例的日志合并到一个文件）
  merge_logs: true,

  // 自动重启配置
  autorestart: true,

  // 监听文件变化（生产环境建议关闭）
  watch: false,

  // 忽略监听的文件/目录
  ignore_watch: ['node_modules', 'logs', 'dist', '.git', '*.log'],

  // 最大内存限制（超过后自动重启）
  max_memory_restart: '1G',

  // 最小正常运行时间（秒），小于此时间重启不计入重启次数
  min_uptime: '10s',

  // 最大重启次数（在 min_uptime 时间内）
  max_restarts: 10,

  // 重启延迟（毫秒）
  restart_delay: 4000,

  // 等待就绪信号的时间（毫秒）
  wait_ready: true,
  listen_timeout: 10000,

  // 优雅关闭超时时间（毫秒）
  kill_timeout: 5000,

  // 应用启动后的等待时间（毫秒）
  shutdown_with_message: true,

  // 源代码映射支持
  source_map_support: true,

  // 实例间负载均衡策略
  instance_var: 'INSTANCE_ID',
};

module.exports = {
  apps: [
    {
      ...baseAppConfig,

      // 生产环境应用
      name: 'competition-api',
      instances: 2,
      exec_mode: 'cluster',

      env_file: '.env.production',
      env: {
        NODE_ENV: 'production',
        PORT: 3234,
      },
    },
    {
      ...baseAppConfig,

      // 测试环境应用
      name: 'competition-api-test',
      instances: 2,
      exec_mode: 'cluster',

      env_file: '.env.test',
      env: {
        NODE_ENV: 'test',
        PORT: 3234,
      },
    },
  ],

  // ============================================
  // 部署配置（用于 PM2 自动化部署）
  // 使用方式: pm2 deploy ecosystem.config.js <环境名>
  // ============================================
  deploy: {
    // 测试环境部署配置
    test: {
      user: 'deploy',
      host: ['119.29.229.174'],
      ref: 'origin/develop',
      repo: 'git@github.com:your-username/competition-management-system.git',
      path: '/var/www/competition-management-test',
      'post-deploy':
        'cd backend && pnpm install && pnpm run build && pm2 reload ecosystem.config.js --only competition-api-test',
      'pre-setup': 'apt-get update && apt-get install -y git',
    },
    // 生产环境部署配置
    production: {
      user: 'deploy',
      host: ['your-prod-server-ip'],
      ref: 'origin/master',
      repo: 'git@github.com:your-username/competition-management-system.git',
      path: '/var/www/competition-management',
      'post-deploy':
        'cd backend && pnpm install && pnpm run build && pm2 reload ecosystem.config.js --only competition-api',
      'pre-setup': 'apt-get update && apt-get install -y git',
    },
  },
};
