'use strict';
/**
 * This plugin integrate with Eureka and gets the target
 * endpoint dynamically. 
 */

var debug = require('debug')('plugin:eurekeclient');
var util = require('util');
var os = require('os');

const port = 8000;
const Eureka = require('eureka-js-client').Eureka;

module.exports.init = function (config, logger, stats) {

  const lookup = config.servicemap;
  
  config.instance.hostName = os.hostname();
  debug('local hostName: ' + config.instance.hostName);
  config.instance.ipAddr = getIPAddr();
  config.instance.port = {};
  config.instance.port["$"] = port;
  config.instance.port["@enabled"] = true;
  config.instance.dataCenterInfo["@class"] = "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo";

  const client = new Eureka(config);

  try {
    client.start();  
  } catch (err) {
    console.error(err);
    client.stop();
  }

  function getIPAddr() {
    var interfaces = os.networkInterfaces();
    var addresses = [];
    for (var k in interfaces) {
        for (var k2 in interfaces[k]) {
            var address = interfaces[k][k2];
            if (address.family === 'IPv4' && !address.internal) {
                addresses.push(address.address);
            }
        }
    }
    debug ('localhost ip: ' + addresses[0]);
    return addresses[0];  
  }

  function getAppName(url) {
    for (var index in lookup) {
      if (url.includes(lookup[index].uri) || url == lookup[index].uri) {
        return {
                  app: lookup[index].app,
                  secure: lookup[index].secure
               };
      }
    }
    return "";
  }

  function getTarget(app, secure) {
    var instances = client.getInstancesByAppId(app);

    for (var index in instances) {
      if (instances[index].status == "UP") {
        return (secure == true) ? {"hostName": instances[index].hostName, "port": instances[index].securePort["$"]} : {"hostName": instances[index].hostName, "port":instances[index].port["$"]};
      }
    }
    return "";
  }

  return {
    onrequest: function(req, res, next) {
      var appInfo = getAppName(req.url);
      var endpoint = getTarget(appInfo.app, appInfo.secure);

      if (endpoint.hostName) {
        debug("target hostname: " + endpoint.hostName);
        req.targetHostname = endpoint.hostName;
        debug("target port: " + endpoint.port);
        req.targetPort = endpoint.port;
        req.targetPath = req.url;
        if (appInfo.secure) {
          req.targetSecure = true;
        } else {
          req.targetSecure = false;
        }        
      } else {
        console.warn("Target enpoint from Eureka not found");
      }
      next();
    }   
  };
}
