module.exports = function init(storage, ToughCookie, WebStorageCookieStore) {
  var storeKey = '__advancedHttpCookieStore__';

  var store = new WebStorageCookieStore(storage, storeKey);
  var cookieJar = new ToughCookie.CookieJar(store);

  return {
    setCookieFromString: setCookieFromString,
    setCookie: setCookie,
    getCookieString: getCookieString,
    clearCookies: clearCookies,
    removeCookies: removeCookies
  };

  function splitCookieString(cookieStr) {
    var cookieParts = cookieStr.split(',');
    var splitCookies = [];
    var processedCookie = null;

    for (var i = 0; i < cookieParts.length; ++i) {
      if (cookieParts[i].substr(-11, 8).toLowerCase() === 'expires=') {
        processedCookie = cookieParts[i] + ',' + cookieParts[i + 1];
        i++;
      } else {
        processedCookie = cookieParts[i];
      }

      processedCookie = processedCookie.trim();
      splitCookies.push(processedCookie);
    }

    return splitCookies;
  }

  function setCookieFromString(url, cookieStr) {
    if (!cookieStr) return;

    var cookies = splitCookieString(cookieStr);

    for (var i = 0; i < cookies.length; ++i) {
      cookieJar.setCookieSync(cookies[i], url, { ignoreError: true });
    }
  }

  function setCookie(url, cookie, options) {
    options = options || {};
    options.ignoreError = false;
    cookieJar.setCookieSync(cookie, url, options);
  }

  function getCookieString(url) {
    return cookieJar.getCookieStringSync(url);
  }

  function clearCookies() {
    window.localStorage.removeItem(storeKey);
  }

  function removeCookies(url, cb) {
    cookieJar.getCookies(url, function (error, cookies) {
      if (!cookies || cookies.length === 0) {
        return cb(null, []);
      }

      var domain = cookies[0].domain;

      cookieJar.store.removeCookies(domain, null, cb);
    });
  }
};