module.exports = function HSLToHex(data) {
  // HSL to RGB converter. Both methods adapted from:
  // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
  var hslToRgb = function(h, s, l) {
    var r, g, b;

    // normalize hue orientation b/w 0 and 360 degrees
    h = h % 360;
    if (h < 0)
      h += 360;
    h = ~~h / 360;

    if (s < 0)
      s = 0;
    else if (s > 100)
      s = 100;
    s = ~~s / 100;

    if (l < 0)
      l = 0;
    else if (l > 100)
      l = 100;
    l = ~~l / 100;

    if (s === 0) {
      r = g = b = l; // achromatic
    } else {
      var q = l < 0.5 ?
        l * (1 + s) :
        l + s - l * s;
      var p = 2 * l - q;
      r = hueToRgb(p, q, h + 1/3);
      g = hueToRgb(p, q, h);
      b = hueToRgb(p, q, h - 1/3);
    }

    return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
  };

  var hueToRgb = function(p, q, t) {
    if (t < 0) t += 1;
    if (t > 1) t -= 1;
    if (t < 1/6) return p + (q - p) * 6 * t;
    if (t < 1/2) return q;
    if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
    return p;
  };

  return {
    process: function() {
      return data.replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/g, function(match, hue, saturation, lightness) {
        var asRgb = hslToRgb(hue, saturation, lightness);
        var redAsHex = asRgb[0].toString(16);
        var greenAsHex = asRgb[1].toString(16);
        var blueAsHex = asRgb[2].toString(16);

        return '#' +
          ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
          ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
          ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
      });
    }
  };
};
