package authoritymanager.client;

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.FlexTable;
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 ServerStatusPage extends Page {
	private Panel pnlDisplay ;
	private FlexTable tblStatus ;
	
	public ServerStatusPage(AuthorityManagerView _view) {
		super(_view) ;
		
		pnlDisplay = new VerticalPanel() ;
		add(pnlDisplay) ;
		
		tblStatus = new FlexTable() ;
		pnlDisplay.add(tblStatus) ;
		AsyncCallback<String> callback = new AsyncCallback<String>() {
			@Override
			public void onFailure(Throwable caught) {
				
			}
			@Override
			public void onSuccess(String configuration) {
				String [] st = configuration.split("\n") ;
				for (String curConf : st) {
					String [] fields = curConf.split("\t") ;
					final String authType = fields [0] ;
					final boolean isLoaded = fields [1].equals("true") ;
					boolean isChanged = fields [2].equals("true") ;
					boolean duplicatesLoaded = fields [3].equals("true") ;
					int iRow = tblStatus.getRowCount() ;
					tblStatus.setText(iRow, 0, authType) ;
					Button btnLoadAuthority = new Button("Load authority", new ClickHandler() {
						boolean _isLoaded = isLoaded ;
						public void onClick(ClickEvent event) {
							final Button button = (Button) event.getSource() ;
							if (!_isLoaded) {
								AsyncCallback<Void> callback = new AsyncCallback<Void>() {
									@Override
									public void onFailure(Throwable caught) {
										
									}
									@Override
									public void onSuccess(Void result) {
										button.setText("Loaded.") ;
										button.setEnabled(false) ;
										_isLoaded = true ;
									}
								} ;
								button.setText("Loading...") ;
								view.getController().loadAuthority(authType, callback) ;
							}
						}
					}) ;
					if (isLoaded) {
						btnLoadAuthority.setText("Loaded.") ;
						btnLoadAuthority.setEnabled(false) ;
					}
					tblStatus.setWidget(iRow, 1, btnLoadAuthority) ;
					Button btnLoadDuplicates = new Button("Load duplicates", new ClickHandler() {
						boolean isLoaded = false ;
						public void onClick(ClickEvent event) {
							final Button button = (Button) event.getSource() ;
							if (!isLoaded) {
								AsyncCallback<Void> callback = new AsyncCallback<Void>() {
									@Override
									public void onFailure(Throwable caught) {
										
									}
									@Override
									public void onSuccess(Void result) {
										button.setText("Load duplicates") ;
										//button.setEnabled(false) ;
									}
								} ;
								button.setText("Loading...") ;
								view.getController().loadDuplicates(authType, callback) ;
							}
						}
					}) ;
					tblStatus.setWidget(iRow, 2, btnLoadDuplicates) ;
					Button btnCreateDuplicates = new Button("Create duplicates", new ClickHandler() {
						boolean isLoaded = false ;
						public void onClick(ClickEvent event) {
							final Button button = (Button) event.getSource() ;
							if (!isLoaded) {
								AsyncCallback<Void> callback = new AsyncCallback<Void>() {
									@Override
									public void onFailure(Throwable caught) {
										
									}
									@Override
									public void onSuccess(Void result) {
										button.setText("Create duplicates") ;
										//button.setEnabled(false) ;
									}
								} ;
								button.setText("Creating...") ;
								view.getController().createDuplicates(authType, callback) ;
							}
						}
					}) ;
					tblStatus.setWidget(iRow, 3, btnCreateDuplicates) ;
					Button btnDumpAuthority = new Button("Dump authority", new ClickHandler() {
						boolean isLoaded = false ;
						public void onClick(ClickEvent event) {
							final Button button = (Button) event.getSource() ;
							if (!isLoaded) {
								AsyncCallback<Void> callback = new AsyncCallback<Void>() {
									@Override
									public void onFailure(Throwable caught) {
										
									}
									@Override
									public void onSuccess(Void result) {
										PopupPanel popUp = new PopupPanel(true) ;
										Label lblOK = new Label("Authority " + authType + " dumped successfully") ;
										popUp.add(lblOK) ;
										popUp.center() ;
										button.setText("Dump authority") ;
									}
								} ;
								button.setText("Dumping...") ;
								view.getController().dumpAuthority(authType, callback) ;
							}
						}
					}) ;
					tblStatus.setWidget(iRow, 4, btnDumpAuthority) ;
				}
			}
		} ;
		view.getController().getServerConfiguration(callback) ;
	}
}
