package org.vaadin.spring.sample.security.ui.signin;

import org.vaadin.spring.UIScope;
import org.vaadin.spring.VaadinComponent;
import org.vaadin.spring.mvp.view.AbstractMvpView;
import org.vaadin.spring.sample.security.ui.signin.SignInPresenter.SignInView;

import com.vaadin.server.FontAwesome;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Label;
import com.vaadin.ui.PasswordField;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.themes.ValoTheme;

@UIScope
@VaadinComponent
@SuppressWarnings("serial")
public class SignInViewImpl extends AbstractMvpView implements SignInView, ClickListener {

	private SignInPresenterHandlers mvpPresenterHandlers;
	
	private VerticalLayout layout;
	private Label caption;	
	private TextField username;
	private PasswordField password;
	private CheckBox rememberMe;
	private Button btnLogin;	
	private VerticalLayout loginPanel;
	private Label errorMessage;
	
	@Override
	public void postConstruct() {	
		super.postConstruct();		
		setSizeFull();
		layout = new VerticalLayout();
		layout.setSizeFull();
		layout.setSpacing(true);
		setCompositionRoot(layout);
		
		caption = new Label("Sign in to Vaadin4Spring Security Demo");
		caption.addStyleName(ValoTheme.LABEL_H2);
		caption.setSizeUndefined();		
		layout.addComponent(caption);
		layout.setComponentAlignment(caption, Alignment.MIDDLE_CENTER);
		
		loginPanel = new VerticalLayout();
		loginPanel.setSizeUndefined();
		loginPanel.setSpacing(true);
		loginPanel.setMargin(true);
		layout.addComponent(loginPanel);
		layout.setComponentAlignment(loginPanel, Alignment.MIDDLE_CENTER);
		layout.setExpandRatio(loginPanel, 1);
		
		errorMessage = new Label();
		errorMessage.setWidth("300px");
		errorMessage.addStyleName(ValoTheme.LABEL_FAILURE);		
		errorMessage.setVisible(false);
		loginPanel.addComponent(errorMessage);
		
		username = new TextField("Username");
		username.setImmediate(true);
		username.setWidth("300px");
		username.setNullRepresentation("");
		username.setInputPrompt("Enter your username");
		loginPanel.addComponent(username);
		
		password = new PasswordField("Password");
		password.setImmediate(true);
		password.setWidth("300px");
		password.setNullRepresentation("");
		loginPanel.addComponent(password);
		
		rememberMe = new CheckBox("Remember me");
		rememberMe.setValue(false);
		rememberMe.addStyleName(ValoTheme.CHECKBOX_LARGE);
		loginPanel.addComponent(rememberMe);
		
		btnLogin = new Button("Signin", FontAwesome.UNLOCK);
		btnLogin.addStyleName(ValoTheme.BUTTON_PRIMARY);
		btnLogin.addClickListener(this);
		btnLogin.setWidth("100%");
		loginPanel.addComponent(btnLogin);							
		
		final Label infoLabel = new Label(FontAwesome.INFO_CIRCLE.getHtml() + " You can sign in as: <br/>\"user\" with password \"user\" <br/>\"admin\" with password \"admin\".", ContentMode.HTML);
		infoLabel.setWidth("300px");
		loginPanel.addComponent(infoLabel);
	}
	
	
	@Override
	public void init() {
		errorMessage.setVisible(false);
		username.setValidationVisible(false);
		password.setValidationVisible(false);
		username.setValue(null);
		password.setValue(null);		
	}


	@Override
	public void buttonClick(ClickEvent event) {
		/*
		 * Signin using username and password
		 */
		if (event.getButton() == btnLogin) {
			
			mvpPresenterHandlers.doSignIn(username.getValue(), password.getValue(), rememberMe.getValue());						
		}				
		
	}


	@Override
	public void setPresenterHandlers(
			SignInPresenterHandlers mvpPresenterHandlers) {
		this.mvpPresenterHandlers = mvpPresenterHandlers;
		
	}


	@Override
	public void setErrorMessage(String error) {
		errorMessage.setValue(error);
		errorMessage.setVisible(true);
		
	}

}