'use strict';

var zlibpool = exports;
var zlib = require('zlib');

var transport = require('../../../spdy-transport');

// TODO(indutny): think about it, why has it always been Z_SYNC_FLUSH here.
// It should be possible to manually flush stuff after the write instead
function createDeflate(version, compression) {
  var deflate = zlib.createDeflate({
    dictionary: transport.protocol.spdy.dictionary[version],
    flush: zlib.Z_SYNC_FLUSH,
    windowBits: 11,
    level: compression ? zlib.Z_DEFAULT_COMPRESSION : zlib.Z_NO_COMPRESSION
  });

  // For node.js v0.8
  deflate._flush = zlib.Z_SYNC_FLUSH;

  return deflate;
}

function createInflate(version) {
  var inflate = zlib.createInflate({
    dictionary: transport.protocol.spdy.dictionary[version],
    flush: zlib.Z_SYNC_FLUSH,
    windowBits: 0
  });

  // For node.js v0.8
  inflate._flush = zlib.Z_SYNC_FLUSH;

  return inflate;
}

function Pool(compression) {
  this.compression = compression;
  this.pool = {
    2: [],
    3: [],
    3.1: []
  };
}

zlibpool.create = function create(compression) {
  return new Pool(compression);
};

Pool.prototype.get = function get(version) {
  if (this.pool[version].length > 0) {
    return this.pool[version].pop();
  } else {
    var id = version;

    return {
      version: version,
      compress: createDeflate(id, this.compression),
      decompress: createInflate(id)
    };
  }
};

Pool.prototype.put = function put(pair) {
  this.pool[pair.version].push(pair);
};
