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

window.login = window.login || {};

login.callback = function (method, token, values, url) {
	values = values || {};
	
	url = url || window.afterLoginURL || '/';
	delete window.afterLoginURL;
	
	if (config.user || config.session) {
		delete config.user;
		options.delete('user');
		
		delete config.session;
		options.delete('session');
	}
	
	if (method == 'session') {
		config.session = token;
		
		api.self(null, () => {
			options.set('session', config.session);
			
			initiate(() => {
				router.redirect(url, null, true);
				startup.process();
			});
		}, () => {
			toast(__('Login failed.'));
			config.session = null;
		});
		
		return;
	}
	
	values[method] = token;
	
	api.post({
		url: '/login',
		data: values,
		success: (result) => {
			if (!result.session) {
				toast('Login failed.');
				return;
			}

			if (result.session.two_step) {
				api.alert(__('You\'ll receive a login link in your email inbox.'));
				analytics.push('event', 'login', { method: method });
				
				return;
			}
			
			config.session = result.session.session;
			options.set('session', config.session);
			
			api.self(null, () => {
				initiate(() => {
					router.redirect(url, null, true);
					startup.process();
				});
				
				analytics.push('event', 'login', { method: method });
			});
		},
		error: () => toast('Login failed.')
	});
}

login.facebook = function (url) {
	acceptTerms(() => {
		if (window.cordova) {
			facebookConnectPlugin.login(config.facebook.scope.split(','), (response) => {
				if (response.status == 'connected') {
					login.callback('facebook', response.authResponse.accessToken, null, url);
				} else {
					api.error('loginFacebook', response);
				}
				
				if (config.iOS) {
					StatusBar.hide();
					StatusBar.show();
				}
			});
			
			return;
		}
		
		loadScript('https://connect.facebook.net/en_US/sdk.js', () => {
			FB.init({ appId: config.facebook.appID, cookie: false, xfbml: false, version: 'v5.0' });

			FB.login((response) => {
				if (response.status == 'connected') {
					login.callback('facebook', response.authResponse.accessToken, null, url);
				}
			}, {
				scope: config.facebook.scope
			});
		}, () => {
			api.alert(__('Could not load the Facebook SDK. Please try again later.'));
		});
	});
}

login.google = function (url) {
	acceptTerms(() => {
		if (window.cordova) {
			plugins.googleplus.login({
				scopes: config.google.scope, webClientId: config.google.clientID, offline: true
			}, (response) => {
				login.callback('google', response.accessToken, null, url);
				
				if (config.iOS) {
					StatusBar.hide();
					StatusBar.show();
				}
			}, (error) => {
				api.error('loginGoogle', error);
				
				if (config.iOS) {
					StatusBar.hide();
					StatusBar.show();
				}
			});
			
			return;
		}
		
		document.cookie = 'g_state=;path=/;expires=Thu, 01 Jan 1970 00:00:00 GMT';
		
		if (window.google) {
			return google.accounts.id.prompt();
		}
		
		loadScript('https://accounts.google.com/gsi/client', () => {
			google.accounts.id.initialize({
				client_id: config.google.clientID,
				callback: (auth) => login.callback('google', auth.credential, null, url)
			});
			
			google.accounts.id.prompt();
		}, () => {
			api.alert(__('Could not load the Google SDK. Please try again later.'));
		});
	});
}

login.apple = function (url) {
	acceptTerms(() => {
		if (!window.cordova) {
			window.open(config.url + '/login/apple', 'appleid', 'width=650,height=675');
			window.afterLoginURL = url;
			return;
		}
		
		SignInWithApple.request({
			requestedScopes: [SignInWithApple.Scope.Email, SignInWithApple.Scope.FullName],
			requestedOperation: SignInWithApple.Operation.Login
		}).then((response) => {
			let name = response.fullName.givenName + ' ' + response.fullName.familyName;
			login.callback('apple', response.authorizationCode, { name: name.trim() }, url);
		}).finally(() => {
			StatusBar.hide();
			StatusBar.show();
		});
	});
}

function acceptTerms (callback) {
	if (options.get('terms') == 'accepted') {
		callback && callback();
		return;
	}
	
	if (window.cordova) {
		navigator.notification.confirm(__('By creating an account, you agree to our Terms of Use.'), (button) => {
			if (button == 1) {
				options.set('terms', 'accepted');
				
				if (callback) {
					callback();
				}
			}

			if (button == 2) {
				router.go('/legal');
			}
		}, config.name, [__('OK'), __('Terms'), __('Cancel')]);
	} else {
		api.confirm(__('By creating an account, you agree to our Terms of Use.'), () => {
			options.set('terms', 'accepted');
			
			if (callback) {
				callback();
			}
		});
	}
}

login.logoff = function (navigate, url) {
	url = url || '/';
	
	if (config.session) {
		api.delete({
			url: '/login',
			error: false
		});
	}
	
	delete config.session;
	delete config.user;
	
	options.delete('session');
	options.delete('user');
	
	setUserState(false);
	
	startup.reset();
	
	document.body.classList.add('is-guest');
	document.body.classList.remove('is-user');
	
	initiate(() => {
		if (navigate) {
			router.redirect(url, null, true);
		}
	});
	
	analytics.push('set', 'user_id', '');
}	
