'use strict';

var jsTokens = require('js-tokens').default;

var processEnvRe = /bprocess.env.[$w]+b/; var spaceOrCommentRe = /^(?:s|/)/;

function replace(src, envs) {

if (!processEnvRe.test(src)) {
  return src;
}

var out = [];
var purge = envs.some(function(env) {
  return env._ && env._.indexOf('purge') !== -1;
});

jsTokens.lastIndex = 0
var parts = src.match(jsTokens);

for (var i = 0; i < parts.length; i++) {
  if (parts[i    ] === 'process' &&
      parts[i + 1] === '.' &&
      parts[i + 2] === 'env' &&
      parts[i + 3] === '.') {
    var prevCodeToken = getAdjacentCodeToken(-1, parts, i);
    var nextCodeToken = getAdjacentCodeToken(1, parts, i + 4);
    var replacement = getReplacementString(envs, parts[i + 4], purge);
    if (prevCodeToken !== '.' &&
        nextCodeToken !== '.' &&
        nextCodeToken !== '=' &&
        typeof replacement === 'string') {
      out.push(replacement);
      i += 4;
      continue;
    }
  }
  out.push(parts[i]);
}

return out.join('');

}

function getAdjacentCodeToken(dir, parts, i) {

while (true) {
  var part = parts[i += dir];
  if (!spaceOrCommentRe.test(part)) {
    return part;
  }
}

}

function getReplacementString(envs, name, purge) {

for (var j = 0; j < envs.length; j++) {
  var env = envs[j];
  if (typeof env[name] !== 'undefined') {
    return JSON.stringify(env[name]);
  }
}
if (purge) {
  return 'undefined';
}

}

module.exports = replace;