'use strict' const fs = require('fs') const path = require('path') const YError = require('./yerror')

let previouslyVisitedConfigs = []

function checkForCircularExtends (cfgPath) {

if (previouslyVisitedConfigs.indexOf(cfgPath) > -1) {
  throw new YError(`Circular extended configurations: '${cfgPath}'.`)
}

}

function getPathToDefaultConfig (cwd, pathToExtend) {

return path.resolve(cwd, pathToExtend)

}

function applyExtends (config, cwd) {

let defaultConfig = {}

if (config.hasOwnProperty('extends')) {
  if (typeof config.extends !== 'string') return defaultConfig
  const isPath = /\.json|\..*rc$/.test(config.extends)
  let pathToDefault = null
  if (!isPath) {
    try {
      pathToDefault = require.resolve(config.extends)
    } catch (err) {
      // most likely this simply isn't a module.
    }
  } else {
    pathToDefault = getPathToDefaultConfig(cwd, config.extends)
  }
  // maybe the module uses key for some other reason,
  // err on side of caution.
  if (!pathToDefault && !isPath) return config

  checkForCircularExtends(pathToDefault)

  previouslyVisitedConfigs.push(pathToDefault)

  defaultConfig = isPath ? JSON.parse(fs.readFileSync(pathToDefault, 'utf8')) : require(config.extends)
  delete config.extends
  defaultConfig = applyExtends(defaultConfig, path.dirname(pathToDefault))
}

previouslyVisitedConfigs = []

return Object.assign({}, defaultConfig, config)

}

module.exports = applyExtends