var fs = require('fs')
  , http = require('http')
  , path = require('path')
  , https = require('https')
  , events = require('events')
  , stream = require('stream')
  , assert = require('assert')
  ;

exports.createServer =  function (port) {
  port = port || 6767
  var s = http.createServer(function (req, resp) {
    s.emit(req.url, req, resp);
  })
  s.port = port
  s.url = 'http://localhost:'+port
  return s;
}

exports.createSSLServer = function(port, opts) {
  port = port || 16767

  var options = { 'key' : path.join(__dirname, 'ssl', 'test.key')
                , 'cert': path.join(__dirname, 'ssl', 'test.crt')
                }
  if (opts) {
    for (var i in opts) options[i] = opts[i]
  }

  for (var i in options) {
    options[i] = fs.readFileSync(options[i])
  }

  var s = https.createServer(options, function (req, resp) {
    s.emit(req.url, req, resp);
  })
  s.port = port
  s.url = 'https://localhost:'+port
  return s;
}

exports.createPostStream = function (text) {
  var postStream = new stream.Stream();
  postStream.writeable = true;
  postStream.readable = true;
  setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0);
  return postStream;
}
exports.createPostValidator = function (text) {
  var l = function (req, resp) {
    var r = '';
    req.on('data', function (chunk) {r += chunk})
    req.on('end', function () {
    if (r !== text) console.log(r, text);
    assert.equal(r, text)
    resp.writeHead(200, {'content-type':'text/plain'})
    resp.write('OK')
    resp.end()
    })
  }
  return l;
}
exports.createGetResponse = function (text, contentType) {
  var l = function (req, resp) {
    contentType = contentType || 'text/plain'
    resp.writeHead(200, {'content-type':contentType})
    resp.write(text)
    resp.end()
  }
  return l;
}
exports.createChunkResponse = function (chunks, contentType) {
  var l = function (req, resp) {
    contentType = contentType || 'text/plain'
    resp.writeHead(200, {'content-type':contentType})
    chunks.forEach(function (chunk) {
      resp.write(chunk)
    })
    resp.end()
  }
  return l;
}
