package com.guru.facebook
{
	import com.adobe.serialization.json.JSONEncoder;
	import com.facebook.commands.stream.PublishPost;
	import com.facebook.events.FacebookEvent;
	import com.facebook.net.FacebookCall;
	import com.guru.call.FunctionCall;
	import com.guru.call.ICall;
	import com.guru.conn.ConnAbstract;
	import com.guru.conn.ConnPath;
	import com.guru.facebook.feed.base.FeedBase;
	import com.guru.utils.Delegate;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class PostFeed
	{
		//private static var sPostFeedConn:ConnAbstract;
		
		public static function post(pFeed:FeedBase, pFriendUID_str:String, pSuccessCall:ICall = null, pFailCall:ICall = null):void
		{
			if (FacebookDataBridge.getAllowPublish())
			{
				if (FacebookDataBridge.MODE == FacebookDataBridge.FBML)
				{
					doFBMLPost(pFeed, pFriendUID_str, pSuccessCall, pFailCall);
				}
				else if (FacebookDataBridge.MODE == FacebookDataBridge.IFRAME)
				{
					doIFramePost(pFeed, pFriendUID_str, pSuccessCall, pFailCall);
				}
			}
			else
			{
				Logger.eddy("DISALLOW PUBLISH ;(");
				
				Logger.eddy("* Feed details:");
				Logger.eddy("* target_uid: " + pFriendUID_str);
				Logger.eddy("* link: " + pFeed.getHref());
				Logger.eddy("* picture: " + pFeed.getImage());
				Logger.eddy("* message: " + pFeed.getMessage());
				Logger.eddy("* name: " + pFeed.getName());
				Logger.eddy("* caption: " + pFeed.getCaption());
				Logger.eddy("* description: " + pFeed.getDescription());
			}
		}
		
		
		//---------------------------------- IFRAME START ------------------------------------
		private static function doIFramePost(pFeed:FeedBase, pTargetUID_str:String, pSuccessCall:ICall = null, pFailCall:ICall = null):void
		{
			Logger.eddy("Post IFrame feed");
			var conn:ConnAbstract = new ConnAbstract(ConnPath.getPublishPath());
			var successCall:ICall = new FunctionCall(PostFeed, onIFrameSuccess, conn, pSuccessCall, pFailCall);
			var failCall:ICall = new FunctionCall(PostFeed, onIFrameFail, pFailCall);
			conn.setSuccessCall(successCall);
			conn.setFailCall(failCall);
			
			Logger.eddy("* Feed details:");
			Logger.eddy("* target_uid: " + pTargetUID_str);
			Logger.eddy("* link: " + pFeed.getHref());
			Logger.eddy("* picture: " + pFeed.getImage());
			Logger.eddy("* message: " + pFeed.getMessage());
			Logger.eddy("* name: " + pFeed.getName());
			Logger.eddy("* caption: " + pFeed.getCaption());
			Logger.eddy("* description: " + pFeed.getDescription());
			
			conn.send( { target_uid:pTargetUID_str, link:pFeed.getHref(), picture:pFeed.getImage(), message:pFeed.getMessage(), name:pFeed.getName(), caption:pFeed.getCaption(), description:pFeed.getDescription()} );
		}
		
		private static function onIFrameSuccess(pConn:ConnAbstract, pSuccessCall:ICall = null, pFailCall:ICall = null):void
		{
			//if(sPostFeedConn.getXML()..status[0] == "true")
			
			if(pConn.getXML()..status[0] == "true")
			{
				if (pSuccessCall != null)
					pSuccessCall.execute();
				Logger.eddy("onIFramePublish SUCCESS :)");
			}
			else
			{
				Logger.eddy(pConn.getXML());
				onIFrameFail(pFailCall);
			}
			
		}
		
		private static function onIFrameFail(pFailCall:ICall = null):void
		{
			if (pFailCall != null)
				pFailCall.execute();
			Logger.eddy("onIFramePublish FAIL :(");
		}
		//---------------------------------- IFRAME END ------------------------------------
		
		//---------------------------------- FBML START ------------------------------------
		private static function doFBMLPost(pFeed:FeedBase, pTargetUID_str:String, pSuccessCall:ICall = null, pFailCall:ICall = null):void
		{
			Logger.eddy("Post FBML feed");
			var call:FacebookCall = FacebookDataBridge.getFacebook().post(new PublishPost(pFeed.getMessage(), pFeed.getAttachment(), null, pTargetUID_str, FacebookDataBridge.getLoggerUid()));
			call.addEventListener(FacebookEvent.COMPLETE, new Delegate(PostFeed, onFBMLPublish, pSuccessCall, pFailCall).getFunction());
		}
		
		private static function onFBMLPublish(e:FacebookEvent, pSuccessCall:ICall = null, pFailCall:ICall = null):void
		{
			if (e.error != null)
			{
				if(pFailCall != null)
					pFailCall.execute();
				Logger.eddy("onFBMLPublish FAIL: " + e.error.errorMsg);
			}
			else
			{
				if(pSuccessCall != null)
					pSuccessCall.execute();
				Logger.eddy("onFBMLPublish SUCCESS: " + e.data);
			}
		}
		//---------------------------------- FBML END ------------------------------------
		
		public function PostFeed() 
		{
			
		}
	}

}