const promisify = require('util').promisify;

module.exports = function(config) {
  const redis_lib =
    config.env === 'development' && config.redis_host === 'localhost'
      ? 'redis-mock'
      : 'redis';

  //eslint-disable-next-line security/detect-non-literal-require
  const redis = require(redis_lib);

  var client_config = {
    host: config.redis_host,
    port: config.redis_port,
    retry_strategy: options => {
      if (options.total_retry_time > config.redis_retry_time) {
        client.emit('error', 'Retry time exhausted');
        return new Error('Retry time exhausted');
      }

      return config.redis_retry_delay;
    }
  };
  if (config.redis_user != null && config.redis_user.length > 0)
    client_config.user = config.redis_user;
  if (config.redis_password != null && config.redis_password.length > 0)
    client_config.password = config.redis_password;
  if (config.redis_db != null && config.redis_db.length > 0)
    client_config.db = config.redis_db;
  const client = redis.createClient(client_config);

  client.ttlAsync = promisify(client.ttl);
  client.hgetallAsync = promisify(client.hgetall);
  client.hgetAsync = promisify(client.hget);
  client.pingAsync = promisify(client.ping);
  return client;
};