// 日志工具类

/**
 * 获取调用者信息
 * @returns 包含函数名和代码行的对象
 */
function getCallerInfo() {
  const error = new Error();
  const stack = error.stack || '';
  const stackLines = stack.split('\n');
  
  // 跳过前两行（Error和getCallerInfo本身的调用）
  let callerIndex = 2;
  
  // 找到第一个不是logger.ts的调用者
  while (callerIndex < stackLines.length) {
    const line = stackLines[callerIndex].trim();
    if (!line.includes('logger.ts') && !line.includes('logger.js')) {
      break;
    }
    callerIndex++;
  }
  
  if (callerIndex < stackLines.length) {
    const callerLine = stackLines[callerIndex];
    
    // 提取文件路径和行号
    let filePath = 'unknown';
    let lineNumber = 0;
    let functionName = 'anonymous';
    
    // 1. 处理包含文件路径的情况
    if (callerLine.includes('(')) {
      // 格式1: at functionName (filePath:line:column)
      const match1 = callerLine.match(/at\s+(.*?)\s+\((.*?):(\d+):(\d+)\)/);
      if (match1) {
        functionName = match1[1] || 'anonymous';
        filePath = match1[2];
        lineNumber = parseInt(match1[3], 10);
      }
    } else {
      // 格式2: at filePath:line:column
      const match2 = callerLine.match(/at\s+(.*?):(\d+):(\d+)/);
      if (match2) {
        filePath = match2[1];
        lineNumber = parseInt(match2[2], 10);
      }
    }
    
    // 2. 提取文件名
    const fileName = filePath.split('\\').pop() || filePath.split('/').pop() || 'unknown';
    
    // 3. 特殊处理async函数和箭头函数
    if (functionName === 'anonymous' && callerLine.includes('async')) {
      functionName = 'async';
    }
    
    return {
      functionName,
      fileName,
      lineNumber
    };
  }
  
  return {
    functionName: 'anonymous',
    fileName: 'unknown',
    lineNumber: 0
  };
}

/**
 * 获取当前时间戳
 * @returns 格式化的时间戳字符串
 */
function getTimestamp() {
  const now = new Date();
  return now.toISOString();
}

/**
 * 日志工具类
 */
export const logger = {
  /**
   * 普通日志
   * @param message 日志消息
   * @param data 附加数据
   */
  log(message: string, data?: any) {
    const callerInfo = getCallerInfo();
    const timestamp = getTimestamp();
    const logMessage = `[${timestamp}] [${callerInfo.fileName}:${callerInfo.functionName}:${callerInfo.lineNumber}] ${message}`;
    if (data) {
      console.log(logMessage, data);
    } else {
      console.log(logMessage);
    }
  },

  /**
   * 警告日志
   * @param message 警告消息
   * @param data 附加数据
   */
  warn(message: string, data?: any) {
    const callerInfo = getCallerInfo();
    const timestamp = getTimestamp();
    const logMessage = `[${timestamp}] [${callerInfo.fileName}:${callerInfo.functionName}:${callerInfo.lineNumber}] ${message}`;
    if (data) {
      console.warn(logMessage, data);
    } else {
      console.warn(logMessage);
    }
  },

  /**
   * 错误日志
   * @param message 错误消息
   * @param data 附加数据
   */
  error(message: string, data?: any) {
    const callerInfo = getCallerInfo();
    const timestamp = getTimestamp();
    const logMessage = `[${timestamp}] [${callerInfo.fileName}:${callerInfo.functionName}:${callerInfo.lineNumber}] ${message}`;
    if (data) {
      console.error(logMessage, data);
    } else {
      console.error(logMessage);
    }
  },

  /**
   * 信息日志
   * @param message 信息消息
   * @param data 附加数据
   */
  info(message: string, data?: any) {
    const callerInfo = getCallerInfo();
    const timestamp = getTimestamp();
    const logMessage = `[${timestamp}] [${callerInfo.fileName}:${callerInfo.functionName}:${callerInfo.lineNumber}] ${message}`;
    if (data) {
      console.info(logMessage, data);
    } else {
      console.info(logMessage);
    }
  }
};

export default logger;