
import _ from '_';

import {Focused, Capa, ClientSideKeyName, Magics} from 'Common/Enums';
import {$html, leftPanelDisabled, leftPanelType, moveAction, bMobileDevice} from 'Common/Globals';
import {pString, pInt, decodeURI, windowResizeCallback} from 'Common/Utils';
import {getFolderFromCacheList, getFolderFullNameRaw, getFolderInboxName} from 'Common/Cache';
import {i18n} from 'Common/Translator';

import * as Events from 'Common/Events';
import * as Settings from 'Storage/Settings';

import AppStore from 'Stores/User/App';
import AccountStore from 'Stores/User/Account';
import SettingsStore from 'Stores/User/Settings';
import FolderStore from 'Stores/User/Folder';
import MessageStore from 'Stores/User/Message';

import {SystemDropDownMailBoxUserView} from 'View/User/MailBox/SystemDropDown';
import {FolderListMailBoxUserView} from 'View/User/MailBox/FolderList';
import {MessageListMailBoxUserView} from 'View/User/MailBox/MessageList';
import {MessageViewMailBoxUserView} from 'View/User/MailBox/MessageView';

import {getApp} from 'Helper/Apps/User';

import {warmUpScreenPopup} from 'Knoin/Knoin';

import {AbstractScreen} from 'Knoin/AbstractScreen';

class MailBoxUserScreen extends AbstractScreen
{
	constructor() {
		super('mailbox', [
			SystemDropDownMailBoxUserView,
			FolderListMailBoxUserView,
			MessageListMailBoxUserView,
			MessageViewMailBoxUserView
		]);
	}

	/**
	 * @returns {void}
	 */
	updateWindowTitle() {
		let foldersInboxUnreadCount = FolderStore.foldersInboxUnreadCount();
		const email = AccountStore.email();

		if (Settings.appSettingsGet('listPermanentFiltered'))
		{
			foldersInboxUnreadCount = 0;
		}

		getApp().setWindowTitle(('' === email ? '' : '' + (0 < foldersInboxUnreadCount ? '(' + foldersInboxUnreadCount + ') ' : ' ') + email + ' - ') + i18n('TITLES/MAILBOX'));
	}

	/**
	 * @returns {void}
	 */
	onShow() {
		this.updateWindowTitle();

		AppStore.focusedState(Focused.None);
		AppStore.focusedState(Focused.MessageList);

		if (Settings.appSettingsGet('mobile'))
		{
			leftPanelDisabled(true);
		}

		if (!Settings.capa(Capa.Folders))
		{
			leftPanelType(Settings.capa(Capa.Composer) || Settings.capa(Capa.Contacts) ? 'short' : 'none');
		}
		else
		{
			leftPanelType('');
		}
	}

	/**
	 * @param {string} folderHash
	 * @param {number} page
	 * @param {string} search
	 * @returns {void}
	 */
	onRoute(folderHash, page, search) {
		let threadUid = folderHash.replace(/^(.+)~([\d]+)$/, '$2');
		const folder = getFolderFromCacheList(getFolderFullNameRaw(folderHash.replace(/~([\d]+)$/, '')));

		if (folder)
		{
			if (folderHash === threadUid)
			{
				threadUid = '';
			}

			FolderStore.currentFolder(folder);

			MessageStore.messageListPage(page);
			MessageStore.messageListSearch(search);
			MessageStore.messageListThreadUid(threadUid);

			getApp().reloadMessageList();
		}
	}

	/**
	 * @returns {void}
	 */
	onStart() {
		FolderStore.folderList.subscribe(windowResizeCallback);

		MessageStore.messageList.subscribe(windowResizeCallback);
		MessageStore.message.subscribe(windowResizeCallback);

		_.delay(() => SettingsStore.layout.valueHasMutated(), Magics.Time50ms);
		_.delay(() => warmUpScreenPopup(require('View/Popup/Compose')), Magics.Time500ms);

		Events.sub('mailbox.inbox-unread-count', (count) => {
			FolderStore.foldersInboxUnreadCount(count);

			const email = AccountStore.email();
			_.each(AccountStore.accounts(), (item) => {
				if (item && email === item.email)
				{
					item.count(count);
				}
			});

			this.updateWindowTitle();
		});
	}

	/**
	 * @returns {void}
	 */
	onBuild() {
		if (!bMobileDevice && !Settings.appSettingsGet('mobile'))
		{
			_.defer(() => {
				getApp().initHorizontalLayoutResizer(ClientSideKeyName.MessageListSize);
			});
		}

		$html.on('click', '#rl-right', () => {
			moveAction(false);
		});
	}

	/**
	 * @returns {Array}
	 */
	routes() {
		const
			inboxFolderName = getFolderInboxName(),
			fNormS = (request, vals) => {
				vals[0] = pString(vals[0]);
				vals[1] = pInt(vals[1]);
				vals[1] = 0 >= vals[1] ? 1 : vals[1];
				vals[2] = pString(vals[2]);

				if ('' === request)
				{
					vals[0] = inboxFolderName;
					vals[1] = 1;
				}

				return [decodeURI(vals[0]), vals[1], decodeURI(vals[2])];
			},
			fNormD = (request, vals) => {
				vals[0] = pString(vals[0]);
				vals[1] = pString(vals[1]);

				if ('' === request)
				{
					vals[0] = inboxFolderName;
				}

				return [decodeURI(vals[0]), 1, decodeURI(vals[1])];
			};

		return [
			[/^([a-zA-Z0-9~]+)\/p([1-9][0-9]*)\/(.+)\/?$/, {'normalize_': fNormS}],
			[/^([a-zA-Z0-9~]+)\/p([1-9][0-9]*)$/, {'normalize_': fNormS}],
			[/^([a-zA-Z0-9~]+)\/(.+)\/?$/, {'normalize_': fNormD}],
			[/^([^\/]*)$/, {'normalize_': fNormS}]
		];
	}
}

export {MailBoxUserScreen, MailBoxUserScreen as default};
