package eu.dnetlib.enabling.ui.common.utils;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.event.dom.client.KeyCodes;

import eu.dnetlib.enabling.ui.common.services.AuthenticationServiceAsync;



public class LoginPage extends GWTPage implements ClickHandler, AsyncCallback<String> {
	TextBox login = new TextBox();
	PasswordTextBox password = new PasswordTextBox();
	Button button = new Button("login");
	HTML response = new HTML();

	/**
	 * authentication service.
	 */
	private AuthenticationServiceAsync authService;

	public LoginPage(AuthenticationServiceAsync authService) {
		super();
		this.authService = authService;

		setSpacing(10);
		setWidth("100%");
		setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		login.setWidth("180px");
		login.setMaxLength(64);
		password.setWidth("180px");
		password.setMaxLength(64);
		login.addKeyPressHandler(new KeyPressHandler() {
			@Override
			public void onKeyPress(KeyPressEvent event) {
				if (event.getCharCode() == KeyCodes.KEY_ENTER) {
					button.click();
				}
			}
		});
		password.addKeyPressHandler(new KeyPressHandler() {
			@Override
			public void onKeyPress(KeyPressEvent event) {
				if (event.getCharCode() == KeyCodes.KEY_ENTER) {
					button.click();
				}
			}
		});

		button.addClickHandler(this);

	}

	@Override
	public void refresh() {
		clear();
		add(new HTML("<p style='font-size:14px'>Access to these pages is restricted to DRIVER administrators.</p>"));
		add(new HTML("<span style='font-size:14px'>Login</span>"));
		add(login);
		add(new HTML("<span style='font-size:14px'>Password</span>"));
		add(password);
		add(button);
		add(response);
	}

	@Override
	public void onClick(ClickEvent event) {
		button.setEnabled(false);
		login.setEnabled(false);
		password.setEnabled(false);
		response.setText("");
		this.authService.authenticate(login.getText(), password.getText(), this);
	}


	@Override
	public void onFailure(Throwable caught) {
		button.setEnabled(true);
		login.setEnabled(true);
		password.setEnabled(true);

		response.setHTML("<span style='font-size:14px'><b>Authentication failed</b></span>");
	}


	@Override
	public void onSuccess(String session) {
		button.setEnabled(true);
		login.setEnabled(true);
		password.setEnabled(true);

		if ((session != null)&&(session.length() > 0)) {
			CookieSession.setCookie(session);

			String historyToken = History.getToken();
			History.newItem(historyToken);
			History.fireCurrentHistoryState();
			clear();
			response.setHTML("<hr /><span style='font-size:22px'><b>Login Successful</b></span><hr />");
			add(response);
		} else {
			response.setHTML("<span style='font-size:14px'><b>Authentication failed</b></span>");
		}
	}


	@Override
	public String getMenuItem() {
		return "Login";
	}

	public AuthenticationServiceAsync getAuthService() {
		return authService;
	}

	public void setAuthService(AuthenticationServiceAsync authService) {
		this.authService = authService;
	}



}
