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

function renderUser (user, buttons) {
	user = getUser(user);
	
	let container = createElement('div', 'user user-' + user.id);
	
	if (user.verified) {
		container.className += ' verified';
	}
	
	if (config.user && config.user.id == user.id) {
		container.className += ' is-current-user';
	}
	
	if (user.following == 'yes') {
		container.className += ' following';
	}
	
	if (user.following == 'pending') {
		container.className += ' pending';
	}
	
	let avatar = createElement('span', 'avatar');
	
	preload(user.avatar, (url) => avatar.style.backgroundImage = 'url(' + url + ')');
	
	let name = getUserName(user);
	
	let label = createElement('span', 'name', name);
	
	let badge = createElement('span', 'verified-badge');
	
	if (!~buttons.indexOf('unblock')) {
		let link = createElement('a', null, avatar, label, badge);
		
		if (user.username) {
			link.href = '/username/' + user.username;
		} else {
			link.href = '/user/' + user.id;
		}
		
		container.append(link);
	} else {
		container.className += ' blocked';
		container.append(avatar, label, badge);
	}
	
	let bullet = createElement('span', 'bullet');
	
	container.append(bullet);
	
	if (buttons) {
		buttons.forEach(type => {
			let button = createElement('button', 'button-' + type);
			
			switch (type) {
				case 'follow':
					button.append(createElement('span', null, __('Follow')));
					break;
					
				case 'unfollow':
					button.append(createElement('span', null,  __('Unfollow')));
					break;
				
				case 'pending':
					button.append(createElement('span', null, __('Cancel')));
					break;
					
				case 'unblock':
					button.append(createElement('span', null, __('Unblock')));
					break;
			}
			
			container.append(button);
		});
	}

	let elements = document.querySelectorAll('.user.user-' + user.id);
	
	for (let element of elements) {
		element.classList.toggle('following', user.following == 'yes');
		element.classList.toggle('pending', user.following == 'pending');
		
		let link = element.firstChild;
		
		link.childNodes[0].style.backgroundImage = 'url(' + user.avatar + ')';
		link.childNodes[1].innerHTML = encodeHTML(name);
	}
	
	return container;
}

document.addEventListener('click', (e) => {
	let element = e.target, userID;
	
	do {
		for (let value of element.classList.values()) {
			if (value.substr(0, 5) == 'user-') {
				userID = value.substr(5);
				break;
			}
		}
		
		if (userID) {
			break;
		}
		
		element = element.parentNode;		
	} while (element && element.classList);
	
	if (userID) {
		let element = e.target, name = getUserName(userID);
		
		while (element && element.matches) {
			if (element.matches('.profile .button-message')) {
				router.go('/messages/user/' + userID, { title: name });
				break;
			}
			
			if (element.matches('.button-follow')) {
				api.follow(userID);
				break;
			}
			
			if (element.matches('.button-pending')) {
				api.confirm(__('Are you sure you want to cancel the follow request for %s?', name), () => api.cancel(userID));
				break;
			}
			
			if (element.matches('.button-unfollow')) {
				api.confirm(__('Are you sure you want to unfollow %s?', name), () => api.unfollow(userID));
				break;
			}
			
			if (element.matches('.button-unblock')) {
				api.unblock(userID);
				element.parentNode.classList.remove('blocked');
				break;
			}
			
			if (element.matches('.button-accept')) {
				api.accept(userID);
				element.parentNode.classList.remove('pending');
				break;
			}
			
			if (element.matches('.button-decline')) {
				api.decline(userID);
				element.parentNode.classList.remove('pending');
				break;
			}
			
			if (element.matches('.button-subscribe')) {
				api.subscribe(userID);
				break;
			}
			
			if (element.matches('.button-unsubscribe')) {
				api.unsubscribe(userID);
				break;
			}
			
			element = element.parentNode;
		}
	}
});