/**
 * 
 */

import java.util.Date;
import java.util.LinkedHashMap;

...

import com.google.gwt.user.client.ui.Widget;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.DateItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.toolbar.ToolStrip;
import com.smartgwt.client.widgets.toolbar.ToolStripButton;

/**
 * @author rlagoue
 * 
 */
@SuppressWarnings("unchecked")
public class PurchaseFormPanel extends VLayout implements
		PurchaseFormPresenter.PurchaseFormDisplay {
	PurchaseFormPresenter presenter;

	DynamicForm generalInfosForm = new DynamicForm();
	PurchaseItemPanel purchaseItemPanel = new PurchaseItemPanel();

	DateItem transactionDateItem;
	SuggestBoxItem supplierItem;

	ToolStrip toolStrip = new ToolStrip();
	ToolStripButton addPurchaseItemFormButton;
	private SelectItem purchaseItemSelectItem;
	private LinkedHashMap<String, String> purchaseItemSelectItemvalueMap = new LinkedHashMap<String, String>();

	private ToolStripButton removePurchaseItemFormButton;

	public PurchaseFormPanel() {
		super();
		setWidth100();
		PurchaseConstants purchaseConstants = PurchaseConstants.Util
				.getInstance();
		GlobalResources globalResources = GlobalResources.Util.getInstance();

		initGeneralInfosForm(purchaseConstants);
		addMember(generalInfosForm);

		initToolStrip(purchaseConstants, globalResources);
		addMember(toolStrip);
		addMember(purchaseItemPanel);

		initHandlers();
	}

	private void initToolStrip(PurchaseConstants purchaseConstants,
			GlobalResources globalResources) {
		toolStrip.setAlign(Alignment.RIGHT);
		initToolStripButtons(purchaseConstants, globalResources);
		initPurchaseItemSelectItem(purchaseConstants, globalResources);
		purchaseItemPanel.purchaseItemForm
				.setItemValueChangedHandler(new UiCallback<String>() {

					@Override
					public void execute(String... data) {
						purchaseItemSelectItemvalueMap.put(
								purchaseItemSelectItem.getValue().toString(),
								data[0]);
						resetValueMap();
					}
				});
	}

	private void resetValueMap() {
		purchaseItemSelectItem.setValueMap(purchaseItemSelectItemvalueMap);
	}

	private void initPurchaseItemSelectItem(
			PurchaseConstants purchaseConstants, GlobalResources globalResources) {
		purchaseItemSelectItem = new SelectItem();
		purchaseItemSelectItem.setShowTitle(false);
		purchaseItemSelectItem.setWidth(120);
		purchaseItemSelectItem.setValueMap(purchaseItemSelectItemvalueMap);
		toolStrip.addFormItem(purchaseItemSelectItem);
	}

	private void initHandlers() {
		addPurchaseItemFormButton.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				presenter.addPurchaseItemActionTriggered();
			}
		});

		removePurchaseItemFormButton.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				presenter.removePurchaseItemActionTriggered();
			}
		});

		purchaseItemSelectItem.addChangedHandler(new ChangedHandler() {

			@Override
			public void onChanged(ChangedEvent event) {
				presenter.selectedPurchaseItemChanged();
			}
		});
	}

	private void initToolStripButtons(PurchaseConstants purchaseConstants,
			GlobalResources globalResources) {
		toolStrip.setWidth100();

		addPurchaseItemFormButton = new ToolStripButton();
		addPurchaseItemFormButton.setIcon(globalResources.add_16().getURL());
		addPurchaseItemFormButton.setTooltip(purchaseConstants
				.addPurchaseItemTTP());
		toolStrip.addButton(addPurchaseItemFormButton);

		removePurchaseItemFormButton = new ToolStripButton();
		removePurchaseItemFormButton.setIcon(globalResources.delete_16()
				.getURL());
		removePurchaseItemFormButton.setTooltip(purchaseConstants
				.deletePurchaseItemTTP());
		toolStrip.addButton(removePurchaseItemFormButton);
	}

	private void initGeneralInfosForm(PurchaseConstants purchaseConstants) {
		generalInfosForm.setNumCols(4);
		transactionDateItem = new DateItem("transactionDateItem",
				purchaseConstants.purchaseTransactionDate());
		transactionDateItem.setEnforceDate(true);
		transactionDateItem
				.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);

		supplierItem = new SuggestBoxItem("supplierItem", purchaseConstants
				.supplierName(), SupplierDataSource.FIELD_SUPPLIER_NAME,
				SupplierDataSource.FIELD_ID, SupplierDataSource.getInstance()
						.getSupplierSuggestBoxURL(), generalInfosForm.getID());
		generalInfosForm.setFields(transactionDateItem, supplierItem);
	}

	@Override
	public Widget asWidget() {
		return this;
	}

	@Override
	public void addPurchaseItem(GwtUiPurchaseItem purchaseItem) {
		updatePurchaseItemSelectItem(purchaseItem);
		purchaseItemSelectItem.setValue(purchaseItem.getProvisoryId()
				.toString());
		purchaseItemPanel.purchaseItemForm.setPurchaseItem(purchaseItem);
	}

	private void updatePurchaseItemSelectItem(GwtUiPurchaseItem purchaseItem) {
		purchaseItemSelectItemvalueMap.put(purchaseItem.getProvisoryId()
				.toString(), purchaseItem.getItemName());
		resetValueMap();
		// purchaseItemSelectItem.redraw();
	}

	@Override
	public void removePurchaseItemAt(int index) {
		PurchaseItemPanel purchaseItemFormToRemove = (PurchaseItemPanel) getMember(index);
	}

	private class PurchaseItemPanel extends HLayout {

		PurchaseItemForm purchaseItemForm;
		Button applyButton;

		public PurchaseItemPanel() {
			this(false);
		}

		public PurchaseItemPanel(boolean showApplyButton) {
			purchaseItemForm = new PurchaseItemForm(false);
			applyButton = new Button(GlobalConstants.Util.getInstance().apply());

			addMember(purchaseItemForm);
			if (showApplyButton) {
				addMember(applyButton);
			}

			applyButton.addClickHandler(new ClickHandler() {

				@Override
				public void onClick(ClickEvent event) {
					int indexOfthisPanelInPurchaseItemPanel = PurchaseFormPanel.this
							.getMemberNumber(PurchaseItemPanel.this);
					presenter
							.removePurchaseItemForm(indexOfthisPanelInPurchaseItemPanel);
				}
			});
		}

	}

	public void setPresenter(Presenter presenter) {
		this.presenter = (PurchaseFormPresenter) presenter;
	}

	@Override
	public void copyDataToPurchase() {
		purchaseItemPanel.purchaseItemForm.copyValuesToPurchaseItem();
		presenter.getPurchase().setTransactionDate(
				(Date) transactionDateItem.getValue());
		presenter.getPurchase().setSupplierId(supplierItem.getValueAsLong());
	}

	@Override
	public void showPurchaseItem(UiPurchaseItem uiPurchaseItem) {
		// TODO Auto-generated method stub

	}

	@Override
	public void copyCurrentPurchaseItemDataToModel() {
		purchaseItemPanel.purchaseItemForm.copyValuesToPurchaseItem();
	}

}
