var util = require('utils-extend'); /**

* @description
* @example
* `**\/*` match all files
* `*.js`  only match current dir files
* '**\/*.js' match all js files
* 'path/*.js' match js files in path
* '!*.js' exclude js files 
*/

function fileMatch(filter, ignore) {

if (filter === null) {
  return function() {
    return true;
  };
} else if (filter === '' || (util.isArray(filter) && !filter.length)) {
  return function() {
    return false;
  };
}

if (util.isString(filter)) {
  filter = [filter];
}

var match = [];
var negate = [];
var isIgnore = ignore ? 'i' : '';

filter.forEach(function(item) {
  var isNegate = item.indexOf('!') === 0;
  item = item
    .replace(/^!/, '')
    .replace(/\*(?![\/*])/, '[^/]*?')
    .replace('**\/', '([^/]+\/)*')
    .replace(/\{([^\}]+)\}/g, function($1, $2) {
      var collection = $2.split(',');
      var length = collection.length;
      var result = '(?:';

      collection.forEach(function(item, index) {
        result += '(' + item.trim() + ')';

        if (index + 1 !== length) {
          result += '|';
        }
      });

      result += ')';

      return result;
    })
    .replace(/([\/\.])/g, '\\$1');

  item = '(^' + item + '$)';

  if (isNegate) {
    negate.push(item);
  } else {
    match.push(item);
  }
});

match = match.length ?  new RegExp(match.join('|'), isIgnore) : null;
negate = negate.length ? new RegExp(negate.join('|'), isIgnore) : null;

return function(filepath) {
  // Normalize \\ paths to / paths.
  filepath = util.path.unixifyPath(filepath);

  if (negate && negate.test(filepath)) {
    return false;
  }

  if (match && match.test(filepath)) {
    return true;
  }

  return false;
};

}

module.exports = fileMatch;