/**
 * Redis模块配置
 * 
 * 功能描述：
 * - 根据环境变量自动选择Redis实现方式
 * - 开发环境使用文件存储模拟Redis功能
 * - 生产环境连接真实Redis服务器
 * - 提供统一的Redis服务注入接口
 * 
 * 职责分离：
 * - 服务工厂：根据配置创建合适的Redis服务实例
 * - 依赖注入：为其他模块提供REDIS_SERVICE令牌
 * - 环境适配：自动适配不同环境的Redis需求
 * 
 * 最近修改：
 * - 2025-01-07: 代码规范优化 - 更新导入路径，修正文件重命名后的引用关系
 * - 2025-01-07: 代码规范优化 - 完善文件头注释和类注释，添加详细功能说明
 * 
 * @author moyin
 * @version 1.0.2
 * @since 2025-01-07
 * @lastModified 2025-01-07
 */
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { FileRedisService } from './file_redis.service';
import { RealRedisService } from './real_redis.service';
import { IRedisService } from './redis.interface';

/**
 * Redis模块
 * 
 * 职责：
 * - 根据环境变量自动选择文件存储或真实Redis服务
 * - 提供统一的Redis服务注入接口
 * - 管理Redis服务的生命周期
 * 
 * 主要方法：
 * - useFactory() - 根据配置创建Redis服务实例
 * 
 * 使用场景：
 * - 在需要Redis功能的模块中导入此模块
 * - 通过@Inject('REDIS_SERVICE')注入Redis服务
 */
@Module({
  imports: [ConfigModule],
  providers: [
    {
      provide: 'REDIS_SERVICE',
      useFactory: (configService: ConfigService): IRedisService => {
        const useFileRedis = configService.get<string>('USE_FILE_REDIS', 'true') === 'true';
        const nodeEnv = configService.get<string>('NODE_ENV', 'development');
        
        // 在开发环境或明确配置使用文件Redis时，使用文件存储
        if (nodeEnv === 'development' || useFileRedis) {
          return new FileRedisService();
        } else {
          return new RealRedisService(configService);
        }
      },
      inject: [ConfigService],
    },
    FileRedisService,
    RealRedisService,
  ],
  exports: ['REDIS_SERVICE'],
})
export class RedisModule {}