/**
  This controller supports actions related to flagging

  @class FlagController
  @extends Discourse.ObjectController
  @namespace Discourse
  @uses Discourse.ModalFunctionality
  @module Discourse
**/
Discourse.FlagController = Discourse.ObjectController.extend(Discourse.ModalFunctionality, {

  onShow: function() {
    this.set('selected', null);
  },

  changePostActionType: function(action) {
    this.set('selected', action);
  },

  submitEnabled: function() {
    var selected = this.get('selected');
    if (!selected) return false;

    if (selected.get('is_custom_flag')) {
      var len = this.get('message.length') || 0;
      return len >= Discourse.SiteSettings.min_private_message_post_length &&
             len <= Discourse.PostActionType.MAX_MESSAGE_LENGTH;
    }
    return true;
  }.property('selected.is_custom_flag', 'message.length'),

  submitDisabled: Em.computed.not('submitEnabled'),

  // Staff accounts can "take action"
  canTakeAction: function() {
    // We can only take actions on non-custom flags
    if (this.get('selected.is_custom_flag')) return false;
    return Discourse.User.current('staff');
  }.property('selected.is_custom_flag'),

  submitText: function(){
    if (this.get('selected.is_custom_flag')) {
      return I18n.t("flagging.notify_action");
    } else {
      return I18n.t("flagging.action");
    }
  }.property('selected.is_custom_flag'),

  takeAction: function() {
    this.createFlag({takeAction: true});
    this.set('hidden', true);
  },

  createFlag: function(opts) {
    var flagController = this;
    var postAction = this.get('actionByName.' + this.get('selected.name_key'));
    var params = this.get('selected.is_custom_flag') ? {message: this.get('message')} : {};

    if (opts) params = $.extend(params, opts);

    postAction.act(params).then(function() {
      flagController.send('closeModal');
    }, function(errors) {
      flagController.displayErrors(errors);
    });
  },

  canDeleteSpammer: function() {
    if (Discourse.User.current('staff') && this.get('selected.name_key') === 'spam') {
      return this.get('userDetails.can_be_deleted') && this.get('userDetails.can_delete_all_posts');
    } else {
      return false;
    }
  }.property('selected.name_key', 'userDetails.can_be_deleted', 'userDetails.can_delete_all_posts'),

  deleteSpammer: function() {
    this.send('closeModal');
    this.get('userDetails').deleteAsSpammer(function() { window.location.reload(); });
  },

  usernameChanged: function() {
    this.set('userDetails', null);
    this.fetchUserDetails();
  }.observes('username'),

  fetchUserDetails: function() {
    if( Discourse.User.current('staff') && this.get('username') ) {
      var flagController = this;
      Discourse.AdminUser.find(this.get('username')).then(function(user){
        flagController.set('userDetails', user);
      });
    }
  }

});
