interface CacheItem<T> {
  value: T
  expiry?: number // 过期时间戳（毫秒），可选
}

/**
 * 通用缓存管理类（支持过期时间，不设 TTL 即为永久缓存）
 */
class CacheManager {
  /**
   * 设置缓存
   * @param key 缓存键
   * @param value 缓存值
   * @param ttl 过期时间（秒）。若为 undefined、null 或 <=0，则视为永久缓存（永不过期）
   */
  static set<T>(key: string, value: T, ttl?: number | null): void {
    try {
      const cacheItem: CacheItem<T> = { value }

      // 仅当 ttl 为正数时才设置过期时间
      if (ttl != null && ttl > 0) {
        cacheItem.expiry = Date.now() + ttl * 1000
      }
      // 否则 cacheItem.expiry 保持 undefined，表示永久缓存

      uni.setStorageSync(key, cacheItem)
    }
    catch (e) {
      console.error('CacheManager.set error:', e)
    }
  }

  /**
   * 获取缓存（自动清除过期项）
   * @param key 缓存键
   * @param defaultValue 默认值（缓存不存在、过期或出错时返回）
   * @returns 缓存值或默认值
   */
  static get<T>(key: string, defaultValue: T = null as unknown as T): T {
    try {
      const raw = uni.getStorageSync(key)
      if (!raw)
        return defaultValue

      const cacheItem = raw as CacheItem<T>

      // 若有 expiry 且已过期，则清除并返回默认值
      if (cacheItem.expiry !== undefined && Date.now() > cacheItem.expiry) {
        uni.removeStorageSync(key)
        return defaultValue
      }

      return cacheItem.value
    }
    catch (e) {
      console.error('CacheManager.get error:', e)
      return defaultValue
    }
  }

  /**
   * 删除指定缓存
   */
  static remove(key: string): void {
    try {
      uni.removeStorageSync(key)
    }
    catch (e) {
      console.error('CacheManager.remove error:', e)
    }
  }

  /**
   * 清空所有缓存
   */
  static clear(): void {
    try {
      uni.clearStorageSync()
    }
    catch (e) {
      console.error('CacheManager.clear error:', e)
    }
  }

  /**
   * 检查是否存在有效（未过期）缓存
   */
  static has(key: string): boolean {
    try {
      const raw = uni.getStorageSync(key)
      if (!raw)
        return false

      const cacheItem = raw as CacheItem<unknown>
      if (cacheItem.expiry !== undefined && Date.now() > cacheItem.expiry) {
        uni.removeStorageSync(key)
        return false
      }
      return true
    }
    catch (e) {
      console.error('CacheManager.has error:', e)
      return false
    }
  }
}

export default CacheManager
