import debugLogger from 'debug-logger'

// Enable colours for object inspection.
debugLogger.inspectOptions = {
  colors: true
}

// Enable all zap logs if DEBUG has not been explicitly set.
if (!process.env.DEBUG) {
  // debugLogger.debug.enable('zap:*')
  process.env.DEBUG = 'zap:*'
}
if (!process.env.DEBUG_LEVEL) {
  process.env.DEBUG_LEVEL = 'info'
}

// Method to configure a logger instance with a specific namespace suffix.
const logConfig = name => ({
  levels: {
    trace: {
      prefix: '[TRC]  ',
      namespaceSuffix: `:${name}`
    },
    debug: {
      prefix: '[DBG]  ',
      namespaceSuffix: `:${name}`
    },
    log: {
      prefix: '[LOG]  ',
      namespaceSuffix: `:${name}`
    },
    info: {
      prefix: '[INF]  ',
      namespaceSuffix: `:${name}`
    },
    warn: {
      prefix: '[WRN]  ',
      namespaceSuffix: `:${name}`
    },
    error: {
      prefix: '[ERR]  ',
      namespaceSuffix: `:${name}`
    },
    critical: {
      color: debugLogger.colors.magenta,
      prefix: '[CRT]  ',
      namespaceSuffix: `:${name}`,
      level: 6,
      fd: 2
    }
  }
})

// Create 2 logs for use in the app.
export const mainLog = debugLogger.config(logConfig('main'))('zap')
export const lndLog = debugLogger.config(logConfig('lnd '))('zap')

let lndLogLevel = null // stored most recent log level for continuity
export const lndLogGetLevel = msg => {
  // Define a mapping between log level prefixes and log level names.
  const levelMap = {
    TRC: 'trace',
    DBG: 'debug',
    INF: 'info',
    WRN: 'warn',
    ERR: 'error',
    CRT: 'critical'
  }

  // Parse the log line to determine its level.
  let level
  Object.entries(levelMap).forEach(([key, value]) => {
    if (msg.includes(`[${key}]`)) {
      level = value
    }
  })
  if (level) {
    lndLogLevel = level
    return level
  }
  // We set the default level to trace.
  // The only log lines that don't include a level prefix are a part of trace entries
  return lndLogLevel || 'trace'
}