import { ajax } from 'discourse/lib/ajax';
const ApiKey = Discourse.Model.extend({

  /**
    Regenerates the api key

    @method regenerate
    @returns {Promise} a promise that resolves to the key
  **/
  regenerate: function() {
    var self = this;
    return ajax('/admin/api/key', {type: 'PUT', data: {id: this.get('id')}}).then(function (result) {
      self.set('key', result.api_key.key);
      return self;
    });
  },

  /**
    Revokes the current key

    @method revoke
    @returns {Promise} a promise that resolves when the key has been revoked
  **/
  revoke: function() {
    return ajax('/admin/api/key', {type: 'DELETE', data: {id: this.get('id')}});
  }

});

ApiKey.reopenClass({

  /**
    Creates an API key instance with internal user object

    @method create
    @param {...} var_args the properties to initialize this with
    @returns {ApiKey} the ApiKey instance
  **/
  create: function() {
    const AdminUser = require('admin/models/admin-user').default;
    var result = this._super.apply(this, arguments);
    if (result.user) {
      result.user = AdminUser.create(result.user);
    }
    return result;
  },

  /**
    Finds a list of API keys

    @method find
    @returns {Promise} a promise that resolves to the array of `ApiKey` instances
  **/
  find: function() {
    return ajax("/admin/api/keys").then(function(keys) {
      return keys.map(function (key) {
        return ApiKey.create(key);
      });
    });
  },

  /**
    Generates a master api key and returns it.

    @method generateMasterKey
    @returns {Promise} a promise that resolves to a master `ApiKey`
  **/
  generateMasterKey: function() {
    return ajax("/admin/api/key", {type: 'POST'}).then(function (result) {
      return ApiKey.create(result.api_key);
    });
  }

});

export default ApiKey;
