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

if (!window.cordova) {
	document.body.className += ' apple-login-support';
}

document.body.className += ' hidden';

(function () {
	window.initiate = function (callback) {
		hideToast();
		
		cache.reset();

		api.reset();

		getUser(config.user);
		
		let elements = document.querySelectorAll('.profile-avatar');
		
		if (config.user && config.user.avatar) {
			preload(config.user.avatar, (url) => {
				for (let element of elements) {
					element.style.backgroundImage = 'url(' + url + ')';
				}
			});
		} else {
			for (let element of elements) {
				element.style.backgroundImage = null;
			}
		}
		
		if (config.session && window.cordova) {
			FirebasePlugin.grantPermission(console.log);
			FirebasePlugin.getToken(api.token);
			FirebasePlugin.onTokenRefresh(api.token);
		}
		
		if (config.session && !config.categories) {
			api.get({
				url: '/categories',
				success: (result) => {
					Object.assign(config, { categories: result.categories });
				},
				complete: () => {
					if (!config.categories) {
						config.categories = [];
					}
					
					if (callback) {
						callback();
					}
				}
			});
		} else if (callback) {
			callback();
		}
		
		setUserState(true);
		
		document.body.classList.toggle('is-user', !!config.user);
		document.body.classList.toggle('is-guest', !config.user);
	}

	window.switchToUser = function (user, url, success, error) {
		url = url || '/';
		
		api.self(user, () => {
			options.set('user', user);
			
			initiate(() => {
				router.redirect(url);
				
				if (window.cordova) {
					history.replaceState(Object.assign(history.state || {}, { start: true }), '');
				}
				
				toast(__('Switched profile to %s.', getUserName(user)));
				
				if (success) {
					success();
				}
			});
		}, error);
	}

	let alerts = 0, messages = 0, timer;

	window.setUserState = function (state) {
		if (!config.user) {
			alerts = 0, messages = 0;
		}
		
		if (typeof state == 'number') {
			alerts = state;
		}
		
		document.body.classList.toggle('unseen-alerts', !!alerts);
		document.body.classList.toggle('unread-messages', !!messages);
		
		if (window.cordova) {
			FirebasePlugin.setBadgeNumber(alerts + messages);
		}
		
		if (!config.user) {
			return;
		}
		
		clearTimeout(timer);
		
		api.get({
			url: '/self/states',
			success: (result) => {
				let unseen = result.unseen;
				
				if (unseen) {
					alerts = unseen.alerts, messages = unseen.messages;
				}
				
				document.body.classList.toggle('unseen-alerts', !!alerts);
				document.body.classList.toggle('unread-messages', !!messages);
				
				if (window.cordova) {
					FirebasePlugin.setBadgeNumber(alerts + messages);
				}
			},
			complete: () => {
				timer = setTimeout(() => setUserState(true), 5000);
			}
		});
	}
})();

document.addEventListener('loaded', () => {
	if (config.offline) {
		config.session = null;
		
		router.redirect('/login');
		
		if (window.cordova) {
			setTimeout(navigator.splashscreen.hide, 700);
		}
		
		document.body.classList.remove('hidden');
		
		if (window.activeView) {
			activeView.trigger('resize');
		}
		
		return;
	}
	
	let url = location.href;

	if (window.cordova || location.protocol == 'file:') {
		let state = history.state || {};
		
		if (window.cordova) {
			state.start = true;
		}

		url = state.url || '/';
		
		state.url = url;

		history.replaceState(state, '');
	}
	
	config.session = options.get('session');
	
	api.self(options.get('user'), () => {
		initiate(() => {
			router.redirect(url, null, true);

			startup.process();
			
			refreshDarkMode();
			
			if (window.cordova) {
				setTimeout(navigator.splashscreen.hide, 700);
			}
			
			document.body.classList.remove('hidden');
			
			if (window.activeView) {
				activeView.trigger('resize');
			}
		});
	}, () => {
		login.logoff(false);
		
		router.redirect(url, null, true);
		
		startup.process();
		
		refreshDarkMode();

		if (window.cordova) {
			setTimeout(navigator.splashscreen.hide, 700);
		}
		
		document.body.classList.remove('hidden');
		
		if (window.activeView) {
			activeView.trigger('resize');
		}
	});
});

document.addEventListener('deviceready', () => {
	if (config.iOS) {
		SignInWithApple.isAvailable().then((isAvailable) => document.body.classList.toggle('apple-login-support', isAvailable));
	}

	universalLinks.subscribe(null, (e) => {
		let params = e.params || {};
		
		let user = params.switch_user;
		
		if (!user && config.user) {
			user = config.user.id;
		}
		
		delete params.switch_user;

		let url = e.path || '/', search = encodeURIData(params);
		
		if (search) {
			if (~url.indexOf('?')) {
				url += '&' + search;
			} else {
				url += '?' + search;
			}
		}
		
		if (e.path == '/login' && e.params.email) {
			router.go(url);
			return;
		}
		
		startup.queue(() => {
			if (user && config.user && user !== config.user.id) {
				switchToUser(user, url);
			} else {
				router.go(url);
			}
		});
	});

	if (config.android) {
		cordova.openwith.init(() => {
			cordova.openwith.addHandler((intent) => {
				let items = intent.items;
				
				if (!items[0].type) {
					return;
				}
				
				let images = [];
				
				for (let item of items) {
					cordova.openwith.load(item, (data) => {
						images[images.length] = toBlob(data, item.type);
						
						if (images.length < length) {
							return;
						}
						
						let post = { type: 'post', images: images };
						startup.queue(() => router.go('/compose/post', post));
					});
				}
			});
		}, (error) => {
			api.error('openWith', error);
		});
	}
});
