cluster = require("cluster")
winston = require("winston")
util = require("util")
_ = require("underscore")
nl = require("nodeload")

logger = new (winston.Logger)({
    transports: [
      new (winston.transports.Console)({'timestamp':true})
    ]
})

logger.info "PrWrkr##{cluster.worker.id}: online, waiting for input"

# holds timeout
reporter = {}

# cluster id - holds id of master
clusterId = ""


# handle message, specifically "targeting"
cluster.worker.on(
  "message"
  (msg) -> 
    switch msg.subject
      when "targeting"
        logger.info "PrWorker##{cluster.worker.id}: targeting received (http://#{msg.server}:#{msg.port} w #{msg.user}:#{msg.password}), hitting #{msg.targeting.length} targets"

        clusterId = msg.clusterId
        # start hitting targets
        #hit(msg.server, msg.port, msg.user, msg.password, msg.targeting)

        nl.run(
          numClients: 10
          targetRps: 100
          timeLimit: 10
          requestGenerator: (client) ->
            # select a target, targets most used functions
            r = Math.random()*100
            target = _.find(msg.targeting, ((t) -> r < t.acc_percentage))

            request = client.request(
              "GET"
              "/#{target.path}"
              {
                method: "GET"
                host: msg.server
                port: msg.port
                headers: target.headers
                auth: "#{msg.user}:#{msg.password}"
              }
              (res) -> 
                console.log "---> hit"
                target.headers =
                  "If-None-Match" : res.headers["etag"] || target?.headers?["If-None-Match"]

            )
            request.end()
        )        


        # report back to master
        #reporter = report(msg.reportinterval || 10000)
)


# report is an array containing all results which have not yet been shipped to master

# handle disconnect
cluster.worker.on(
  "disconnect",
  ->
    # cancel existing report
    clearTimeout(reporter)
    # report remaining
    report(0)
    logger.info "report, disconnect"
    process.exit(0)
)





