package authoritymanager.client;

import java.util.HashMap;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class AddRecordPage extends Page {
	private VerticalPanel pnlDisplay;
	private HashMap<String, AddPage> pages;

	public AddRecordPage(AuthorityManagerView view) {
		super(view);

		pnlDisplay = new VerticalPanel();
		add(pnlDisplay);
		pnlDisplay.setPixelSize(620, 400);
		pnlDisplay.setSpacing(2);
		pnlDisplay.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
		pnlDisplay.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP);

		pages = new HashMap<String, AddPage>();
		String[] itemType = ClientConfiguration.getItemTypes();
		for (int iItemType = 0; iItemType < Math.min(1, itemType.length); iItemType++) {
			String [] [] insertView = ClientConfiguration.getInsertView(itemType [iItemType]) ;
			AddPage addPage = new AddPage(view, itemType [iItemType], insertView [0] [1], insertView [1] [0]) ;
			pages.put(addPage.getPageType(), addPage);
		}
	}

	private Panel makeAddRecordPage(String itemType) {
		final VerticalPanel pnlMain = new VerticalPanel();
		Label lblTitle = new Label("Add new " + itemType);
		pnlMain.setCellHorizontalAlignment(lblTitle, HasHorizontalAlignment.ALIGN_CENTER);
		pnlMain.setCellVerticalAlignment(lblTitle, HasVerticalAlignment.ALIGN_MIDDLE);
		pnlMain.setCellHeight(lblTitle, "80px");
		lblTitle.setStyleName("titleAdd");
		pnlMain.add(lblTitle);
		
		//if (1 == 1) return new VerticalPanel() ;
		String[] [] insertView = ClientConfiguration.getInsertView(itemType);
		final String[] fields = insertView == null ? null : insertView [1] ;
		if (fields == null) return null ;
		HorizontalPanel pnlCurrent = null;
		FlexTable tblCurrent = null;
		for (int iField = 1; iField < fields.length; iField++) {
			String[] st = fields[iField].split(":");
			String fieldText = st[0].trim();
			if (fieldText.equals("$")) {
				fieldText = "";
			}
			boolean blockstart = fieldText.equals("block-start");
			boolean blockend = fieldText.equals("block-end");
			boolean newline = st[st.length - 2].trim().equals("newline");
			String dimensions = st[st.length - 1];
			if (newline || pnlCurrent == null)  {
				pnlCurrent = new HorizontalPanel();
				pnlCurrent.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
				pnlCurrent.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
				pnlCurrent.setSpacing(2);
				pnlMain.add(pnlCurrent);
			}

			if (blockstart) {
				tblCurrent = new FlexTable();
				pnlCurrent.add(tblCurrent);
			} else {
				if (blockend) {
					Button btnAdd = new Button("<SMALL>+</SMALL>",
							new ClickHandler() {
								public void onClick(ClickEvent event) {
									FlexTable table = (FlexTable) ((Button) event.getSource()).getParent();
									int iRow = table.getRowCount();
									table.insertRow(iRow - 1);
									for (int iCol = 0; iCol < table.getCellCount(iRow); iCol++) {
										Widget widget = table.getWidget(iRow, iCol);
										if (widget instanceof TextBox) {
											TextBox txtWidget = (TextBox) widget;
											TextBox txtNew = new TextBox();
											txtNew.setName(txtWidget.getName().replace("*", "[" + (iRow - 1) + "]"));
											txtNew.setText(txtWidget.getText());
											txtNew.setEnabled(false);
											txtNew.setPixelSize(txtWidget.getOffsetWidth(), txtWidget.getOffsetHeight());
											txtWidget.setText("");
											table.setWidget(iRow - 1, iCol, txtNew);
										}
										if (widget instanceof ListBox) {
											ListBox lstWidget = (ListBox) widget;
											ListBox lstNew = new ListBox();
											lstNew.setName(lstWidget.getName().replace("*", "[" + (iRow - 1) + "]"));
											lstNew.addItem(lstWidget.getItemText(lstWidget.getSelectedIndex()));
											lstNew.setEnabled(false);
											lstNew.setPixelSize(lstWidget.getOffsetWidth(), lstWidget.getOffsetHeight());
											lstWidget.setSelectedIndex(0);
											table.setWidget(iRow - 1, iCol, lstNew);
										}
									}
									Button btnRemove = new Button("<SMALL>-</SMALL>", new ClickHandler() {
										public void onClick(ClickEvent event) {
											Button button = (Button) event.getSource();
											FlexTable table = (FlexTable) button.getParent();
											for (int iRow = 0; iRow < table.getRowCount(); iRow++) {
												int iCol = table.getCellCount(iRow) - 1;
												if (iCol >= 0) {
													if (table.getWidget(iRow, iCol) == button) {
														table.removeRow(iRow);
														break;
													}
												}
											}
										}
									});
									btnRemove.setPixelSize(20, 20);
									table.setWidget(iRow - 1, table.getCellCount(iRow - 1), btnRemove);
								}
							});
					btnAdd.setPixelSize(20, 20);
					// pnlCurrent.add(btnAdd) ;
					int iRow = tblCurrent.getRowCount() - 1;
					int iCol = tblCurrent.getCellCount(iRow);
					tblCurrent.setWidget(iRow, iCol, btnAdd);
					tblCurrent = null;					
				} else {
					String fieldWidget = st[1].trim();
					String fieldName = st[2].trim();
					String[] dims = dimensions.split("x");
					int width = Integer.parseInt(dims[0].trim());
					int height = Integer.parseInt(dims[1].trim());
					Widget widget = null;
					if (fieldWidget.contains("editbox")) {
						widget = new TextBox();
						TextBox txtField = (TextBox) widget;
						txtField.setText(fieldText);
						txtField.setName(fieldName);
					}
					if (fieldWidget.contains("listbox")) {
						widget = new ListBox();
						ListBox lstField = (ListBox) widget;
						lstField.setName(fieldName);
						String[] values = fieldWidget.substring(
								fieldWidget.indexOf('{') + 1,
								fieldWidget.indexOf('}')).split(",");
						for (int iValue = 0; iValue < values.length; iValue++) {
							lstField.addItem(values[iValue].trim());
						}
					}
					if (fieldWidget.contains("label")) {
						widget = new Label(fieldText + ":");						
					}
					if (fieldWidget.contains("button")) {
						widget = new Button(fieldText);
					}
					widget.setPixelSize(width, height);
					if (tblCurrent == null) {
						pnlCurrent.add(widget);						
					} else {
						int iRow = tblCurrent.getRowCount() - 1;
						if (iRow < 0) {
							tblCurrent.setWidget(0, 0, widget);
						} else {
							int iCol = tblCurrent.getCellCount(iRow);
							tblCurrent.setWidget(iRow, iCol, widget);
						}

					}
				}
			}
		}
		Button btnAddRecord = new Button("Add record", new ClickHandler() {
			public void onClick(ClickEvent event) {
				String res = Utilities.getPanelContent(pnlMain);
				DialogBox popRes = new DialogBox(true);
				Label lblRes = new Label(res);
				popRes.add(lblRes);
				popRes.show();
				popRes.center();
			}
		});
		Button btnCancel = new Button("Cancel", new ClickHandler() {
			public void onClick(ClickEvent event) {

			}
		});
		pnlCurrent = new HorizontalPanel();
		pnlCurrent.add(btnAddRecord);
		pnlCurrent.add(btnCancel);
		pnlMain.add(pnlCurrent);
		
		return pnlMain ;
	}

	public void setType(String itemType) {
		Panel panel = pages.get(itemType);
		pnlDisplay.clear();
		pnlDisplay.add(panel);
	}

	protected void cmdAddData(final String choice) {
	}
}
