
var
	window = require('window'),
	_ = require('_'),
	ko = require('ko'),

	Enums = require('Common/Enums'),
	Links = require('Common/Links'),

	AccountStore = require('Stores/User/Account'),
	IdentityStore = require('Stores/User/Identity'),

	Settings = require('Storage/Settings'),
	Remote = require('Remote/User/Ajax');

/**
 * @constructor
 */
function AccountsUserSettings()
{
	this.allowAdditionalAccount = Settings.capa(Enums.Capa.AdditionalAccounts);
	this.allowIdentities = Settings.capa(Enums.Capa.Identities);

	this.accounts = AccountStore.accounts;
	this.identities = IdentityStore.identities;

	this.accountForDeletion = ko.observable(null).deleteAccessHelper();
	this.identityForDeletion = ko.observable(null).deleteAccessHelper();
}

AccountsUserSettings.prototype.scrollableOptions = function(sWrapper)
{
	return {
		handle: '.drag-handle',
		containment: sWrapper || 'parent',
		axis: 'y'
	};
};

AccountsUserSettings.prototype.addNewAccount = function()
{
	require('Knoin/Knoin').showScreenPopup(require('View/Popup/Account'));
};

AccountsUserSettings.prototype.editAccount = function(oAccountItem)
{
	if (oAccountItem && oAccountItem.canBeEdit())
	{
		require('Knoin/Knoin').showScreenPopup(require('View/Popup/Account'), [oAccountItem]);
	}
};

AccountsUserSettings.prototype.addNewIdentity = function()
{
	require('Knoin/Knoin').showScreenPopup(require('View/Popup/Identity'));
};

AccountsUserSettings.prototype.editIdentity = function(oIdentity)
{
	require('Knoin/Knoin').showScreenPopup(require('View/Popup/Identity'), [oIdentity]);
};

/**
 * @param {AccountModel} oAccountToRemove
 */
AccountsUserSettings.prototype.deleteAccount = function(oAccountToRemove)
{
	if (oAccountToRemove && oAccountToRemove.deleteAccess())
	{
		this.accountForDeletion(null);

		var
			kn = require('Knoin/Knoin'),
			fRemoveAccount = function(oAccount) {
				return oAccountToRemove === oAccount;
			};

		if (oAccountToRemove)
		{
			this.accounts.remove(fRemoveAccount);

			Remote.accountDelete(function(sResult, oData) {

				if (Enums.StorageResultType.Success === sResult && oData &&
					oData.Result && oData.Reload)
				{
					kn.routeOff();
					kn.setHash(Links.root(), true);
					kn.routeOff();

					_.defer(function() {
						window.location.reload();
					});
				}
				else
				{
					require('App/User').default.accountsAndIdentities();
				}

			}, oAccountToRemove.email);
		}
	}
};

/**
 * @param {IdentityModel} oIdentityToRemove
 */
AccountsUserSettings.prototype.deleteIdentity = function(oIdentityToRemove)
{
	if (oIdentityToRemove && oIdentityToRemove.deleteAccess())
	{
		this.identityForDeletion(null);

		if (oIdentityToRemove)
		{
			IdentityStore.identities.remove(function(oIdentity) {
				return oIdentityToRemove === oIdentity;
			});

			Remote.identityDelete(function() {
				require('App/User').default.accountsAndIdentities();
			}, oIdentityToRemove.id);
		}
	}
};

AccountsUserSettings.prototype.accountsAndIdentitiesAfterMove = function()
{
	Remote.accountsAndIdentitiesSortOrder(null,
		AccountStore.accountsEmails.peek(), IdentityStore.identitiesIDS.peek());
};

AccountsUserSettings.prototype.onBuild = function(oDom)
{
	var self = this;

	oDom
		.on('click', '.accounts-list .account-item .e-action', function() {
			var oAccountItem = ko.dataFor(this);
			if (oAccountItem)
			{
				self.editAccount(oAccountItem);
			}
		})
		.on('click', '.identities-list .identity-item .e-action', function() {
			var oIdentityItem = ko.dataFor(this);
			if (oIdentityItem)
			{
				self.editIdentity(oIdentityItem);
			}
		});
};

export {AccountsUserSettings, AccountsUserSettings as default};
