'use strict';

const common = require('../common.js');
const { ClientRequest } = require('http');
const assert = require('assert');

const types = Object.keys(common.urls)
  .filter((i) => common.urls[i]
  .startsWith('http://'));
const bench = common.createBenchmark(main, {
  // Use 'url' to avoid name clash with other http benchmark
  url: types.concat(['wpt']),
  arg: ['URL', 'string', 'options'],
  e: [1]
});

function noop() {}

function main({ url: type, arg, e }) {
  e = Number(e);
  const data = common.bakeUrlData(type, e, false, false)
    .filter((i) => i.startsWith('http://'));
  const len = data.length;
  let result;
  switch (arg) {
    case 'options': {
      const options = data.map((i) => ({
        path: new URL(i).path, createConnection: noop
      }));
      bench.start();
      for (let i = 0; i < len; i++) {
        result = new ClientRequest(options[i]);
      }
      bench.end(len);
      break;
    }
    case 'URL': {
      const options = data.map((i) => new URL(i));
      bench.start();
      for (let i = 0; i < len; i++) {
        result = new ClientRequest(options[i], { createConnection: noop });
      }
      bench.end(len);
      break;
    }
    case 'string': {
      bench.start();
      for (let i = 0; i < len; i++) {
        result = new ClientRequest(data[i], { createConnection: noop });
      }
      bench.end(len);
      break;
    }
    default: {
      throw new Error(`Unknown arg type ${arg}`);
    }
  }
  assert.ok(result);
}
