import { hilog } from '@kit.PerformanceAnalysisKit';

// 日志域 - 应用程序的唯一标识符
const LOG_DOMAIN: number = 0;
// 日志标签 - 用于筛选日志
const LOG_TAG: string = 'ClassMG';

/**
 * 日志类别枚举
 */
export enum LogCategory {
  USER = 'USER',
  SETTINGS = 'SETTINGS',
  NAVIGATION = 'NAVIGATION',
  PERFORMANCE = 'PERFORMANCE',
  NETWORK = 'NETWORK',
  UI = 'UI',
  DATA = 'DATA',
  ERROR = 'ERROR',
  SYSTEM = 'SYSTEM',
  HOME = 'HOME',
  CLASS = 'CLASS'
}

/**
 * 日志事件类型枚举
 */
export enum LogEventType {
  PAGE_VIEW = 'PAGE_VIEW',
  BUTTON_CLICK = 'BUTTON_CLICK',
  DATA_UPDATE = 'DATA_UPDATE',
  SETTING_CHANGE = 'SETTING_CHANGE',
  THEME_CHANGE = 'THEME_CHANGE',
  LANGUAGE_CHANGE = 'LANGUAGE_CHANGE',
  NOTIFICATION_CHANGE = 'NOTIFICATION_CHANGE',
  LOGIN = 'LOGIN',
  LOGOUT = 'LOGOUT',
  ERROR = 'ERROR',
  PAGE_APPEAR = 'PAGE_APPEAR',
  PAGE_DISAPPEAR = 'PAGE_DISAPPEAR',
  PAGE_SHOW = 'PAGE_SHOW',
  PAGE_HIDE = 'PAGE_HIDE',
  PAGE_BACK = 'PAGE_BACK',
  SYSTEM_INFO = 'SYSTEM_INFO'
}

/**
 * 版本日志项
 */
export interface VersionLogItem {
  version: string;      // 版本号
  date: string;         // 发布日期
  changes: string[];    // 更新内容列表
}

/**
 * 简单的日志记录
 * @param message 日志信息
 */
export function logInfo(message: string): void {
  hilog.info(LOG_DOMAIN, LOG_TAG, message);
}

/**
 * 日志管理类 - 主要用于管理版本日志
 */
export class LogManager {
  private static instance: LogManager;
  // 版本日志列表
  private versionLogs: VersionLogItem[] = [];
  // 当前语言
  private currentLanguage: string = '中文';
  
  private constructor() {
    this.initVersionLogs();
  }
  
  /**
   * 获取LogManager实例
   */
  public static getInstance(): LogManager {
    if (!LogManager.instance) {
      LogManager.instance = new LogManager();
    }
    return LogManager.instance;
  }
  
  /**
   * 设置当前语言
   * @param language 语言设置
   */
  public setLanguage(language: string): void {
    this.currentLanguage = language;
    logInfo(`日志管理器语言已设置为: ${language}`);
  }
  
  /**
   * 记录信息日志
   * @param category 日志类别
   * @param type 事件类型
   * @param message 日志消息或数据
   */
  public info(category: LogCategory, type: LogEventType, message: string | number | boolean): void {
    const logMessage = `[${category}][${type}] ${message}`;
    hilog.info(LOG_DOMAIN, LOG_TAG, logMessage);
  }
  
  /**
   * 记录调试日志，带有更多上下文
   * @param category 日志类别
   * @param type 事件类型
   * @param key 相关的键或属性名
   * @param oldValue 旧值
   * @param newValue 新值
   */
  public debug(category: LogCategory, type: LogEventType, key: string, oldValue: string | number | boolean, newValue: string | number | boolean): void {
    const logMessage = `[${category}][${type}] ${key}: ${oldValue} -> ${newValue}`;
    hilog.debug(LOG_DOMAIN, LOG_TAG, logMessage);
  }
  
  /**
   * 记录警告日志
   * @param category 日志类别
   * @param message 警告消息
   */
  public warn(category: LogCategory, message: string): void {
    const logMessage = `[${category}][WARN] ${message}`;
    hilog.warn(LOG_DOMAIN, LOG_TAG, logMessage);
  }
  
  /**
   * 记录错误日志
   * @param category 日志类别
   * @param error 错误对象或消息
   */
  public error(category: LogCategory, error: string | Error): void {
    const errorMessage = error instanceof Error ? `${error.name}: ${error.message}` : error;
    const logMessage = `[${category}][ERROR] ${errorMessage}`;
    hilog.error(LOG_DOMAIN, LOG_TAG, logMessage);
  }
  
  /**
   * 初始化版本日志数据
   */
  private initVersionLogs(): void {
    this.versionLogs = [
      {
        version: "1.2.0",
        date: "2023-12-15",
        changes: [
          "优化设置页面UI和交互体验",
          "增加版本日志功能",
          "实现多语言切换优化",
          "改进主题颜色切换效果"
        ]
      },
      {
        version: "1.1.0",
        date: "2023-11-10",
        changes: [
          "添加用户信息编辑功能",
          "优化首页数据展示",
          "修复已知问题"
        ]
      },
      {
        version: "1.0.0",
        date: "2023-10-15",
        changes: [
          "初始版本发布",
          "实现基本功能界面",
          "添加用户信息管理",
          "支持主题色切换",
          "支持中英文切换"
        ]
      }
    ];
  }
  
  /**
   * 获取所有版本日志
   */
  public getVersionLogs(): VersionLogItem[] {
    return this.versionLogs;
  }
  
  /**
   * 获取最新版本号
   */
  public getLatestVersion(): string {
    if (this.versionLogs && this.versionLogs.length > 0) {
      return this.versionLogs[0].version;
    }
    return "1.0.0"; // 默认版本号
  }
  
  /**
   * 添加新版本日志
   * @param versionLog 版本日志项
   */
  public addVersionLog(versionLog: VersionLogItem): void {
    // 检查版本是否已存在
    const existingIndex = this.versionLogs.findIndex(log => log.version === versionLog.version);
    if (existingIndex !== -1) {
      // 如果已存在，更新该版本信息
      this.versionLogs[existingIndex] = versionLog;
      logInfo(`版本日志已更新: ${versionLog.version}`);
    } else {
      // 如果不存在，添加到列表开头（最新版本）
      this.versionLogs.unshift(versionLog);
      logInfo(`新版本日志已添加: ${versionLog.version}`);
    }
    
    // 按版本号排序（假设版本号格式为x.y.z）
    this.versionLogs.sort((a, b) => {
      const vA = a.version.split('.').map(Number);
      const vB = b.version.split('.').map(Number);
      for (let i = 0; i < Math.max(vA.length, vB.length); i++) {
        const numA = i < vA.length ? vA[i] : 0;
        const numB = i < vB.length ? vB[i] : 0;
        if (numB - numA !== 0) return numB - numA;
      }
      return 0;
    });
  }
}

// 导出单例实例
export default LogManager.getInstance();
