/home/ivoiecob/email.hirewise-va.com/modules/ContactsWebclient/js/manager.js
'use strict';

module.exports = function (oAppData) {
	var
		_ = require('underscore'),
		
		TextUtils = require('%PathToCoreWebclientModule%/js/utils/Text.js'),
		
		App = require('%PathToCoreWebclientModule%/js/App.js'),
		ModulesManager = require('%PathToCoreWebclientModule%/js/ModulesManager.js'),
		Routing = require('%PathToCoreWebclientModule%/js/Routing.js'),
		
		ContactsCache = require('modules/%ModuleName%/js/Cache.js'),
		EnumsDeclarator = require('modules/%ModuleName%/js/enums.js'),
		Settings = require('modules/%ModuleName%/js/Settings.js'),
		Utils = require('modules/%ModuleName%/js/utils/Links.js'),
		
		SuggestionsAutocomplete = require('modules/%ModuleName%/js/SuggestionsAutocomplete.js'),
		SuggestionsMethods = {
			getSuggestionsAutocompleteCallback: function (suggestParameters) {
				var
					fSuggestionsAutocompleteCallback = function (oRequest, fResponse) {
						SuggestionsAutocomplete.callback(oRequest, fResponse, suggestParameters);
					},
					//TODO: Remove this wrapper after adding PGP-keys to team storage
					fSuggestionsAutocompleteFilteredCallback = ModulesManager.run(
						'OpenPgpWebclient',
						'getSuggestionsAutocompleteFilteredCallback',
						[fSuggestionsAutocompleteCallback]
					)
				;
				return fSuggestionsAutocompleteFilteredCallback ?
					fSuggestionsAutocompleteFilteredCallback
					:
					fSuggestionsAutocompleteCallback;
			},
			getSuggestionsAutocompleteDeleteHandler: function () {
				return SuggestionsAutocomplete.deleteHandler;
			},
			getContactsByEmails: function (aEmails, fCallBack) {
				ContactsCache.getContactsByEmails(aEmails, fCallBack);
			}
		},
				
		fRegisterMessagePaneControllerOnStart = function () {
			App.subscribeEvent('MailWebclient::RegisterMessagePaneController', function (fRegisterMessagePaneController) {
				fRegisterMessagePaneController(require('modules/%ModuleName%/js/views/VcardAttachmentView.js'), 'BeforeMessageBody');
			});
		},

		ContactsCardsMethods = {
			applyContactsCards: function ($Addresses) {
				var ContactCard = require('modules/%ModuleName%/js/ContactCard.js');
				ContactCard.applyTo($Addresses);
			}
		}
	;

	let contactsViewInstance = null;

	const getContactsViewInstance = () => {
		if(!contactsViewInstance) {
			const CContactsView = require('modules/%ModuleName%/js/views/CContactsView.js');
			contactsViewInstance = new CContactsView();
		}
		return contactsViewInstance;
	};

	EnumsDeclarator.init(oAppData, Settings.ServerModuleName);
	Settings.init(oAppData);

	if (!ModulesManager.isModuleAvailable(Settings.ServerModuleName))
	{
		return null;
	}

	if (App.isUserNormalOrTenant())
	{
		if (App.isMobile())
		{
			return _.extend({
				start: fRegisterMessagePaneControllerOnStart,
				getSettings: function () {
					return Settings;
				},
				getHeaderItemView: function () {
					return require('modules/%ModuleName%/js/views/HeaderItemView.js');
				}
			}, SuggestionsMethods);
		}
		else if (App.isNewTab())
		{
			return _.extend({
				start: fRegisterMessagePaneControllerOnStart
			}, SuggestionsMethods, ContactsCardsMethods);
		}
		else
		{
			require('modules/%ModuleName%/js/MainTabExtMethods.js');
			
			return _.extend({
				start: function (ModulesManager) {
					ModulesManager.run('SettingsWebclient', 'registerSettingsTab', [
						function () { return require('modules/%ModuleName%/js/views/ContactsSettingsFormView.js'); }, 
						Settings.HashModuleName, 
						TextUtils.i18n('%MODULENAME%/LABEL_SETTINGS_TAB')
					]);
					if (Settings.AllowAddressBooksManagement) {
						ModulesManager.run('SettingsWebclient', 'registerSettingsTab', [
							function () { return require('modules/%ModuleName%/js/views/AddressBooksSettingsFormView.js'); }, 
							'manage-addressbooks', 
							TextUtils.i18n('%MODULENAME%/LABEL_MANAGE_ADDRESSBOOK_SETTINGS_TAB')
						]);
					}
					fRegisterMessagePaneControllerOnStart();

					App.broadcastEvent('RegisterNewItemElement', {
						'title': TextUtils.i18n('%MODULENAME%/ACTION_NEW_CONTACT'),
						'handler': () => {
							const contactsViewInstance = getContactsViewInstance();
							const command = contactsViewInstance.newContactCommand;

							// check if we are on contacts screen or not
							if (!window.location.hash.startsWith('#' + Settings.HashModuleName)) {
								// if team book was selected before we need to redirect to personal contacts
								if (contactsViewInstance.selectedStorage() === 'team') {
									Routing.setHash(Utils.getContacts('personal', '', '', 1, '', 'create-contact'));
								} else {
									window.location.hash = Settings.HashModuleName
								}
							}

							if (contactsViewInstance.showPersonalContacts()) {
								if (command.canExecute()) {
									command()
								}
							} else {
								const loadingListSubscription = contactsViewInstance.showPersonalContacts.subscribe((v) => {
									if(v) {
										const command = contactsViewInstance.newContactCommand
										if (command.canExecute()) {
											command()
										}
										loadingListSubscription.dispose()
									}
								})
							}
						},
						'className': 'item_contacts',
						'order': 3,
						'column': 1
					});
				},
				getScreens: function () {
					return { [Settings.HashModuleName]: getContactsViewInstance };
				},
				getHeaderItem: function () {
					return {
						item: require('modules/%ModuleName%/js/views/HeaderItemView.js'),
						name: Settings.HashModuleName
					};
				},
				isTeamContactsAllowed: function () {
					return Utils.checkStorageExists('team');
				},
				getMobileSyncSettingsView: function () {
					return require('modules/%ModuleName%/js/views/MobileSyncSettingsView.js');
				}
			}, SuggestionsMethods, ContactsCardsMethods);
		}
	}
	
	return null;
};