'use strict';

var readFile = require('fs').readFileSync;
var exists = require('fs').existsSync;
var join = require('path').join;
var spmrc = require('spmrc');
var extend = require('extend');
var mixarg = require('mixarg');

var defaults = {
  // registry url of yuan server
  registry: spmrc.get('registry'),
  // global registry, others are private
  global_registry: 'http://spmjs.io',
  // an HTTP proxy, pass to request
  proxy: spmrc.get('proxy'),
  // the authKey that copied from spmjs accout page
  auth: spmrc.get('auth'),
  // the temp directory
  temp: spmrc.get('user.temp'),
  // cache directory
  cache: join(spmrc.get('user.home'), '.spm', 'cache')
};

module.exports = function(cwd, opts) {
  cwd = cwd || process.cwd();
  opts = opts || {};
  var pkgArgs = getPkgArgs(cwd, opts.pkg);
  return extend.apply(null, [true, {}, defaults, pkgArgs].concat(opts.merge));
};

function getPkgArgs(cwd, pkg) {
  if (!pkg) {
    var pkgPath = join(cwd, 'package.json');
    if (!exists(pkgPath)) return {};
    pkg = JSON.parse(readFile(pkgPath));
  }
  if (!pkg.spm) return {};

  var buildArgs = mixarg(pkg.spm.buildArgs);
  buildArgs.global = getGlobal(buildArgs.global);

  var ret = {
    registry: pkg.spm.registry,
    build: extend(buildArgs, pkg.spm.build),
    server: pkg.spm.server || {},
    scripts: pkg.spm.scripts || {}
  };

  // 兼容之前的 build 配置
  [
    'extractCSS', 'common', 'babel', 'uglify', 'hash', 'dest', 'less',
    'autoprefixer', 'umd', 'pathmap'
  ].forEach(function(key) {
    if (pkg.spm.hasOwnProperty(key)) {
      ret.build[key] = pkg.spm[key];
    }
  });

  return ret;
}

function getGlobal(str) {
  if (typeof str !== 'string') return {};

  var ret = {};
  str.split(/\s*,\s*/).forEach(function(item) {
    var m = item.split(':');
    ret[m[0]] = m[1];
  });
  return ret;
}