exports.safeRequire = safeRequire;
exports.fieldsToArray = fieldsToArray;
exports.selectFields = selectFields;

function safeRequire(module) {
    try {
        return require(module);
    } catch (e) {
        console.log('Run "npm install loopback-data ' + module + '" command to use loopback-data using ' + module + ' database engine');
        process.exit(1);
    }
}

function fieldsToArray(fields, properties) {
    if(!fields) return;
  
    // include all properties by default
    var result = properties;
  
    if(typeof fields === 'string') {
      return [fields];
    }
  
    if (Array.isArray(fields) && fields.length > 0) {
        // No empty array, including all the fields
        return fields;
    }
  
    if ('object' === typeof fields) {
        // { field1: boolean, field2: boolean ... }
        var included = [];
        var excluded = [];
        var keys = Object.keys(fields);
        if(!keys.length) return;
        
        keys.forEach(function (k) {
            if (fields[k]) {
                included.push(k);
            } else if ((k in fields) && !fields[k]) {
                excluded.push(k);
            }
        });
        if (included.length > 0) {
            result = included;
        } else if (excluded.length > 0) {
            excluded.forEach(function (e) {
                var index = result.indexOf(e);
                result.splice(index, 1);
            });
        }
    }
    
    return result;
}

function selectFields(fields) {
  // map function
  return function (obj) {
    var result = {};
    var key;
    
    for (var i = 0; i < fields.length; i++) {
      key = fields[i];
      
      result[key] = obj[key];
    }
    return result;
  }
}