/*
	Created by Michael Schuijff <michael@reglobe.nl>
	Copyright Lost Images, The Netherlands
	
	For more information, visit www.michaelschuijff.nl
*/

router.register('/messages', () => {
	if (!config.user) {
		if (!config.bot) {
			router.redirect('/login', { url: router.getURL() });
		} else {
			router.noIndex();
		}

		return;
	}

	let view = createView({
		menuState: 'messages', titleBar: __('Contacts'), hideMainTitleBar: true, hideBottomMenu: true,
		buttons: ['close', 'group-chat'], urls: ['/messages'], className: 'contacts-view', spinner: true, pullToRefresh: true
	});
	
	view.content.append(createElement('div'));
	
	const step = 20;
	
	let req, count, timer;
	
	function fetchContacts () {
		clearTimeout(timer);
		
		req = api.get({
			url: '/messages',
			data: { count: count },
			success: (result) => {
				let content = createElement('div');
				
				if (!result.contacts.length) {
					content.append(createElement('div', 'no-content', 'You haven\'t received any messages yet.'));
				}
				
				for (let contact of result.contacts) {
					content.append(renderContact(contact));
				}
				
				view.content.firstChild.replaceWith(content);
				
				view.hideSpinner();
				
				if (result.more) {
					view.enableInfiniteScrolling();
					
					if (view == window.activeView && view.content.offsetHeight < window.innerHeight) {
						setTimeout(fetchContacts, 0);
						count += step;
					}
				} else {
					view.disableInfiniteScrolling();
				}
			},
			complete: () => {
				timer = setTimeout(() => {
					req || fetchContacts()
				}, 15000);
				
				view.revertPullToRefresh();
				req = null;
			}
		});			
	}
	
	function renderContact (contact) {
		let link = createElement('a', 'contact');
		
		if (contact.unseen) {
			link.className += ' is-unseen';
		}

		link.href = contact.url;

		link.onclick = (e) => {
			e.preventDefault(), e.stopPropagation();
			
			router.go(link.href, { title: contact.title });
			link.classList.remove('is-unseen');
		}
		
		if (contact.avatar) {
			let avatar = createElement('span', 'avatar');
			
			preload(contact.avatar, (url) => avatar.style.backgroundImage = 'url(' + url + ')');
			
			link.append(avatar);
		}
		
		link.append(renderDatetime(contact.created), createElement('span', 'title', contact.title));
		
		if (contact.message) {
			link.append(createElement('span', 'message', contact.message));
		}
		
		return link;
	}
	
	view.register('load', () => {
		count = step, fetchContacts();
	});
	
	view.register('resume', () => {
		fetchContacts();
	});

	view.register('pause destroy', () => {
		clearInterval(timer);
	});

	view.register('refresh', () => {
		count = step;
		
		if (req) {
			req.abort();
		}
		
		view.spinner();
		fetchContacts();
	});

	view.register('infinite-scroll', () => {
		if (!req) {
			count += step;
			fetchContacts();
		}
	});
	
	view.register('group-chat', () => {
		router.go('/messages/group/create');
	});
	
	return view;
});
