/**
 * THE StoreItemPreviewPopup.java WRITEME...
 */
package com.tootsville.tootsbook.client.panel;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.tootsville.tootsbook.client.BookServiceAsync;
import com.tootsville.tootsbook.client.TootsBook;
import com.tootsville.tootsbook.client.exception.SessionTimedOutException;
import com.tootsville.tootsbook.client.exception.TootBookException;
import com.tootsville.tootsbook.client.util.StoreItem;

/**
 * WRITEME: Document this type. twheys@gmail.com Feb 25, 2010
 * 
 * @author <a href="mailto:twheys@gmail.com@resinteractive.com">Tim
 *         Heys</a>
 */
public final class StoreItemPreviewPopup extends PopupPanel {

	/** WRITEME twheys@gmail.com */
	private Label errorMessage;

	/** the UI component to display the contents in */
	private Box previewBox;

	/** the Item being previewed */
	private final StoreItem storeItem;
	
	/**
	 * <pre>
	 * twheys@gmail.com Feb 26, 2010
	 * </pre>
	 * 
	 * A StoreItemPreviewPopup WRITEME...
	 * 
	 * @param item WRITEME
	 */
	public StoreItemPreviewPopup (final StoreItem item) {
		super (true, true);
		storeItem = item;
		buildPanel ();
		previewBox.addStyleName ("store-preview-box");
		setWidget (previewBox);
	}
	
	/**
	 * <pre>
	 * twheys@gmail.com Feb 26, 2010
	 * </pre>
	 * 
	 * TO buildPanel WRITEME...
	 */
	private void buildPanel () {
		final VerticalPanel panelContents = new VerticalPanel ();
		panelContents.addStyleName ("item-preview-popup");
		previewBox = new Box (panelContents, getStoreItem().getItemName (),
				"You have " + TootsBook.getUser ().getPeanuts ()
						+ " peanuts.", "javascript:;");

		final Image itemImage = new Image (getStoreItem().getItemURL ());
		final Label itemPrice = new Label (""
				+ getStoreItem().getItemPrice ());
		errorMessage = new Label ("");
		itemPrice.addStyleName ("primary-text");
		errorMessage.addStyleName ("err");
		panelContents
				.setHorizontalAlignment (HasHorizontalAlignment.ALIGN_CENTER);
		panelContents.add (errorMessage);
		panelContents.add (itemImage);
		panelContents.add (itemPrice);
		panelContents.add (getSubmitButtons ());
		previewBox.pack ();
	}

	/**
	 * @return the storeItem
	 */
	public StoreItem getStoreItem () {
		return storeItem; /* TODO brpocock@star-hope.org */
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 26, 2010
	 * </pre>
	 *
	 * TO getSubmitButtons WRITEME...
	 *
	 * @return WRITEME
	 */
	private Panel getSubmitButtons () {
		final HorizontalPanel buttonBar = new HorizontalPanel ();
		final Button buyButton = new Button ("", new ClickHandler () {
			@Override
			public void onClick (final ClickEvent event) {
				purchaseThisItem ();
			}
		});
		final Button cancelButton = new Button ("",
				new ClickHandler () {
					@Override
					public void onClick (final ClickEvent event) {
						StoreItemPreviewPopup.this.hide ();
					}
				});
		buyButton.setStyleName ("store-button-small");
		buyButton.getElement ().setId ("buy-button-store");
		cancelButton.setStyleName ("store-button-small");
		cancelButton.getElement ().setId ("cancel-button-store");
		buttonBar.setSpacing (5);
		buttonBar.add (cancelButton);
		buttonBar.add (buyButton);
		return buttonBar;
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 26, 2010
	 * </pre>
	 *
	 * TO purchaseThisItem WRITEME...
	 */
	void purchaseThisItem () {
		final BookServiceAsync service = TootsBook.initService ();
		final AsyncCallback <Void> callback = new AsyncCallback <Void> () {
			/**
			 * @see com.google.gwt.user.client.rpc.AsyncCallback#onFailure(java.lang.Throwable)
			 */
			@Override
			public void onFailure (final Throwable caught) {
				if (caught instanceof SessionTimedOutException
						|| ! (caught instanceof TootBookException)) {
					StoreItemPreviewPopup.this.hide ();
					TootsBook.showError (caught);
					return;
				}
				StoreItemPreviewPopup.this.showError (caught
						.getMessage ());
			}

			@Override
			public void onSuccess (final Void result) {
				TootsBook.updatePeanuts ();
				StoreItemPreviewPopup.this.hide ();
				TootsBook.showPopup (new ErrorMessage ("Success!",
						"You have bought " + getStoreItem().getItemName ()
								+ "!"));
			}
		};
		service.purchaseItem (getStoreItem().getItemIDAsInt (), callback);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 26, 2010
	 * </pre>
	 *
	 * TO showError WRITEME...
	 *
	 * @param message WRITEME
	 */
	void showError (final String message) {
		if (null == message || "".equals (message)) {
			Window.alert ("Message is " + message);
			return;
		}
		errorMessage.setText (message);
		center ();
	}
}
