import { CacheAdapter } from './CacheAdapter.js'
// import Redis from 'ioredis'  // ⚠️ 需要安装：npm install ioredis

/**
 * Redis缓存适配器
 * 
 * 适用场景：
 * - 云端SaaS部署（多实例共享）
 * - 需要持久化的缓存
 * - 高并发场景
 * 
 * 配置要求：
 * - REDIS_HOST: Redis主机（如：r-***.redis.aliyuncs.com）
 * - REDIS_PORT: Redis端口（默认：6379）
 * - REDIS_PASSWORD: Redis密码（可选）
 * - REDIS_DB: Redis数据库索引（默认：0）
 * 
 * @example
 * ```typescript
 * const cache = new RedisCacheAdapter({
 *   host: 'localhost',
 *   port: 6379,
 *   password: 'your-password'
 * })
 * await cache.set('key', 'value', 60)
 * ```
 * 
 * ⚠️ 当前为预留实现，待云端部署时完善
 */
export class RedisCacheAdapter implements CacheAdapter {
  // private readonly client: Redis
  private readonly keyPrefix: string

  constructor(config: {
    host: string
    port: number
    password?: string
    db?: number
    keyPrefix?: string
  }) {
    this.keyPrefix = config.keyPrefix || 'aiclinical:'

    // ⚠️ TODO: 待安装 ioredis 后取消注释
    // this.client = new Redis({
    //   host: config.host,
    //   port: config.port,
    //   password: config.password,
    //   db: config.db || 0,
    //   retryStrategy: (times) => {
    //     const delay = Math.min(times * 50, 2000)
    //     return delay
    //   }
    // })

    // this.client.on('error', (err) => {
    //   console.error('[RedisCacheAdapter] Redis error:', err)
    // })

    // this.client.on('connect', () => {
    //   console.log('[RedisCacheAdapter] Connected to Redis')
    // })
  }

  /**
   * 获取完整的key（带前缀）
   */
  private getFullKey(_key: string): string {
    return `${this.keyPrefix}${_key}`
  }

  /**
   * 获取缓存值
   */
  async get<T = any>(_key: string): Promise<T | null> {
    // ⚠️ TODO: 待实现
    // const value = await this.client.get(this.getFullKey(key))
    // if (!value) return null
    // try {
    //   return JSON.parse(value) as T
    // } catch {
    //   return value as T
    // }

    throw new Error('[RedisCacheAdapter] Not implemented yet. Please install ioredis and configure Redis.')
  }

  /**
   * 设置缓存值
   */
  async set(_key: string, _value: any, _ttl?: number): Promise<void> {
    // ⚠️ TODO: 待实现
    // const serialized = JSON.stringify(value)
    // const fullKey = this.getFullKey(key)
    
    // if (ttl) {
    //   await this.client.setex(fullKey, ttl, serialized)
    // } else {
    //   await this.client.set(fullKey, serialized)
    // }

    throw new Error('[RedisCacheAdapter] Not implemented yet. Please install ioredis and configure Redis.')
  }

  /**
   * 删除缓存
   */
  async delete(_key: string): Promise<void> {
    // ⚠️ TODO: 待实现
    // await this.client.del(this.getFullKey(key))

    throw new Error('[RedisCacheAdapter] Not implemented yet. Please install ioredis and configure Redis.')
  }

  /**
   * 清空所有缓存（仅清空带前缀的key）
   */
  async clear(): Promise<void> {
    // ⚠️ TODO: 待实现
    // const keys = await this.client.keys(`${this.keyPrefix}*`)
    // if (keys.length > 0) {
    //   await this.client.del(...keys)
    // }

    throw new Error('[RedisCacheAdapter] Not implemented yet. Please install ioredis and configure Redis.')
  }

  /**
   * 检查缓存是否存在
   */
  async has(_key: string): Promise<boolean> {
    // ⚠️ TODO: 待实现
    // const exists = await this.client.exists(this.getFullKey(key))
    // return exists === 1

    throw new Error('[RedisCacheAdapter] Not implemented yet. Please install ioredis and configure Redis.')
  }

  /**
   * 批量获取缓存
   */
  async mget<T = any>(_keys: string[]): Promise<(T | null)[]> {
    // ⚠️ TODO: 待实现
    // const fullKeys = keys.map(k => this.getFullKey(k))
    // const values = await this.client.mget(...fullKeys)
    // return values.map(v => {
    //   if (!v) return null
    //   try {
    //     return JSON.parse(v) as T
    //   } catch {
    //     return v as T
    //   }
    // })

    throw new Error('[RedisCacheAdapter] Not implemented yet. Please install ioredis and configure Redis.')
  }

  /**
   * 批量设置缓存
   */
  async mset(_entries: Array<{ key: string; value: any }>, _ttl?: number): Promise<void> {
    // ⚠️ TODO: 待实现
    // if (ttl) {
    //   // 有TTL时需要单独设置每个key
    //   await Promise.all(entries.map(({ key, value }) => this.set(key, value, ttl)))
    // } else {
    //   // 无TTL时可以批量设置
    //   const pairs: string[] = []
    //   for (const { key, value } of entries) {
    //     pairs.push(this.getFullKey(key), JSON.stringify(value))
    //   }
    //   await this.client.mset(...pairs)
    // }

    throw new Error('[RedisCacheAdapter] Not implemented yet. Please install ioredis and configure Redis.')
  }

  /**
   * 关闭Redis连接
   */
  async disconnect(): Promise<void> {
    // ⚠️ TODO: 待实现
    // await this.client.quit()
  }
}

/**
 * ⚠️ 实施说明：
 * 
 * 1. 安装依赖：
 *    npm install ioredis
 *    npm install -D @types/ioredis
 * 
 * 2. 取消注释代码：
 *    - import Redis from 'ioredis'
 *    - new Redis({ ... })
 *    - 所有方法的实现代码
 * 
 * 3. 配置环境变量：
 *    CACHE_TYPE=redis
 *    REDIS_HOST=r-***.redis.aliyuncs.com
 *    REDIS_PORT=6379
 *    REDIS_PASSWORD=your-password
 *    REDIS_DB=0
 * 
 * 4. 测试：
 *    - 连接Redis
 *    - 设置/获取缓存
 *    - 批量操作
 *    - TTL过期
 */

