// This is the **logger** module for *Karma*. It uses
// [log4js](https://github.com/nomiddlename/log4js-node) to handle and
// configure all logging that happens inside of *Karma*.

// ### Helpers and Setup

let log4js = require('log4js')
const helper = require('./helper')
const constant = require('./constants')

// #### Public Functions

// Setup the logger by passing in the configuration options. It needs
// three arguments:
//
//     setup(logLevel, colors, appenders)
//
// * `logLevel`: *String* Defines the global log level.
// * `colors`: *Boolean* Use colors in the stdout or not.
// * `appenders`: *Object*  This will be passed as appenders to log4js
//   to allow for fine grained configuration of log4js. For more information
//   see https://github.com/nomiddlename/log4js-node.
//   *Array* is also accepted for backwards compatibility.
function setup (level, colors, appenders) {
  // Turn color on/off on the console appenders with pattern layout
  const pattern = colors ? constant.COLOR_PATTERN : constant.NO_COLOR_PATTERN
  if (appenders) {
    // Convert Array to Object for backwards compatibility.
    if (appenders['map']) {
      if (appenders.length === 0) {
        appenders = [constant.CONSOLE_APPENDER]
      }
      const v1Appenders = appenders
      appenders = {}
      v1Appenders.forEach(function (appender, index) {
        if (appender.type === 'console') {
          appenders['console'] = appender
          if (helper.isDefined(appender.layout) && appender.layout.type === 'pattern') {
            appender.layout.pattern = pattern
          }
        } else {
          appenders[index + ''] = appender
        }
        return appender
      })
    }
  } else {
    appenders = { 'console': constant.CONSOLE_APPENDER }
  }

  log4js.configure({
    appenders: appenders,
    categories: {
      'default': {
        'appenders': Object.keys(appenders),
        'level': level
      }
    }
  })
}

// Setup the logger by passing in the config object. The function sets the
// `colors` and `logLevel` if they are defined. It takes two arguments:
//
//     setupFromConfig(config, appenders)
//
// * `config`: *Object* The configuration object.
// * `appenders`: *Object*  This will be passed as appenders to log4js
//   to allow for fine grained configuration of log4js. For more information
//   see https://github.com/nomiddlename/log4js-node.
//   *Array* is also accepted for backwards compatibility.
function setupFromConfig (config, appenders) {
  let useColors = true
  let logLevel = constant.LOG_INFO

  if (helper.isDefined(config.colors)) {
    useColors = config.colors
  }

  if (helper.isDefined(config.logLevel)) {
    logLevel = config.logLevel
  }
  setup(logLevel, useColors, appenders)
}

const loggerCache = {}

// Create a new logger. There are two optional arguments
// * `name`, which defaults to `karma` and
//   If the `name = 'socket.io'` this will create a special wrapper
//   to be used as a logger for socket.io.
// * `level`, which defaults to the global level.
function create (name, level) {
  name = name || 'karma'
  let logger
  if (loggerCache.hasOwnProperty(name)) {
    logger = loggerCache[name]
  } else {
    logger = log4js.getLogger(name)
    loggerCache[name] = logger
  }
  if (helper.isDefined(level)) {
    logger.setLevel(level)
  }
  return logger
}

// #### Publish

exports.create = create
exports.setup = setup
exports.setupFromConfig = setupFromConfig
exports._rebindLog4js4testing = function (mockLog4js) {
  log4js = mockLog4js
}
