var EnumFactory = function () {
  if (arguments.length > 0) {
    var Enum = function Enum(arg) {
      if (typeof arg === 'number' && arg % 1 == 0) {
        return Enum._values[arg];
      } else if (Enum[arg]) {
        return Enum[arg]
      } else if (Enum._values.indexOf(arg) !== -1) {
        return arg;
      } else if (arg === null) {
        return null;
      } else {
        return '';
      }
    };
    var dxList = [];
    dxList.push(''); // Want empty value to be at index 0 to match MySQL Enum values and MySQL non-strict behavior.
    for (var arg in arguments) {
      arg = String(arguments[arg]);
      Object.defineProperty(Enum, arg.toUpperCase(), {configurable: false, enumerable: true, value: arg, writable: false});
      dxList.push(arg);
    }
    Object.defineProperty(Enum, '_values', {configurable: false, enumerable: false, value: dxList, writable: false});
    Object.defineProperty(Enum, '_string', {configurable: false, enumerable: false, value: stringified(Enum), writable: false});
    Object.freeze(Enum);
    return Enum;
  } else {
    throw "No arguments - could not create Enum.";
  }
};

function stringified(anEnum) {
  var s = [];
  for (var i in anEnum._values) {
    if (anEnum._values[i] != '') {
      s.push("'" + anEnum._values[i] + "'");
    }
  }
  return s.join(',');
}

exports.EnumFactory = EnumFactory;