/**
 * 多级日志系统
 * 支持 a.b.c 格式的多级日志名，从项目本地配置文件读取日志开关配置
 * 配置文件路径：src/config/logger.config.js 或 src/config/config.js
 * 使用方式：
 *   import logger from '@vue2-client/utils/logger'
 *   logger('a.b.c').log('消息内容')
 *   logger('a.b.c').info('信息')
 *   logger('a.b.c').warn('警告')
 *   logger('a.b.c').error('错误')
 */

// 缓存日志配置，避免重复读取
let cachedLogConfig = null
let configLoadAttempted = false

/**
 * 从项目配置文件中读取日志配置
 * 尝试多个可能的路径：@/config/logger.config.js、@/config/config.js
 */
function getLogConfig() {
  // 如果已经尝试过加载，直接返回缓存
  if (configLoadAttempted) {
    return cachedLogConfig
  }
  
  configLoadAttempted = true
  cachedLogConfig = null
  
  // 尝试从各个路径加载配置（使用静态 require，webpack 可以处理）
  // 1. 尝试 @/config/logger.config.js
  try {
    // eslint-disable-next-line
    const loggerConfig = require('@/config/logger.config')
    if (loggerConfig) {
      cachedLogConfig = loggerConfig.default || loggerConfig
      return cachedLogConfig
    }
  } catch (e) {
    // 文件不存在，继续尝试下一个路径
  }
  
  // 2. 尝试 @/config/config.js（检查是否有 logger 或 logLevels 字段）
  try {
    // eslint-disable-next-line
    const appConfig = require('@/config/config')
    if (appConfig) {
      const config = appConfig.default || appConfig
      if (config.logger || config.logLevels || config.logEnabled) {
        cachedLogConfig = config.logger || config.logLevels || config.logEnabled
        return cachedLogConfig
      }
      // 如果 config 本身就是数组或对象，且没有 logger 字段，可能是直接导出的日志配置
      if (Array.isArray(config) || (typeof config === 'object' && !config.compatible)) {
        cachedLogConfig = config
        return cachedLogConfig
      }
    }
  } catch (e) {
    // 文件不存在，继续尝试下一个路径
  }
  
  // 3. 尝试相对路径 src/config/logger.config.js（备用方案，与 @/config 等价）
  try {
    // eslint-disable-next-line
    const loggerConfigRel = require('../config/logger.config')
    if (loggerConfigRel) {
      cachedLogConfig = loggerConfigRel.default || loggerConfigRel
      return cachedLogConfig
    }
  } catch (e) {
    // 文件不存在，使用默认配置
  }
  
  return cachedLogConfig
}

/**
 * 检查日志路径是否启用
 * @param {string} logPath - 日志路径，如 'a.b.c'
 * @returns {boolean}
 */
function isLogEnabled(logPath) {
  const logConfig = getLogConfig()
  
  // 如果没有找到日志配置，默认全部启用（开发友好）
  if (!logConfig) {
    return true
  }
  
  // 支持数组格式：logLevels: ['a.b.c', 'x.y', 'a.*']
  if (Array.isArray(logConfig)) {
    return logConfig.some(pattern => {
      // 精确匹配
      if (pattern === logPath) return true
      // 通配符匹配：'a.*' 匹配 'a.b', 'a.b.c' 等
      if (pattern.endsWith('.*')) {
        const prefix = pattern.slice(0, -2)
        return logPath.startsWith(prefix + '.') || logPath === prefix
      }
      // 全局通配
      if (pattern === '*') return true
      return false
    })
  }
  
  // 支持对象格式：logLevels: { 'a.b.c': true, 'x.y': false }
  if (logConfig && typeof logConfig === 'object' && !Array.isArray(logConfig)) {
    return logConfig[logPath] === true
  }
  
  // 默认不启用
  return false
}

/**
 * 创建日志方法
 * @param {string} logPath - 日志路径，如 'a.b.c'
 * @returns {object} 包含 log, info, warn, error, debug 方法的对象
 */
function createLogger(logPath) {
  const prefix = `log[${logPath}]:`
  
  const logFn = (level, ...args) => {
    if (!isLogEnabled(logPath)) {
      return
    }
    
    const consoleMethod = console[level] || console.log
    consoleMethod(prefix, ...args)
  }
  
  return {
    log: (...args) => logFn('log', ...args),
    info: (...args) => logFn('info', ...args),
    warn: (...args) => logFn('warn', ...args),
    error: (...args) => logFn('error', ...args),
    debug: (...args) => logFn('debug', ...args),
  }
}

/**
 * 主入口函数
 * @param {string} logPath - 日志路径，如 'a.b.c'
 * @returns {object} 日志对象
 */
function logger(logPath) {
  if (!logPath || typeof logPath !== 'string') {
    console.warn('[logger] 无效的日志路径:', logPath)
    return createLogger('unknown')
  }
  
  return createLogger(logPath)
}

export default logger
export { isLogEnabled }
