const EventEmitter = require("events");
const OriginalHttpAgent = require("agentkeepalive");
const OriginalHttpsAgent = OriginalHttpAgent.HttpsAgent;
const Poller = require("./poller");

function extendAgent(OriginalAgent) {
  class DnsAgent extends OriginalAgent {
    getName(options) {
      const name = super.getName(options);
      const key = options.lookup && options.lookup.key;
      return key ? `${key}:${name}` : name;
    }
  }
  return DnsAgent;
}

class DnsPolling extends EventEmitter {
  constructor(options) {
    super();
    this.pollers = new Map();
    this.options = options;
  }

  getLookup(hostname) {
    let poller = this.pollers.get(hostname);
    if (!poller) {
      poller = new Poller(hostname, this.options).start();
      this.forwardEvents(poller);
      this.pollers.set(hostname, poller);
    }
    return poller.getLookup();
  }

  forwardEvents(poller) {
    const events = ["resolve:success", "resolve:error"];
    for (const event of events) {
      const forward = payload => this.emit(event, payload);
      poller.on(event, forward);
    }
  }

  stop() {
    for (const poller of this.pollers.values()) {
      poller.stop();
    }
  }
}

const HttpAgent = extendAgent(OriginalHttpAgent);
const HttpsAgent = extendAgent(OriginalHttpsAgent);

module.exports = {
  Poller,
  DnsPolling,
  HttpAgent,
  HttpsAgent
};