Show:
var util = require('util');

/**
 * Provides methods for interacting with Projects in the Sentry API.
 *
 * @class Projects
 * @constructor
 * @param {Client} client
 */
var Projects = function(client) {
  this.client = client;
}

/**
 * Retrieve a project.
 *
 * @method get
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.get = function(orgSlug, projectSlug, callback) {
  var path = util.format('projects/%s/%s/', orgSlug, projectSlug);
  return this.client.get(path, callback);
}

/**
 * Delete a project.
 *
 * @method delete
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.delete = function(orgSlug, projectSlug, callback) {
  var path = util.format('projects/%s/%s/', orgSlug, projectSlug);
  return this.client.delete(path, callback);
}

/**
 * Update a project.
 *
 * @method update
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {Object}   body
 * @param  {String}   body.name The new name for the project.
 * @param  {String}   body.slug The new slug for the project.
 * @param  {Object}   body.options  Optional options to override in the project settings.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.update = function(orgSlug, projectSlug, body, callback) {
  var path = util.format('projects/%s/%s/', orgSlug, projectSlug);
  return this.client.put(path, body, callback);
}

/**
 * Retrieve event counts for a project.
 *
 * @method stats
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.stats = function(orgSlug, projectSlug, callback) {
  var path = util.format('projects/%s/%s/stats/', orgSlug, projectSlug);
  return this.client.get(path, callback);
}

/**
 * List a project's client keys.
 *
 * @method keys
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.keys = function(orgSlug, projectSlug, callback) {
  var path = util.format('projects/%s/%s/keys/', orgSlug, projectSlug);
  return this.client.get(path, callback);
}

/**
 * Create a new client key.
 *
 * @method createKey
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {Object}   body
 * @param  {String}   body.name   The name for the new key.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.createKey = function(orgSlug, projectSlug, body, callback) {
  var path = util.format('projects/%s/%s/keys/', orgSlug, projectSlug);
  return this.client.post(path, body, callback);
}

/**
 * Delete a client key.
 *
 * @method deleteKey
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {String}   keyId       The ID of the key to delete.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.deleteKey = function(orgSlug, projectSlug, keyId, callback) {
  var path = util.format('projects/%s/%s/keys/%s/', orgSlug, projectSlug, keyId);
  return this.client.delete(path, callback);
}

/**
 * Update a client key.
 *
 * @method updateKey
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {[type]}   key         [description]
 * @param  {Object}   body
 * @param  {String}   body.name   The new name for the key.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.updateKey = function(orgSlug, projectSlug, key, body, callback) {
  var path = util.format('projects/%s/%s/keys/%s/', orgSlug, projectSlug, key);
  return this.client.put(path, body, callback);
}

/**
 * List a project's users.
 *
 * @method users
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.users = function(orgSlug, projectSlug, callback) {
  var path = util.format('projects/%s/%s/users/', orgSlug, projectSlug);
  return this.client.get(path, callback);
}

/**
 * List a tag's values.
 *
 * @method tag
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {String}   key         The tag to lookup.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.tag = function(orgSlug, projectSlug, key, callback) {
  var path = util.format('projects/%s/%s/tags/%s/values/', orgSlug, projectSlug, key);
  return this.client.get(path, callback);
}

/**
 * List a project's releases.
 *
 * @method releases
 * @param  {String}   orgSlug     Organization slug.
 * @param  {String}   projectSlug Project slug.
 * @param  {Function} callback
 * @return {Promise}
 */
Projects.prototype.releases = function(orgSlug, projectSlug, callback) {
  var path = util.format('projects/%s/%s/releases/', orgSlug, projectSlug);
  return this.client.get(path, callback);
}

module.exports = Projects;