/**
 * THE AdminConsole.java WRITEME...
 */
package com.tootsville.tootsbook.client.pages;

// import org.gwtwidgets.client.wrap.Callback;
// import org.gwtwidgets.client.wrap.Effect;
// import org.gwtwidgets.client.wrap.EffectOption;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.tootsville.tootsbook.client.BookServiceAsync;
import com.tootsville.tootsbook.client.TootsBook;
import com.tootsville.tootsbook.client.panel.Box;
import com.tootsville.tootsbook.client.panel.ErrorMessage;
import com.tootsville.tootsbook.client.panel.wallobjects.PostPanel;
import com.tootsville.tootsbook.client.util.DisplayText;
import com.tootsville.tootsbook.client.util.Post;
import com.tootsville.tootsbook.client.util.UserProfile;

/**
 * WRITEME: Document this type. twheys@gmail.com Jan 20, 2010
 * 
 * @author <a href="mailto:twheys@gmail.com@resinteractive.com">Tim
 *         Heys</a>
 * 
 */
public class AdminConsole extends HorizontalPanel {

	/**
	 * WRITEME twheys@gmail.com
	 */
	private final Label loadingPostsMessage = new Label (
			"Loading posts.");
	/**
	 * WRITEME twheys@gmail.com
	 * 
	 */
	private int numberOfDisplayedPosts = 0;

	/**
	 * WRITEME twheys@gmail.com
	 * 
	 */
	protected FlexTable threadList;

	/**
	 * WRITEME twheys@gmail.com
	 * 
	 */
	private final UserProfile user;

	/**
	 * <pre>
	 * twheys@gmail.com Jan 20, 2010
	 * </pre>
	 * 
	 * A AdminConsole WRITEME...
	 * 
	 */
	public AdminConsole () {
		user = TootsBook.getUser ();
		if (0 < user.getStaffLevel ()) {
			buildAdminConsole ();
		} else {
			History.newItem ("home");
		}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO addCommentsToPosts WRITEME...
	 * 
	 * @param posts WRITEME
	 */
	private void addCommentsToPosts (final Post [] posts) {
		for (final Post post : posts)
			if (null != post.getParent ()) {
				((PostPanel) post.getParent ().getContainingPanel ())
						.addComment (post);
			}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO addMorePostsLink WRITEME...
	 * 
	 */
	private void addMorePostsLink () {
		final Anchor getMorePostsLink = new Anchor (
				DisplayText.SHOW_MORE_POSTS, "javascript:;");
		getMorePostsLink.setStyleName ("primary-text");
		getMorePostsLink.addClickHandler (new ClickHandler () {
			@Override
			public void onClick (final ClickEvent event) {
				getMostPosts ();
				// final EffectOption [] opts = new EffectOption [] {
				// new EffectOption (
				// "onCompletion", new Callback () {
				//
				// @Override
				// public void execute () {
				// threadList.remove (getMorePostsLink);
				// }
				// }) };
				// Effect.puff (getMorePostsLink, opts);
			}
		});
		threadList.setWidget (threadList.getRowCount (), 0,
				getMorePostsLink);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO addPostsToWall WRITEME...
	 * 
	 * @param posts WRITEME
	 */
	private void addPostsToWall (final Post [] posts) {
		numberOfDisplayedPosts += posts.length - 1;
		for (final Post post : posts) {
			if (null == post.getParent ()) {
				final PostPanel postPanel = new PostPanel (post);
				postPanel.setStyleName ("wall-post");
				threadList.setWidget (threadList.getRowCount (), 0,
						postPanel);
			}
		}
		// If there might be more posts add a link to retrieve them.
		if (posts.length >= 100) {
			addMorePostsLink ();
		}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 20, 2010
	 * </pre>
	 * 
	 * TO buildAdminConsole WRITEME...
	 * 
	 */
	private void buildAdminConsole () {
		TootsBook.loadBoxStylesStyleSheet (user.getBoxStyleURL ());
		TootsBook.loadPageBGStyleSheet (user.getPageStyleURL ());
		TootsBook.loadTitleBGStyleSheet (user.getTitleStyleURL ());

		threadList = new FlexTable ();

		final Box threadListBox = new Box (threadList, "Recent threads");
		threadListBox.setWidth ("850px");
		threadListBox.pack ();
		add (threadListBox);

		getPostsFromServer ();
		TootsBook.hideLoadingBar ();
	}

	/**
	 * 
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO getMostPosts WRITEME...
	 * 
	 */
	protected void getMostPosts () {
		final BookServiceAsync service = TootsBook.initService ();

		final AsyncCallback <Post []> callback = new AsyncCallback <Post []> () {
			@Override
			public void onFailure (final Throwable caught) {
				TootsBook.showPopup (new ErrorMessage (ProfilePage
						.getUser ().getUserName ()
						+ " does not have any more posts to view!"));
			}

			@Override
			public void onSuccess (final Post [] result) {
				if (0 == result.length) {
					TootsBook
							.showPopup (new ErrorMessage (
									ProfilePage.getUser ()
											.getUserName ()
											+ " does not have any more posts to view!"));
				} else {
					AdminConsole.this.loadPosts (result);
				}
			}
		};

		service.getAdminConsolePosts (numberOfDisplayedPosts, callback);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 15, 2010
	 * </pre>
	 * 
	 * TO getPostsFromServer WRITEME...
	 * 
	 */
	private void getPostsFromServer () {
		final BookServiceAsync service = TootsBook.initService ();

		// Set up the callback object.
		final AsyncCallback <Post []> callback = new AsyncCallback <Post []> () {
			@Override
			public void onFailure (final Throwable caught) {
				TootsBook.showPopup (new ErrorMessage (caught
						.getMessage ()));
			}

			@Override
			public void onSuccess (final Post [] result) {
				AdminConsole.this.loadPosts (result);
			}
		};

		// Make the call to the search service.
		service.getAdminConsolePosts (0, callback);
		TootsBook.displayLoadingBar ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO loadPosts WRITEME...
	 * 
	 * @param posts WRITEME
	 */
	protected void loadPosts (final Post [] posts) {
		if (0 == posts.length) {
			showNoCommentsToDisplayMessage ();
			return;
		}
		loadingPostsMessage.removeFromParent ();
		addPostsToWall (posts);
		addCommentsToPosts (posts);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO showNoCommentsToDisplayMessage WRITEME...
	 * 
	 */
	private void showNoCommentsToDisplayMessage () {
		loadingPostsMessage.setText ("No posts.");
	}
}
