/**
 * 前端日志工具类
 * 记录到浏览器控制台，并可选择发送到后端API
 */
export class FrontendLogger {
  private serviceName: string;
  private enableApiLogging: boolean;

  /**
   * 构造函数
   * @param serviceName 服务名称
   * @param enableApiLogging 是否启用API日志记录，默认为false
   */
  constructor(serviceName: string, enableApiLogging: boolean = false) {
    this.serviceName = serviceName;
    this.enableApiLogging = enableApiLogging;
  }

  /**
   * 格式化日志消息
   * @param level 日志级别
   * @param message 日志消息
   * @param metadata 元数据
   */
  private formatMessage(level: string, message: string, metadata?: any): string {
    const now = new Date();
    const timestamp = now.toISOString();
    const formattedMessage = `[${timestamp}] [${level.toUpperCase()}] [${this.serviceName}] ${message}`;

    if (metadata) {
      const metadataStr = typeof metadata === 'object'
        ? JSON.stringify(metadata, null, 2)
        : String(metadata);
      return `${formattedMessage}\n${metadataStr}`;
    }

    return formattedMessage;
  }

  /**
   * 发送日志到后端API（如果启用）
   * @param level 日志级别
   * @param message 日志消息
   * @param metadata 元数据
   */
  private async sendToApi(level: string, message: string, metadata?: any): Promise<void> {
    if (!this.enableApiLogging) return;

    try {
      // 这里可以调用后端API来记录日志
      // 例如：await fetch('/api/logs', { method: 'POST', body: JSON.stringify({ level, message, metadata }) })
      // 目前先留空，需要时再实现
      console.debug(`[API日志] ${level}: ${message}`, metadata);
    } catch (error) {
      console.error('发送日志到API失败:', error);
    }
  }

  /**
   * 记录信息级别日志
   * @param message 日志消息
   * @param metadata 元数据
   */
  async info(message: string, metadata?: any): Promise<void> {
    const formattedMessage = this.formatMessage('info', message, metadata);
    console.log(formattedMessage);
    await this.sendToApi('info', message, metadata);
  }

  /**
   * 记录警告级别日志
   * @param message 日志消息
   * @param metadata 元数据
   */
  async warn(message: string, metadata?: any): Promise<void> {
    const formattedMessage = this.formatMessage('warn', message, metadata);
    console.warn(formattedMessage);
    await this.sendToApi('warn', message, metadata);
  }

  /**
   * 记录错误级别日志
   * @param message 日志消息
   * @param metadata 元数据
   */
  async error(message: string, metadata?: any): Promise<void> {
    const formattedMessage = this.formatMessage('error', message, metadata);
    console.error(formattedMessage);
    await this.sendToApi('error', message, metadata);
  }

  /**
   * 记录调试级别日志
   * @param message 日志消息
   * @param metadata 元数据
   */
  async debug(message: string, metadata?: any): Promise<void> {
    const formattedMessage = this.formatMessage('debug', message, metadata);
    console.debug(formattedMessage);
    await this.sendToApi('debug', message, metadata);
  }

  /**
   * 记录日志（通用方法）
   * @param level 日志级别
   * @param message 日志消息
   * @param metadata 元数据
   */
  async log(level: 'info' | 'warn' | 'error' | 'debug', message: string, metadata?: any): Promise<void> {
    switch (level) {
      case 'info':
        await this.info(message, metadata);
        break;
      case 'warn':
        await this.warn(message, metadata);
        break;
      case 'error':
        await this.error(message, metadata);
        break;
      case 'debug':
        await this.debug(message, metadata);
        break;
    }
  }
}

/**
 * 创建前端日志器实例
 * @param serviceName 服务名称
 * @returns FrontendLogger 实例
 */
export function createFrontendLogger(serviceName: string): FrontendLogger {
  return new FrontendLogger(serviceName);
}