require('dotenv').config()
const app = require('./app')
const { testConnection, pool } = require('./config/database')

const PORT = process.env.PORT || 3200
const HOST = process.env.HOST || '0.0.0.0'

// 显示启动横幅
console.log('========================================')
console.log('🚀 服务器启动中...')
console.log(`📅 时间: ${new Date().toISOString()}`)
console.log(`📌 版本: 1.0.0`)
console.log('========================================\n')

// 显示环境信息
console.log('🔍 环境配置:')
console.log(`🔹 NODE_ENV: ${process.env.NODE_ENV || 'development'}`)
console.log(`🔹 PORT: ${PORT}`)
console.log(`🔹 HOST: ${HOST}`)
console.log(`🔹 DATABASE_URL: ${process.env.DATABASE_URL ? '已配置' : '未配置'}`)
console.log(`🔹 使用生产环境MySQL数据库: 是`)
console.log(`🔹 使用Redis缓存: 否`)
console.log(`🔹 使用RabbitMQ消息队列: 否\n`)

// 优雅关闭处理
process.on('uncaughtException', (err) => {
  console.error('========================================')
  console.error('❌ 未捕获的异常:')
  console.error(`🔹 消息: ${err.message}`)
  console.error(`🔹 堆栈: ${err.stack}`)
  console.error('========================================')
  process.exit(1)
})

process.on('unhandledRejection', (err) => {
  console.error('========================================')
  console.error('❌ 未处理的Promise拒绝:')
  console.error(`🔹 消息: ${err.message}`)
  console.error(`🔹 堆栈: ${err.stack}`)
  console.error('========================================')
  process.exit(1)
})

// 启动服务器
const startServer = async () => {
  try {
    console.log('\n========================================')
    console.log('🔍 正在初始化服务...')
    console.log('========================================\n')

    console.log('🔍 测试数据库连接...')
    // 测试数据库连接
    const isConnected = await testConnection()
    if (!isConnected) {
      console.error('❌ 数据库连接测试失败，无法启动服务器')
      process.exit(1)
    }
    
    console.log('✅ 数据库连接测试成功')
    console.log('📌 数据库连接池配置:', {
      host: pool.pool.config.connectionConfig.host,
      port: pool.pool.config.connectionConfig.port,
      database: pool.pool.config.connectionConfig.database,
      user: pool.pool.config.connectionConfig.user
    })
    console.log('🔄 所有数据库连接已统一使用database.js配置')

    // 启动HTTP服务器
    console.log('\n🔍 启动HTTP服务器...')
    const server = app.listen(PORT, HOST, () => {
      console.log('========================================')
      console.log('✅ 服务器启动成功!')
      console.log(`🚀 访问地址: http://${HOST}:${PORT}`)
      console.log(`📊 环境: ${process.env.NODE_ENV || 'development'}`)
      console.log(`⏰ 启动时间: ${new Date().toLocaleString()}`)
      console.log('💾 数据库: MySQL')
      console.log('🔴 Redis: 未使用')
      console.log('🐰 RabbitMQ: 未使用')
      console.log('========================================\n')
    })

    // 优雅关闭
    const gracefulShutdown = async (signal) => {
      console.log('\n========================================')
      console.log(`🛑 收到 ${signal} 信号，开始优雅关闭流程...`)
      console.log(`⏰ 时间: ${new Date().toLocaleString()}`)
      console.log('========================================\n')
      
      // 设置超时计时器
      const shutdownTimer = setTimeout(() => {
        console.error('========================================')
        console.error('❌ 关闭操作超时，强制退出')
        console.error('========================================')
        process.exit(1)
      }, 10000)

      try {
        // 关闭HTTP服务器
        console.log('🔐 关闭HTTP服务器...')
        await new Promise((resolve) => server.close(resolve))
        console.log('✅ HTTP服务器已关闭')

        console.log('\n========================================')
        console.log('👋 服务器已完全关闭')
        console.log('========================================')
        
        clearTimeout(shutdownTimer)
        process.exit(0)
      } catch (error) {
        console.error('========================================')
        console.error('❌ 关闭过程中发生错误:', error.message)
        console.error('========================================')
        clearTimeout(shutdownTimer)
        process.exit(1)
      }
    }

    // 注册关闭信号
    process.on('SIGTERM', () => gracefulShutdown('SIGTERM'))
    process.on('SIGINT', () => gracefulShutdown('SIGINT'))

  } catch (error) {
    console.error('❌ 服务器启动失败:', error)
    process.exit(1)
  }
}

// 如果是直接运行此文件，则启动服务器
if (require.main === module) {
  console.log('\n🔧 启动模式: 直接运行')
  console.log(`📌 调用堆栈: ${new Error().stack.split('\n')[1].trim()}`)
  console.log('🔄 开始启动服务器...\n')
  startServer()
}

module.exports = app