package com.guru.facebook
{
	import com.facebook.commands.friends.GetFriends;
	import com.facebook.commands.users.GetInfo;
	import com.facebook.data.events.EventCategoriesValues;
	import com.facebook.data.FacebookData;
	import com.facebook.data.friends.GetFriendsData;
	import com.facebook.data.users.FacebookUser;
	import com.facebook.data.users.FacebookUserCollection;
	import com.facebook.data.users.GetInfoData;
	import com.facebook.data.users.GetInfoFieldValues;
	import com.facebook.events.FacebookEvent;
	import com.facebook.Facebook;
	import com.facebook.net.FacebookCall;
	import com.facebook.utils.FacebookSessionUtil;
	import com.guru.call.FunctionCall;
	import com.guru.call.ICall;
	import com.guru.conn.ConnAbstract;
	import com.guru.conn.ConnPath;
	import com.guru.panel.Panel;
	import com.guru.panel.StatusBar;
	import com.guru.utils.Delegate;
	import com.guru.utils.TraceUtil;
	import flash.display.LoaderInfo;
	import flash.system.Security;
	
	public class FacebookFBMLCenter
	{	
		public static var IS_IN_FACEBOOK_CANVAS:Boolean;
		public static var LOCAL_RANK_WHERE_CLAUSE:String = "";
		public static var UID:String = "0";
		public static var PROFILE_EMAIL_HASHES:String = "";
		public static var PROFILE_EMAIL_PROXIED:String = "";
		public static var PROFILE_BIRTHDAY:String = "";
		public static var PROFILE_NAME:String = "anonymous";
		public static var PROFILE_PIC:String = "image/default_user_image.jpg";
		public static var PROFILE_URL:String = "http://www.facebook.com";
		public static var FACEBOOK:Facebook
		
		private static const API_KEY = "3a4508475a4ef2a647e197560ce8a4db";
		private static const SECRET_KEY = "d009f460ea25328c32cd049bd0f62baa";
		
		private static var sFacebook:Facebook;
		private static var sFacebookSessionUtil:FacebookSessionUtil;
		private static var sFriendUid_array:Array;
		private static var sFriendProfile_array:Array;
		private static var sInstalledAppFriendUid_array:Array;
		
		private static var sLoaderInfo:LoaderInfo;
		private static var sTempFunction:Function;
		private static var sInitStack_array:Array;
		private static var sGetWholeRankingUIDConn:ConnAbstract
		private static var sPhotoType_str:String = GetInfoFieldValues.PIC_SQUARE;
		private static var sFacebookInitDoneCall:ICall;
		
		public function FacebookFBMLCenter()
		{
			
		}
		
		public static function getFriendList():Array
		{
			return sFriendProfile_array;
		}
		
		public static function init(pLoaderInfo:LoaderInfo, pInitDoneCall:ICall = null):void
		{
			sLoaderInfo = pLoaderInfo;
			sFacebookInitDoneCall = pInitDoneCall;
			
			sFacebookSessionUtil = new FacebookSessionUtil(API_KEY, SECRET_KEY, sLoaderInfo);
			
			Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml");
			
			Logger.eddy("************** LoaderInfo **************");
			for (var i in sLoaderInfo)
			{
				Logger.eddy("* " + i + ": " + sLoaderInfo[i]);
			}
			Logger.eddy("****************************************");
			
			if (isNaN(sLoaderInfo.parameters.fb_sig_user) || sLoaderInfo.parameters.fb_sig_user == undefined)
			{
				
			}
			else
			{
				UID = sLoaderInfo.parameters.fb_sig_user;
			}
			
			sFacebook = sFacebookSessionUtil.facebook;
			FACEBOOK = sFacebook;
			
			sInitStack_array = new Array();
			sInitStack_array.push(new FunctionCall(FacebookFBMLCenter, FacebookFBMLCenter.getProfile, [UID], [GetInfoFieldValues.NAME, GetInfoFieldValues.SEX, sPhotoType_str, GetInfoFieldValues.PROFILE_URL, GetInfoFieldValues.BIRTHDAY, GetInfoFieldValues.EMAIL_HASHES, GetInfoFieldValues.PROXIED_EMAIL]));
			sInitStack_array.push(new FunctionCall(FacebookFBMLCenter, FacebookFBMLCenter.getFriend));
			sInitStack_array.push(new FunctionCall(FacebookFBMLCenter, FacebookFBMLCenter.getFriendProfile, null, [GetInfoFieldValues.NAME, GetInfoFieldValues.SEX, sPhotoType_str, GetInfoFieldValues.PROFILE_URL, GetInfoFieldValues.BIRTHDAY, GetInfoFieldValues.EMAIL_HASHES, GetInfoFieldValues.PROXIED_EMAIL]));
			//sInitStack_array.push(new FunctionCall(FacebookFBMLCenter, FacebookFBMLCenter.getFriendRankingWhereClause));
			
			doInit();
		}
		
		private static function getFriendProfile(pUid_array:Array, pField:Array = null, pDoneCall:ICall = null):void
		{
			Logger.eddy("Get Friend Profile");
			
			if(!IS_IN_FACEBOOK_CANVAS)
			{
				sFriendProfile_array = new Array();
				for (var i:Number = 1; i <= 238; i++ )
				{
					var data_array:Array = new Array();
					data_array["uid"] = i;
					data_array["name"] = "name" + i;
					if(i % 2 == 0)
						data_array["sex"] = "male";
					else
						data_array["sex"] = "female";
					data_array["pic"] = "image/default_user.jpg";
					data_array["profile_url"] = "http://www.facebook.com";
					data_array["birthday"] = "May 29, 1990";
					sFriendProfile_array.push(data_array);
				}
				
				if (pDoneCall != null)
					pDoneCall.execute();
			}
			else
			{			
				if (pUid_array == null)
					pUid_array = sFriendUid_array;
				
				if (pField == null)
				{
					pField = [GetInfoFieldValues.ALL_VALUES];
				}
				sTempFunction = new Delegate(FacebookFBMLCenter, onGetFriendProfile, pDoneCall).getFunction();
				var call:FacebookCall = sFacebook.post(new GetInfo(pUid_array, pField));
				call.addEventListener(FacebookEvent.COMPLETE, sTempFunction);
			}
		}
		
		private static function onGetFriendProfile(e:FacebookEvent, pDoneCall:ICall):void
		{
			sTempFunction = null;
			var userCollection:FacebookUserCollection = (e.data as GetInfoData).userCollection;
			
			sFriendProfile_array = new Array();
			for (var i:Number = 0; i < userCollection.length; i++ )
			{
				var data_array:Array = new Array();
				data_array["uid"] = FacebookUser(userCollection.getItemAt(i)).uid;
				data_array["name"] = FacebookUser(userCollection.getItemAt(i)).name;
				data_array["pic"] = FacebookUser(userCollection.getItemAt(i)).pic_square;
				data_array["profile_url"] = FacebookUser(userCollection.getItemAt(i)).profile_url;
				data_array["birthday"] = FacebookUser(userCollection.getItemAt(i)).birthday;
				data_array["email_hashes"] = FacebookUser(userCollection.getItemAt(i)).email_hashes;
				data_array["proxied_email"] = FacebookUser(userCollection.getItemAt(i)).proxied_email;
				
				sFriendProfile_array.push(data_array);
			}
			
			for (i = 0; i < sFriendProfile_array.length; i++ )
			{
				for (var j = i + 1; j < sFriendProfile_array.length; j++ )
				{
					if (sFriendProfile_array[i]["name"] > sFriendProfile_array[j]["name"])
					{
						var temp = sFriendProfile_array[i];
						sFriendProfile_array[i] = sFriendProfile_array[j];
						sFriendProfile_array[j] = temp;
					}
				}
			}
			
			Logger.eddy("Get Friend Profile DONE! " + sFriendProfile_array.length);
			if(pDoneCall != null)
				pDoneCall.execute();
		}
		
		private static function getProfile(pUid_array:Array, pField:Array = null, pDoneCall:ICall = null):void
		{
			Logger.eddy("Get User Profile");
			
			if (pField == null)
			{
				pField = [GetInfoFieldValues.ALL_VALUES];
			}
			sTempFunction = new Delegate(FacebookFBMLCenter, onGetProfile, pDoneCall).getFunction();
			var call:FacebookCall = sFacebook.post(new GetInfo(pUid_array, pField));
			call.addEventListener(FacebookEvent.COMPLETE, sTempFunction);
		}
		
		private static function onGetProfile(e:FacebookEvent, pDoneCall:ICall):void
		{
			sTempFunction = null;
			var userCollection:FacebookUserCollection = (e.data as GetInfoData).userCollection;
			
			sFriendUid_array = new Array();
			sInstalledAppFriendUid_array = new Array();
			if (userCollection.length > 0)
			{
				var data_array:Array = new Array();
				data_array["uid"] = UID;
				data_array["name"] = FacebookUser(userCollection.getItemAt(0)).name;
				data_array["pic"] = FacebookUser(userCollection.getItemAt(0)).pic_square;
				data_array["profile_url"] = FacebookUser(userCollection.getItemAt(0)).profile_url;
				data_array["birthday"] = FacebookUser(userCollection.getItemAt(0)).birthday;
				data_array["email_hashes"] = FacebookUser(userCollection.getItemAt(0)).email_hashes;
				data_array["proxied_email"] = FacebookUser(userCollection.getItemAt(0)).proxied_email;
				
				PROFILE_NAME = data_array["name"];
				PROFILE_PIC = data_array["pic"];
				PROFILE_URL = data_array["profile_url"];
				PROFILE_BIRTHDAY = data_array["birthday"];
				PROFILE_EMAIL_HASHES = data_array["email_hashes"];
				PROFILE_EMAIL_PROXIED = data_array["proxied_email"];
			}
			sFriendUid_array.push(UID);
			
			if(pDoneCall != null)
				pDoneCall.execute();
		}
		
		private static function getFriendRankingWhereClause(pDoneCall:ICall = null):void
		{
			Logger.eddy("Get Friend Ranking Where Clause");
			
			sGetWholeRankingUIDConn = new ConnAbstract(ConnPath.getWholeRankingUIDPath(), new FunctionCall(FacebookFBMLCenter, getFriendRankingWhereClauseSuccess, pDoneCall), new FunctionCall(FacebookFBMLCenter, getFriendRankingWhereClauseFail, pDoneCall));
			sGetWholeRankingUIDConn.send();
		}
		
		private static function getFriendRankingWhereClauseSuccess(pDoneCall:ICall = null):void
		{
			var rawXML:XML = sGetWholeRankingUIDConn.getXML();
			
			var wholeRankingUID_array:Array = new Array();
			
			for (var i:Number = 0; i < rawXML..uid.length(); i++ )
			{
				var xml:XML = rawXML..uid[i];
				wholeRankingUID_array.push(xml[0]);
			}
			
			for (i = 0; i < wholeRankingUID_array.length; i++ )
			{
				for (var j:Number = 0; j < sFriendUid_array.length; j++ )
				{
					if (Number(wholeRankingUID_array[i]) == Number(sFriendUid_array[j]))
					{
						sInstalledAppFriendUid_array.push(String(wholeRankingUID_array[i]));
						if (LOCAL_RANK_WHERE_CLAUSE.length > 0)
						{
							LOCAL_RANK_WHERE_CLAUSE += " OR ";
						}
						LOCAL_RANK_WHERE_CLAUSE += "user_id = " + wholeRankingUID_array[i];
						break;
					}
				}
			}
			
			if (LOCAL_RANK_WHERE_CLAUSE.length > 0)
			{
				LOCAL_RANK_WHERE_CLAUSE += " ";
			}
			
			if (pDoneCall != null)
				pDoneCall.execute();
		}
		
		private static function getFriendRankingWhereClauseFail(pDoneCall:ICall = null):void
		{
			Logger.eddy("getFriendRankingWhereClause fail");
			
			if (pDoneCall != null)
				pDoneCall.execute();
		}
		
		private static function getFriend(pDoneCall:ICall = null):void
		{
			Logger.eddy("Get User Friend");
			
			if(!IS_IN_FACEBOOK_CANVAS)
			{
				for (var i:Number = 1; i <= 5; i++ )
				{
					sFriendUid_array.push(i);
				}
				
				if (pDoneCall != null)
					pDoneCall.execute();
			}
			else
			{
				sTempFunction = new Delegate(FacebookFBMLCenter, onGetFriend, pDoneCall).getFunction();
				var call:FacebookCall = sFacebook.post(new GetFriends(null, FacebookFBMLCenter.UID));
				call.addEventListener(FacebookEvent.COMPLETE, sTempFunction);
			}
		}
		
		private static function onGetFriend(e:FacebookEvent, pDoneCall:ICall = null):void
		{
			sTempFunction = null;
			
			if (e.data != null)
			{
				var userCollection:FacebookUserCollection = (e.data as GetFriendsData).friends;
				
				for (var i:Number = 0; i < userCollection.length; i++ )
				{
					sFriendUid_array.push(FacebookUser(userCollection.getItemAt(i)).uid);
				}
			}
			
			if(pDoneCall != null)
				pDoneCall.execute();
		}
		
		private static function onGetAllDataDone():void
		{
			Logger.eddy("*****************************************");
			Logger.eddy("* UID: " + UID);
			Logger.eddy("* NAME: " + PROFILE_NAME);
			Logger.eddy("* BIRTHDAY: " + PROFILE_BIRTHDAY);
			Logger.eddy("* PROFILE_PIC: " + PROFILE_PIC);
			Logger.eddy("* PROFILE_URL: " + PROFILE_URL);
			Logger.eddy("* PROFILE_EMAIL_HASHES: " + PROFILE_EMAIL_HASHES);
			Logger.eddy("* PROFILE_EMAIL_PROXIED: " + PROFILE_EMAIL_PROXIED);
			Logger.eddy("* Number of friends: " + sFriendUid_array.length);
			Logger.eddy("* App installed friends: " + sInstalledAppFriendUid_array.length);
			Logger.eddy("* where clause: " + LOCAL_RANK_WHERE_CLAUSE);
			Logger.eddy("* Get Date From Facebook Done!");
			Logger.eddy("*****************************************");
			
			Panel.hideStatusBar();
			
			if (sFacebookInitDoneCall != null)
			{
				sFacebookInitDoneCall.execute();
				sFacebookInitDoneCall = null;
			}
		}
		
		private static function invokeNextJobInStack():void
		{
			if (sInitStack_array.length > 0)
			{
				FunctionCall(sInitStack_array.shift()).execute(new FunctionCall(FacebookFBMLCenter, FacebookFBMLCenter.invokeNextJobInStack));
			}
			else
			{
				onGetAllDataDone();
			}
		}
		
		private static function doInit():void
		{
			Panel.showStatusBar(StatusBar.LOADING, "資料載入中，請稍候");
			
			if (sFacebook != null && sFacebook.uid != null)
			{
				Logger.eddy("IN FACEBOOK CANVAS");
				IS_IN_FACEBOOK_CANVAS = true;
				PROFILE_PIC = ConnPath.getServerPrefix() + PROFILE_PIC;
				sFacebookSessionUtil.removeEventListener(FacebookEvent.CONNECT, doInit);
			}
			else
			{
				IS_IN_FACEBOOK_CANVAS = false;
				Logger.eddy("WARNING! NOT IN FACEBOOK CANVAS");
			}
			
			invokeNextJobInStack();
		}
	}
}