package com.guru.facebookApplicationBase.album 
{
	import com.adobe.images.JPGEncoder;
	import com.facebook.commands.photos.AddTag;
	import com.facebook.commands.photos.CreateAlbum;
	import com.facebook.commands.photos.GetAlbums;
	import com.facebook.commands.photos.UploadPhoto;
	import com.facebook.data.photos.AlbumData;
	import com.facebook.data.photos.FacebookPhoto;
	import com.facebook.data.photos.GetAlbumsData;
	import com.facebook.data.photos.GetCreateAlbumData;
	import com.facebook.data.photos.PhotoData;
	import com.facebook.data.photos.PhotoTagCollection;
	import com.facebook.data.photos.TagData;
	import com.facebook.errors.FacebookError;
	import com.facebook.events.FacebookEvent;
	import com.facebook.net.FacebookCall;
	import com.facebook.utils.FacebookArrayCollection;
	import com.guru.call.ICall;
	import com.guru.facebook.FacebookDataBridge;
	import com.guru.utils.Delegate;
	import flash.display.BitmapData;
	import flash.utils.ByteArray;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class FacebookAlbum
	{
		public static const PRIVACY_FRIENDS:String = "friends";
		public static const PRIVACY_FRIENDS_OF_FRIENDS:String = "friends-of-friends";
		public static const PRIVACY_NETWORKS:String = "networks";
		public static const PRIVACY_EVERYONE:String = "everyone";
		
		private var mName_str:String;
		private var mDescription_str:String;
		private var mLocation_str:String;
		private var mVisible_str:String;
		private var mAlbum:AlbumData;
		
		public function FacebookAlbum(pName_str:String, pDescription_str:String, pLocation_str:String, pVisible_str:String)
		{
			mName_str = pName_str;
			mDescription_str = pDescription_str;
			mLocation_str = pLocation_str;
			mVisible_str = pVisible_str;
		}
		
		/**
		 * check the existance of target album
		 * create it if the album does not exist
		 * @param	pDoneCall	donecall when init finished
		 */
		public function init(pDoneCall:ICall = null):void
		{
			if (FacebookDataBridge.getFacebook() != null)
			{
				this.getAlbum(pDoneCall);
			}
			else
			{
				if (pDoneCall != null)
					pDoneCall.execute();
			}
			
		}
		
		public function tagPhoto(pPid_str:String, pTargetUid_str:String, pTagText_str:String, pX_num:Number, pY_num:Number, pPhotoTagCollection:PhotoTagCollection, pDoneCall:ICall = null):void
		{
			var addTag:AddTag = new AddTag(pPid_str, pTargetUid_str, pTagText_str, pX_num, pY_num, pPhotoTagCollection);
			var call:FacebookCall = FacebookDataBridge.getFacebook().post(addTag);
			call.addEventListener(FacebookEvent.COMPLETE, new Delegate(this, handleAddTagResponse, pDoneCall).getFunction());
			
		}
		
		public function addPhoto(pBMPData:BitmapData, pCaption_str:String = null, pDoneCall:ICall = null):void
		{
			var ecoder:JPGEncoder = new JPGEncoder(100);
			var byteArray:ByteArray = ecoder.encode(pBMPData);
			
			var newPhoto:UploadPhoto = new UploadPhoto(byteArray, mAlbum.aid, pCaption_str, FacebookDataBridge.getLoggerUid());
			//var newPhoto:UploadPhoto = new UploadPhoto(pBMPData, mAlbum.aid, pCaption_str, FacebookDataBridge.getLoggerUid());
			var call:FacebookCall = FacebookDataBridge.getFacebook().post(newPhoto);
			call.addEventListener(FacebookEvent.COMPLETE, new Delegate(this, handleAddPhotoResponse, pDoneCall).getFunction());			
		}
		
		private function getAlbum(pDoneCall:ICall = null):void
		{
			var getAlbumCall:GetAlbums = new GetAlbums();
			var call:FacebookCall = FacebookDataBridge.getFacebook().post(getAlbumCall);
			call.addEventListener(FacebookEvent.COMPLETE, new Delegate(this, handleGetAlbumResponse, pDoneCall).getFunction());
		}
		
		private function handleGetAlbumResponse(e:FacebookEvent, pDoneCall:ICall = null):void
		{
			if (e.error)
			{
				Logger.eddy("handleGetAlbumResponse ERROR: " + e.error);
			}
			
			if (e != null && e.data != null)
			{
				var getAlbumsData:GetAlbumsData = e.data as GetAlbumsData;
				var album:AlbumData;
				for(var i:Number = 0; i < getAlbumsData.albumCollection.length; i++)
				{
					album = getAlbumsData.albumCollection.getItemAt(i) as AlbumData;
					
					if (album.name == mName_str)
						mAlbum = album;
				}
			}
			
			if (mAlbum != null)
			{
				Logger.eddy("album \"" + mName_str + "\" already existed");
				if (pDoneCall != null)
					pDoneCall.execute();
			}
			else
			{
				Logger.eddy("creating album \"" + mName_str + "\"...");
				this.createAlbum(pDoneCall);
			}
		}
		
		private function createAlbum(pDoneCall:ICall = null):void
		{
			var newAlbum:CreateAlbum = new CreateAlbum(mName_str, mLocation_str, mDescription_str, mVisible_str);
			var call:FacebookCall = FacebookDataBridge.getFacebook().post(newAlbum);
			call.addEventListener(FacebookEvent.COMPLETE, new Delegate(this, handleCreateAlbumResponse, pDoneCall).getFunction());			
		}
		
		private function handleCreateAlbumResponse(e:FacebookEvent, pDoneCall:ICall = null):void
		{
			if (e.error)
			{
				Logger.eddy("handleCreateAlbumResponse ERROR: " + e.error);
			}
			
			if (e != null && e.data != null)
			{
				var getCreateAlbumData:GetCreateAlbumData = e.data as GetCreateAlbumData;
				//Logger.eddy("rawResult: " + getCreateAlbumData.rawResult);
				mAlbum = getCreateAlbumData.albumData;
				Logger.eddy("create album \"" + mName_str + "\" SUCCESS :)");
				this.logAlbumData();
			}
			else
			{
				Logger.eddy("create album \"" + mName_str + "\" FAIL :(");
			}
			
			if (pDoneCall != null)
				pDoneCall.execute();
		}
		
		private function handleAddTagResponse(e:FacebookEvent, pDoneCall:ICall = null):void
		{
			if (e.error)
			{
				Logger.eddy("handleAddTagResponse ERROR: " + (e.error as FacebookError).errorMsg);
			}
			
			var tagData:TagData;
			if (e != null && e.data != null)
			{
				tagData = e.data as TagData;
				Logger.eddy("add tag SUCCESS :)");
			}
			else
			{
				Logger.eddy("add tag FAIL :(");
			}
			
			if (pDoneCall != null)
				pDoneCall.execute(tagData);
		}
		
		private function handleAddPhotoResponse(e:FacebookEvent, pDoneCall:ICall = null):void
		{
			if (e.error)
			{
				Logger.eddy("handleAddPhotoResponse ERROR: " + (e.error as FacebookError).errorMsg);
			}
			
			var facebookPhoto:FacebookPhoto;
			if (e != null && e.data != null)
			{
				facebookPhoto = e.data as FacebookPhoto;
				Logger.eddy("add photo SUCCESS :)");
			}
			else
			{
				Logger.eddy("add photo FAIL :(");
			}
			
			if (pDoneCall != null)
				pDoneCall.execute(facebookPhoto);
		}
		
		private function logAlbumData():void
		{
			Logger.eddy("**********************************");
			Logger.eddy("* aid: " + mAlbum.aid);
			Logger.eddy("* cover_pid: " + mAlbum.cover_pid);
			Logger.eddy("* created: " + mAlbum.created);
			Logger.eddy("* description: " + mAlbum.description);
			Logger.eddy("* edit_link: " + mAlbum.edit_link);
			Logger.eddy("* link: " + mAlbum.link);
			Logger.eddy("* location: " + mAlbum.location);
			Logger.eddy("* modified: " + mAlbum.modified);
			Logger.eddy("* modified_major " + mAlbum.modified_major);
			Logger.eddy("* name: " + mAlbum.name);
			Logger.eddy("* owner: " + mAlbum.owner);
			Logger.eddy("* size: " + mAlbum.size);
			Logger.eddy("* type: " + mAlbum.type);
			Logger.eddy("* visible: " + mAlbum.visible);
			Logger.eddy("**********************************");
		}
	}
}