/**
 * 平台基础设施验证脚本
 * 
 * 验证内容：
 * 1. 存储服务（LocalAdapter）
 * 2. 日志系统（Winston）
 * 3. 缓存服务（MemoryCache）
 * 4. 异步任务（MemoryQueue）
 */

import { storage } from '../common/storage/index.js'
import { logger } from '../common/logging/index.js'
import { cache } from '../common/cache/index.js'
import { jobQueue } from '../common/jobs/index.js'

async function testPlatformInfrastructure() {
  console.log('\n========================================')
  console.log('🧪 平台基础设施验证测试')
  console.log('========================================\n')

  let allPassed = true

  // ========================================
  // 测试 1: 存储服务（LocalAdapter）
  // ========================================
  try {
    console.log('📦 测试 1: 存储服务（LocalAdapter）')
    
    const testKey = 'test/verification.txt'
    const testContent = Buffer.from('平台基础设施验证测试 - ' + new Date().toISOString(), 'utf-8')
    
    // 上传测试
    logger.info('存储服务：开始上传测试文件', { key: testKey })
    const url = await storage.upload(testKey, testContent)
    console.log(`  ✅ 上传成功: ${url}`)
    
    // 下载测试
    const downloaded = await storage.download(testKey)
    console.log(`  ✅ 下载成功: ${downloaded.length} bytes`)
    
    // 验证内容
    if (downloaded.toString('utf-8') === testContent.toString('utf-8')) {
      console.log('  ✅ 内容验证通过')
    } else {
      console.log('  ❌ 内容验证失败')
      allPassed = false
    }
    
    // 存在性检查
    const exists = await storage.exists(testKey)
    console.log(`  ✅ 存在性检查: ${exists}`)
    
    // 删除测试
    await storage.delete(testKey)
    console.log('  ✅ 删除成功')
    
    console.log('  ✅ 存储服务测试通过\n')
    
  } catch (error) {
    console.error('  ❌ 存储服务测试失败:', (error as Error).message)
    allPassed = false
  }

  // ========================================
  // 测试 2: 日志系统（Winston）
  // ========================================
  try {
    console.log('📝 测试 2: 日志系统（Winston）')
    
    logger.info('日志系统：Info级别测试', { module: 'test', timestamp: Date.now() })
    logger.warn('日志系统：Warn级别测试', { warning: '这是一个警告' })
    logger.error('日志系统：Error级别测试', { error: '这是一个错误示例' })
    
    // 带上下文的日志
    const contextLogger = logger.child({ module: 'Platform-Test', testId: 'verification-001' })
    contextLogger.info('日志系统：上下文日志测试', { action: 'test' })
    
    console.log('  ✅ 日志系统测试通过（请检查控制台输出）\n')
    
  } catch (error) {
    console.error('  ❌ 日志系统测试失败:', (error as Error).message)
    allPassed = false
  }

  // ========================================
  // 测试 3: 缓存服务（MemoryCache）
  // ========================================
  try {
    console.log('💾 测试 3: 缓存服务（MemoryCache）')
    
    const cacheKey = 'test:verification'
    const cacheValue = { message: '缓存测试数据', timestamp: Date.now() }
    
    // 设置缓存（10秒TTL）
    await cache.set(cacheKey, cacheValue, 10)
    console.log('  ✅ 设置缓存成功')
    
    // 获取缓存
    const cached = await cache.get(cacheKey)
    if (cached && (cached as any).message === cacheValue.message) {
      console.log('  ✅ 获取缓存成功，内容正确')
    } else {
      console.log('  ❌ 缓存内容不匹配')
      allPassed = false
    }
    
    // 检查存在
    const hasKey = await cache.has(cacheKey)
    console.log(`  ✅ 存在性检查: ${hasKey}`)
    
    // 批量操作
    await cache.mset([
      { key: 'test:batch1', value: 'value1' },
      { key: 'test:batch2', value: 'value2' }
    ], 10)
    const batchValues = await cache.mget(['test:batch1', 'test:batch2'])
    console.log(`  ✅ 批量操作成功: ${batchValues.length} 个值`)
    
    // 删除缓存
    await cache.delete(cacheKey)
    await cache.delete('test:batch1')
    await cache.delete('test:batch2')
    console.log('  ✅ 删除缓存成功')
    
    console.log('  ✅ 缓存服务测试通过\n')
    
  } catch (error) {
    console.error('  ❌ 缓存服务测试失败:', (error as Error).message)
    allPassed = false
  }

  // ========================================
  // 测试 4: 异步任务（MemoryQueue）
  // ========================================
  try {
    console.log('⚙️  测试 4: 异步任务（MemoryQueue）')
    
    // 创建测试任务
    const job = await jobQueue.push('test:verification', {
      message: '异步任务测试',
      timestamp: Date.now()
    })
    console.log(`  ✅ 创建任务成功: ${job.id}`)
    
    // 获取任务状态
    const jobStatus = await jobQueue.getJob(job.id)
    if (jobStatus) {
      console.log(`  ✅ 获取任务状态: ${jobStatus.status}`)
    } else {
      console.log('  ❌ 无法获取任务状态')
      allPassed = false
    }
    
    // 注册任务处理器
    jobQueue.process('test:verification', async (job) => {
      logger.info('任务处理器：处理测试任务', { jobId: job.id })
      return { result: '任务处理完成', processedAt: Date.now() }
    })
    
    // 等待任务处理
    await new Promise(resolve => setTimeout(resolve, 1000))
    
    const processedJob = await jobQueue.getJob(job.id)
    if (processedJob && processedJob.status === 'completed') {
      console.log('  ✅ 任务处理完成')
    } else {
      console.log(`  ⚠️  任务状态: ${processedJob?.status || 'unknown'}`)
    }
    
    console.log('  ✅ 异步任务测试通过\n')
    
  } catch (error) {
    console.error('  ❌ 异步任务测试失败:', (error as Error).message)
    allPassed = false
  }

  // ========================================
  // 测试总结
  // ========================================
  console.log('========================================')
  if (allPassed) {
    console.log('✅ 所有平台基础设施测试通过！')
    logger.info('平台基础设施验证：全部通过', { 
      tests: ['storage', 'logging', 'cache', 'jobs'],
      timestamp: Date.now()
    })
  } else {
    console.log('❌ 部分测试失败，请检查日志')
    logger.error('平台基础设施验证：部分失败', {
      timestamp: Date.now()
    })
  }
  console.log('========================================\n')
  
  process.exit(allPassed ? 0 : 1)
}

// 运行测试
testPlatformInfrastructure().catch(error => {
  console.error('测试脚本执行失败:', error)
  process.exit(1)
})

