package authoritymanager.client;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import org.apache.xalan.transformer.KeyIterator;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
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.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;

public class ManagePage extends Page {
	private ManageTypePage currentPage ;
	private HashMap<String, ManageTypePage> pages ;
	private Panel pnlDisplay ;
	
	public ManagePage(AuthorityManagerView view) {
		super(view) ;
		this.pnlDisplay = new VerticalPanel() ;
		add(pnlDisplay) ;
		
		pages = new HashMap<String, ManageTypePage>();
		String[] itemType = ClientConfiguration.getItemTypes();
		for (int iItemType = 0; iItemType < itemType.length; iItemType++) {
			String pageType = itemType [iItemType] ;
			pages.put(pageType, new ManageTypePage(view, pageType));
		}
		currentPage = null ;
	}

	private Panel makeManageTypePage(String itemType) {
		/*
		final VerticalPanel pnlMain = new VerticalPanel() ;
		
		FlexTable tblDisplay = new FlexTable() ;
		tblDisplay.setCellPadding(4);
		tblDisplay.setBorderWidth(1);
		tblDisplay.getColumnFormatter().addStyleName(0, "watchListHeader");
		tblDisplay.addStyleName("watchList");
		tblDisplay.setPixelSize(700, 600) ;
		
		DataSerial first = data.first;
		DataSerial second = data.second;
		Set<String> firstKeys = first.fields.keySet();
		Set<String> secondKeys = second.fields.keySet();
		int idRow = 0;
		for (Iterator<String> it = firstKeys.iterator(); it.hasNext();) {
			String key = it.next();
			tblDisplay.setText(idRow, 0, key);
			tblDisplay.setText(idRow, 1, first.fields.get(key));
			idRow++;
		}
		Label lblDetails = new Label("Compare Details") ;
		lblDetails.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
			}
		}) ;
		tblDisplay.setWidget(idRow / 2, 2, lblDetails);
		idRow = 0;
		for (Iterator<String> it = secondKeys.iterator(); it.hasNext();) {
			String key = it.next();
			tblDisplay.setText(idRow, 3, second.fields.get(key));
			idRow++;
		}
		;
		tblDisplay.setText(idRow, 0, "Likelihood");
		tblDisplay.setText(idRow, 1, "" + (Math.floor(100 * data.distance))
				/ 100);
		idRow++;
		Button btnDifferent = new Button("Not same", new ClickHandler() {
			public void onClick(ClickEvent event) {
				AsyncCallback<Void> callback = new AsyncCallback<Void>() {
					public void onFailure(Throwable caught) {
					}
					public void onSuccess(Void result) {
						PopupPanel popDifferent = new PopupPanel(true) ;
						popDifferent.center() ;
						Label lblResult = new Label("Marked different successfully!") ;
						
					}
				} ;
				greetingService.setDifferent(data, callback) ;
			}
		}) ;
		Button btnMerge = new Button("Merge", new ClickHandler() {
			public void onClick(ClickEvent event) {
				final DialogBox dlgMerge = new DialogBox() ;
				dlgMerge.setPixelSize(400, 200) ;
				dlgMerge.center() ;
				dlgMerge.setText("Merge records") ;
				VerticalPanel pnlMerge = new VerticalPanel() ;
				pnlMerge.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER) ;
				Button btnCloseMerge = new Button("Close", new ClickHandler() {					
					public void onClick(ClickEvent event) {
						dlgMerge.hide() ;
						manageNextPair(itemType) ;
					}
				}) ;
				pnlMerge.add(btnCloseMerge) ;
				dlgMerge.add(pnlMerge) ;
				dlgMerge.show() ;
				//greetingService.markEqual(data) ;
			}
		}) ;
		int iCol = tblDisplay.getCellCount(idRow - 1) ;
		
		tblDisplay.setWidget(idRow, iCol / 2, btnDifferent) ;
		tblDisplay.getCellFormatter().setHorizontalAlignment(idRow, iCol / 2, HasHorizontalAlignment.ALIGN_CENTER) ;
		tblDisplay.setWidget(idRow, iCol / 2 + 1, btnMerge) ;
		tblDisplay.getCellFormatter().setHorizontalAlignment(idRow, iCol / 2 + 1, HasHorizontalAlignment.ALIGN_CENTER) ;
		
		Button btnPrevious = new Button("&#171;", new ClickHandler() {
			public void onClick(ClickEvent event) {
				managePrevPair(itemType) ;
			}
		});
		Button btnNext = new Button("&#187;", new ClickHandler() {
			public void onClick(ClickEvent event) {
				manageNextPair(itemType) ;
			}
		});
		idRow = tblDisplay.getRowCount() ;		
		tblDisplay.setWidget(idRow, 0, btnPrevious) ;
		tblDisplay.getCellFormatter().setHorizontalAlignment(idRow, 0, HasHorizontalAlignment.ALIGN_LEFT) ;
		tblDisplay.setWidget(idRow, tblDisplay.getCellCount(idRow - 1), btnNext) ;
		tblDisplay.getCellFormatter().setHorizontalAlignment(idRow, tblDisplay.getCellCount(idRow - 1), HasHorizontalAlignment.ALIGN_RIGHT) ;
		return null;
		*/
		return null ;
	}

	public void setType(String pageType) {
		currentPage = pages.get(pageType) ;
		if (currentPage == null) {
			return ;
		}
		currentPage.init();
		pnlDisplay.clear() ;
		pnlDisplay.add(currentPage) ;
	}
	
