/**
 * Service which provides helper methods for performing some simple UI operations.
 */
angular.module('quay').factory('UIService', [function() {
  var CheckStateController = function(items, opt_checked) {
    this.items = items;
    this.checked = opt_checked || [];
    this.listeners_ = [];
  };

  CheckStateController.prototype.listen = function(callback) {
    this.listeners_.push(callback);
  };

  CheckStateController.prototype.isChecked = function(item) {
    return $.inArray(item, this.checked) >= 0;
  };

  CheckStateController.prototype.toggleItem = function(item) {
    if (this.isChecked(item)) {
      this.uncheckItem(item);
    } else {
      this.checkItem(item);
    }
  };

  CheckStateController.prototype.toggleItems = function() {
    if (this.checked.length) {
      this.checked = [];
    } else {
      this.checked = this.items.slice();
    }
    this.callListeners_();
  };

  CheckStateController.prototype.checkByFilter = function(filter) {
    this.checked = $.grep(this.items, filter);
    this.callListeners_();
  };

  CheckStateController.prototype.checkItem = function(item) {
    this.checked.push(item);
    this.callListeners_();
  };

  CheckStateController.prototype.uncheckItem = function(item) {
    this.checked = $.grep(this.checked, function(cItem) {
      return cItem != item;
    });
    this.callListeners_();
  };

  CheckStateController.prototype.callListeners_ = function() {
    var checked = this.checked;
    this.listeners_.map(function(listener) {
      listener(checked);
    });
  };

  var uiService = {};

  uiService.hidePopover = function(elem) {
    var popover = $(elem).data('bs.popover');
    if (popover) {
      popover.hide();
    }
  };

  uiService.showPopover = function(elem, content, opt_placement) {
    var popover = $(elem).data('bs.popover');
    if (!popover) {
      $(elem).popover({'content': '-', 'placement': opt_placement || 'left'});
    }

    setTimeout(function() {
      var popover = $(elem).data('bs.popover');
      popover.options.content = content;
      popover.show();
    }, 500);
  };

  uiService.showFormError = function(elem, result, opt_placement) {
    var message =  result.data['message'] || result.data['error_description'] || '';
    if (message) {
      uiService.showPopover(elem, message, opt_placement);
    } else {
      uiService.hidePopover(elem);
    }
  };

  uiService.createCheckStateController = function(items, opt_checked) {
    return new CheckStateController(items, opt_checked);
  };

  uiService.showPasswordDialog = function(message, callback, opt_canceledCallback) {
    var success = function() {
      var password = $('#passDialogBox').val();
      $('#passDialogBox').val('');
      callback(password);
    };

    var canceled = function() {
      $('#passDialogBox').val('');
      opt_canceledCallback && opt_canceledCallback();
    };

    var box = bootbox.dialog({
      "message": message +
        '<form style="margin-top: 10px" action="javascript:void(0)">' +
        '<input id="passDialogBox" class="form-control" type="password" placeholder="Current Password">' +
        '</form>',
      "title": 'Please Verify',
      "buttons": {
        "verify": {
          "label": "Verify",
          "className": "btn-success",
          "callback": success
        },
        "close": {
          "label": "Cancel",
          "className": "btn-default",
          "callback": canceled
        }
      }
    });

    box.bind('shown.bs.modal', function(){
      box.find("input").focus();
      box.find("form").submit(function() {
        if (!$('#passDialogBox').val()) { return; }
        box.modal('hide');
        success();
      });
    });
  };

  return uiService;
}]);