(function() {

function errorHandler(error, callback) {
  if (error) {
    callback && callback(error);
    throw error;
  }
}

function pageview(_AV, options) {
  var AV = _AV;
  var appId, appKey, appClass;
  appId = options.appId;
  appKey = options.appKey;
  appClass = options.appClass;
  AV.init({
    serverURLs: 'https://avoscloud.com',
    appId: appId,
    appKey: appKey
  });
  return {
    get: get,
    increase: increase
  };

  function searchKey(key) {
    var query = new AV.Query(appClass);
    query.equalTo('key', key);
    return query.first();
  }

  function insert(key, title) {
    var Blog = AV.Object.extend(appClass);
    var blog = new Blog();
    blog.set('title', title);
    blog.set('key', key);
    blog.set('views', 0);
    return blog.save();
  }

  function increment(result) {
    result.increment('views', 1);
    return result.save(null, {
      fetchWhenSave: true
    });
  }

  function get(key, callback) {
    searchKey(key).then(function(result) {
      if (result) {
        callback && callback(result.attributes.views);
      }
    }, errorHandler);
  }

  function increase(key, title, callback) {
    searchKey(key).then(function(result) {
      if (result) {
        increment(result).then(function(result) {
          callback && callback(result.attributes.views);
        });
      } else {
        insert(key, title).then(function(result) {
          increment(result).then(function(result) {
            callback && callback(result.attributes.views);
          });
        }, errorHandler);
      }
    }, errorHandler);
  }
}
window.pageview = pageview;

})();