	/*
	public void manageNextPair(final String itemType) {
		AsyncCallback<DataPair> callback = new AsyncCallback<DataPair>() {
			public void onFailure(Throwable caught) {
			}

			public void onSuccess(DataPair result) {
				updateTable(itemType, result);
			}
		};
		view.getController().nextPair(itemType, callback);
	}
	
	public void managePrevPair(final String itemType) {
		AsyncCallback<DataPair> callback = new AsyncCallback<DataPair>() {
			public void onFailure(Throwable caught) {
			}

			public void onSuccess(DataPair result) {
				updateTable(itemType, result);
			}
		};
		view.getController().prevPair(itemType, callback);
	}
	
	protected void cmdManageType(final String itemType) {
		AsyncCallback<DataPair> callback = new AsyncCallback<DataPair>() {
			public void onFailure(Throwable caught) {
			}

			public void onSuccess(DataPair result) {
				updateTable(itemType, result);
			}
		};
		view.getController().nextPair(itemType, callback);
	}
	
	
	private void updateTable(final String itemType, final DataPair data) {
		tblDisplay.clear();
		if (data == null) {
			return ;
		}
		tblDisplay.setCellPadding(4);
		tblDisplay.setBorderWidth(1);
		tblDisplay.getColumnFormatter().addStyleName(0, "watchListHeader");
		tblDisplay.addStyleName("watchList");
		tblDisplay.setPixelSize(700, 600) ;
		for (int iRow = 0; iRow < tblDisplay.getRowCount(); iRow++) {
			tblDisplay.removeRow(iRow);
		}
		DataSerial first = data.first;
		DataSerial second = data.second;
		Collection<String> firstKeys = first.keySet();
		Collection<String> secondKeys = second.keySet();
		int idRow = 0;
		for (Iterator<String> it = firstKeys.iterator(); it.hasNext();) {
			String key = it.next();
			tblDisplay.setText(idRow, 0, key);
			tblDisplay.setText(idRow, 1, (String) first.get(key).iterator().next());
			idRow++;
		}
		Label lblDetails = new Label("Compare Details") ;
		lblDetails.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
			}
		}) ;
		tblDisplay.setWidget(idRow / 2, 2, lblDetails);
		idRow = 0;
		for (Iterator<String> it = secondKeys.iterator(); it.hasNext();) {
			String key = it.next();
			tblDisplay.setText(idRow, 3, (String) second.get(key).iterator().next());
			idRow++;
		}
		;
		tblDisplay.setText(idRow, 0, "Likelihood");
		tblDisplay.setText(idRow, 1, "" + (Math.floor(100 * data.distance))
				/ 100);
		idRow++;
		Button btnDifferent = new Button("Not same", new ClickHandler() {
			public void onClick(ClickEvent event) {
				AsyncCallback<Void> callback = new AsyncCallback<Void>() {
					public void onFailure(Throwable caught) {
					}
					public void onSuccess(Void result) {
						PopupPanel popDifferent = new PopupPanel(true) ;
						popDifferent.center() ;
						Label lblResult = new Label("Marked different successfully!") ;						
					}
				} ;
				view.getController().setDifferent(data, callback) ;
			}
		}) ;
		Button btnMerge = new Button("Merge", new ClickHandler() {
			public void onClick(ClickEvent event) {
				final DialogBox dlgMerge = new DialogBox() ;
				dlgMerge.setPixelSize(400, 200) ;
				dlgMerge.center() ;
				dlgMerge.setText("Merge records") ;
				VerticalPanel pnlMerge = new VerticalPanel() ;
				pnlMerge.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER) ;
				Button btnCloseMerge = new Button("Close", new ClickHandler() {					
					public void onClick(ClickEvent event) {
						dlgMerge.hide() ;
						manageNextPair(itemType) ;
					}
				}) ;
				pnlMerge.add(btnCloseMerge) ;
				dlgMerge.add(pnlMerge) ;
				dlgMerge.show() ;
				//greetingService.markEqual(data) ;
			}
		}) ;
		int iCol = tblDisplay.getCellCount(idRow - 1) ;
		
		tblDisplay.setWidget(idRow, iCol / 2, btnDifferent) ;
		tblDisplay.getCellFormatter().setHorizontalAlignment(idRow, iCol / 2, HasHorizontalAlignment.ALIGN_CENTER) ;
		tblDisplay.setWidget(idRow, iCol / 2 + 1, btnMerge) ;
		tblDisplay.getCellFormatter().setHorizontalAlignment(idRow, iCol / 2 + 1, HasHorizontalAlignment.ALIGN_CENTER) ;
		
		Button btnPrevious = new Button("&#171;", new ClickHandler() {
			public void onClick(ClickEvent event) {
				managePrevPair(itemType) ;
			}
		});
		Button btnNext = new Button("&#187;", new ClickHandler() {
			public void onClick(ClickEvent event) {
				manageNextPair(itemType) ;
			}
		});
		idRow = tblDisplay.getRowCount() ;		
		tblDisplay.setWidget(idRow, 0, btnPrevious) ;
		tblDisplay.getCellFormatter().setHorizontalAlignment(idRow, 0, HasHorizontalAlignment.ALIGN_LEFT) ;
		tblDisplay.setWidget(idRow, tblDisplay.getCellCount(idRow - 1), btnNext) ;
		tblDisplay.getCellFormatter().setHorizontalAlignment(idRow, tblDisplay.getCellCount(idRow - 1), HasHorizontalAlignment.ALIGN_RIGHT) ;
		
	}
	*/

}
