/**
 * 媒体缓存类型定义
 * @module src/infrastructure/cache/types
 * @description 定义媒体缓存相关的类型、枚举和接口
 */

/**
 * 媒体类型枚举
 * @enum {string}
 * @description 支持的媒体类型
 */
export enum MediaType {
  IMAGE = 'IMAGE',
  VIDEO = 'VIDEO',
  AUDIO = 'AUDIO',
}

/**
 * 清理触发器枚举
 * @enum {string}
 * @description 触发清理操作的来源
 */
export enum CleanupTrigger {
  STARTUP = 'startup',
  SCHEDULED = 'scheduled',
  MANUAL = 'manual',
  LOW_STORAGE = 'low_storage',
  CONVERSATION_DELETED = 'conversation_deleted',
}

/**
 * 缓存条目接口
 * @interface CacheEntry
 * @description 单个媒体缓存条目的信息
 */
export interface CacheEntry {
  /** 缓存键值 */
  key: string;
  /** 媒体类型 */
  type: MediaType;
  /** 原始URI */
  uri: string;
  /** 本地存储路径 */
  localPath: string;
  /** 文件大小(字节) */
  size: number;
  /** 所属会话ID(可选) */
  conversationId?: string;
  /** 关联消息ID(可选) */
  messageId?: string;
  /** 创建时间 */
  createdAt: number;
  /** 最后访问时间 */
  lastAccessedAt: number;
}

/**
 * 缓存统计接口
 * @interface CacheStats
 * @description 媒体缓存的整体统计信息
 */
export interface CacheStats {
  /** 总缓存大小(字节) */
  totalSize: number;
  /** 图片缓存数量 */
  imageCount: number;
  /** 视频缓存数量 */
  videoCount: number;
  /** 音频缓存数量 */
  audioCount: number;
  /** 总条目数 */
  totalEntries: number;
  /** 最早缓存项时间 */
  oldestItem: number;
  /** 最新缓存项时间 */
  newestItem: number;
}

/**
 * 清理策略接口
 * @interface CleanupPolicy
 * @description 定义缓存清理的规则和限制
 */
export interface CleanupPolicy {
  /** 最大缓存时间(毫秒) */
  maxAge: number;
  /** 最大缓存大小(字节) */
  maxSize: number;
  /** 最大条目数 */
  maxEntries: number;
  /** 启动时是否清理 */
  cleanupOnStart: boolean;
  /** 定期清理间隔(毫秒) */
  cleanupInterval: number;
  /** 是否启用LRU清理 */
  enableLRU: boolean;
  /** 低存储空间阈值(字节) */
  lowStorageThreshold: number;
}

/**
 * 清理结果接口
 * @interface CleanupResult
 * @description 清理操作的执行结果
 */
export interface CleanupResult {
  /** 触发器类型 */
  trigger: CleanupTrigger;
  /** 执行时间戳 */
  timestamp: number;
  /** 删除条目数量 */
  deletedCount: number;
  /** 释放空间大小(字节) */
  freedSize: number;
  /** 错误信息列表 */
  errors: string[];
  /** 清理的条目详情 */
  deletedItems?: string[];
}

/**
 * 媒体缓存配置接口
 * @interface MediaCacheConfig
 * @description 媒体缓存的全局配置
 */
export interface MediaCacheConfig {
  /** 图片配置 */
  image: {
    /** 内存缓存数量 */
    maxMemoryCacheSize: number;
    /** 磁盘缓存大小(MB) */
    maxDiskCacheSize: number;
    /** 缓存有效期(小时) */
    maxAge: number;
    /** 会话内媒体保留时间(天) */
    maxAgeForConversation: number;
  };
  /** 视频配置 */
  video: {
    /** 磁盘缓存大小(MB) */
    maxDiskCacheSize: number;
    /** 缓存有效期(小时) */
    maxAge: number;
    /** 是否自动预加载 */
    autoPreload: boolean;
  };
  /** 音频配置 */
  audio: {
    /** 磁盘缓存大小(MB) */
    maxDiskCacheSize: number;
    /** 缓存有效期(天) */
    maxAge: number;
  };
  /** 全局配置 */
  global: {
    /** 启动时检查清理 */
    checkOnStartup: boolean;
    /** 定期检查间隔(小时) */
    checkInterval: number;
    /** 低存储空间阈值(MB) */
    lowStorageThreshold: number;
  };
}

/**
 * 默认媒体缓存配置
 */
export const DEFAULT_MEDIA_CACHE_CONFIG: MediaCacheConfig = {
  image: {
    maxMemoryCacheSize: 50,
    maxDiskCacheSize: 500,
    maxAge: 168, // 7 days
    maxAgeForConversation: 30,
  },
  video: {
    maxDiskCacheSize: 1000,
    maxAge: 72, // 3 days
    autoPreload: false,
  },
  audio: {
    maxDiskCacheSize: 200,
    maxAge: 168, // 7 days
  },
  global: {
    checkOnStartup: true,
    checkInterval: 24,
    lowStorageThreshold: 500,
  },
};

/**
 * 默认清理策略
 */
export const DEFAULT_CLEANUP_POLICY: CleanupPolicy = {
  maxAge: 7 * 24 * 60 * 60 * 1000, // 7天
  maxSize: 500 * 1024 * 1024, // 500MB
  maxEntries: 1000,
  cleanupOnStart: true,
  cleanupInterval: 24 * 60 * 60 * 1000, // 24小时
  enableLRU: true,
  lowStorageThreshold: 500 * 1024 * 1024, // 500MB
};
