package authoritymanager.client;

import java.util.Iterator;
import java.util.Set;
import java.util.Vector;

import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
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.ListBox;
import com.google.gwt.user.client.ui.TabPanel;
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 SearchPage extends Page {
	private AuthorityManagerView view ;
	
	
	public SearchPage(AuthorityManagerView _view) {
		super(_view) ;
		this.view = _view ;
		
		final TabPanel tabSearchType = new TabPanel() ;
		tabSearchType.setAnimationEnabled(true) ;
		tabSearchType.setPixelSize(600, 600) ;
		
		final String [] itemTypes = ClientConfiguration.getItemTypes() ;		
		for (int iItemType = 0; iItemType < itemTypes.length; iItemType ++) {
			final FlexTable tblSearch = new FlexTable() ;
			String [] [] fieldSearch = ClientConfiguration.getSearchView(itemTypes [iItemType]) ;
			for (int iFieldSearch = 1 ; iFieldSearch < fieldSearch.length ; iFieldSearch ++) {
				String [] conf = fieldSearch [iFieldSearch] ;
				Utilities.setWidget(conf, tblSearch) ;
			}
			Button btnSearch = new Button("Search", new ClickHandler() {
				public void onClick(ClickEvent event) {
					AsyncCallback<SearchResults> callback = new AsyncCallback<SearchResults>() {
						public void onFailure(Throwable caught) {
							System.out.println(caught);
							System.out.println("Failure");
						}

						public void onSuccess(final SearchResults results) {
							view.showSearchResultsPage(results) ; 
						}						
					};
					// query = type DELIM name SMALL_DELIM value DELIM ...
					String query = itemTypes [tabSearchType.getWidgetIndex(tblSearch)] + Utilities.DELIMITER ;
					SearchQuery searchQuery = new SearchQuery(itemTypes [tabSearchType.getWidgetIndex(tblSearch)]) ;
					for (int iRow = 0 ; iRow < tblSearch.getRowCount() ; iRow ++) {
						for (int iCol = 0 ; iCol < tblSearch.getCellCount(iRow) ; iCol ++) {
							Widget widget = tblSearch.getWidget(iRow, iCol) ;
							if (widget instanceof QueryWidget) {
								QueryWidget queryWidget = (QueryWidget) widget ;
								if (queryWidget != null && !queryWidget.getName().equals("$")) {								
									String path = queryWidget.getPath() ;
									if (path.equals(Query.RELATIONSHIP)) {
										searchQuery.addFieldRelation(queryWidget.getName(), queryWidget.getValue()) ;
									}
									else {
										searchQuery.addFieldPath(queryWidget.getName(), path) ;
										searchQuery.addFieldValue(queryWidget.getName(), queryWidget.getValue()) ;
									}
								}
							}
							
						}
					}
					searchQuery.setResultFields(ClientConfiguration.getSearchResults(searchQuery.getType()));		
					view.getController().search(searchQuery, callback);
				}
			}) ;
			int iRow = tblSearch.getRowCount() ;
			int iCol = tblSearch.getCellCount(iRow - 1) / 2 ;			
			tblSearch.setWidget(iRow, iCol, btnSearch) ;
			tabSearchType.add(tblSearch, itemTypes [iItemType]) ;
			
		}
		tabSearchType.selectTab(0) ;
		
		add(tabSearchType) ;
	}
}
