/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Florian Pirchner <florian.pirchner@gmail.com> - Initial implementation
 */
package org.eclipse.osbp.vaadin.addons.suggesttext.sample;

import javax.servlet.annotation.WebServlet;

import org.eclipse.osbp.vaadin.addons.suggesttext.SuggestTextField;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Slider;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

@SuppressWarnings("serial")
@Theme("valo")
public class SuggestTextUI extends UI {

	@WebServlet(value = "/*", asyncSupported = true)
	@VaadinServletConfiguration(productionMode = false, ui = SuggestTextUI.class, widgetset = "org.eclipse.osbp.vaadin.addons.suggesttext.SuggestTextWidgetset")
	public static class Servlet extends VaadinServlet {
	}

	private GridLayout touchLayout;

	@Override
	protected void init(VaadinRequest request) {

		final HorizontalLayout mainLayout = new HorizontalLayout();
		setContent(mainLayout);

		addForPerson(mainLayout);
		addForPersonForUUIDMapping(mainLayout);
	}

	private void addForPerson(final HorizontalLayout mainLayout) {
		final VerticalLayout layout = new VerticalLayout();
		layout.setMargin(true);
		mainLayout.addComponent(layout);

		// create SuggestTextField
		final SuggestTextField suggestionBox = new SuggestTextField();
		suggestionBox.setId("suggestField1");
		suggestionBox.getTextField().setId("suggestField1_textField");

		// setup text field
		final Slider popupdelay = new Slider("Popup delay");
		popupdelay.setId("delay1");
		popupdelay.setMin(10);
		popupdelay.setMax(1000);
		popupdelay.setValue(500d);
		popupdelay.setResolution(0);
		layout.addComponent(popupdelay);

		popupdelay.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				suggestionBox.setPopupDelay(popupdelay.getValue().intValue());
			}
		});

		// setup text field
		final Slider limit = new Slider("Suggestion Limit");
		limit.setId("limit1");
		limit.setMin(2);
		limit.setMax(30);
		limit.setValue(10d);
		limit.setResolution(0);
		layout.addComponent(limit);

		limit.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				suggestionBox.setLimit(limit.getValue().intValue());
			}
		});

		final CheckBox suggestionEnabled = new CheckBox("suggestion enabled");
		suggestionEnabled.setId("suggestionEnabled1");
		suggestionEnabled.setValue(true);
		layout.addComponent(suggestionEnabled);
		suggestionEnabled.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				suggestionBox.setSuggestionEnabled(suggestionEnabled.getValue());
			}
		});

		final CheckBox autoHide = new CheckBox("auto hide popup");
		autoHide.setId("autoHide1");
		autoHide.setValue(true);
		layout.addComponent(autoHide);
		autoHide.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				suggestionBox.setAutoHide(autoHide.getValue());
				
				touchLayout.setEnabled(!autoHide.getValue());
			}
		});

		touchLayout = new GridLayout(2, 2);
		touchLayout.setEnabled(false);
		touchLayout.setDescription("Set auto hide popup to false");
		layout.addComponent(touchLayout);

		Button openSuggestList = new Button("open list", e -> {
			suggestionBox.openPopup();
		});
		openSuggestList.setWidth("100%");
		touchLayout.addComponent(openSuggestList);

		Button closeSuggestList = new Button("close list", e -> {
			suggestionBox.closePopup();
		});
		closeSuggestList.setWidth("100%");
		touchLayout.addComponent(closeSuggestList);

		Button navUpSuggestList = new Button("nav up", e -> {
			suggestionBox.navigateToPrevious();
		});
		navUpSuggestList.setWidth("100%");
		touchLayout.addComponent(navUpSuggestList);

		Button navDownSuggestList = new Button("nav down", e -> {
			suggestionBox.navigateToNext();
		});
		navDownSuggestList.setWidth("100%");
		touchLayout.addComponent(navDownSuggestList);
		
		Button selectCurrent = new Button("select", e -> {
			suggestionBox.selectCurrent();
		});
		selectCurrent.setWidth("100%");
		touchLayout.addComponent(selectCurrent);

		// configure and add suggestion box
		suggestionBox.setCaption("Select");
		suggestionBox.getTextField().addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(ValueChangeEvent event) {
				System.out.println("Foo");
			}
		});
		suggestionBox.setSuggestionEnabled(true);
		suggestionBox.setLimit(10);
		suggestionBox.setPopupDelay(500);
		suggestionBox.addStyleName("os-cash");
		layout.addComponent(suggestionBox);
		BeanItemContainer<Person> container = new BeanItemContainer<>(Person.class);

		for (int i = 0; i < 100; i++) {
			container.addBean(new Person("Florian" + i, "Pirchner" + i));
			container.addBean(new Person("Klemens" + i, "Edler" + i));
			container.addBean(new Person("Berni" + i, "Edler" + i));
		}
		container.addBean(new Person("Sabrina", "Hopf"));

		suggestionBox.setContainerDataSource(container);
		suggestionBox.setCaptionPropertyId("lastname");
		suggestionBox.setFilterPropertyId("lastname");
		suggestionBox.setUniqueIdPropertyId("uuid");

	}

	private void addForPersonForUUIDMapping(final HorizontalLayout mainLayout) {
		final VerticalLayout layout = new VerticalLayout();
		layout.setMargin(true);
		mainLayout.addComponent(layout);

		// create SuggestTextField
		final SuggestTextField suggestionBox = new SuggestTextField();

		// setup text field
		final Slider popupdelay = new Slider("Popup delay");
		popupdelay.setMin(10);
		popupdelay.setMax(1000);
		popupdelay.setValue(500d);
		popupdelay.setResolution(0);
		layout.addComponent(popupdelay);

		popupdelay.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				suggestionBox.setPopupDelay(popupdelay.getValue().intValue());
			}
		});

		// setup text field
		final Slider limit = new Slider("Suggestion Limit");
		limit.setMin(2);
		limit.setMax(30);
		limit.setValue(10d);
		limit.setResolution(0);
		layout.addComponent(limit);

		limit.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				suggestionBox.setLimit(limit.getValue().intValue());
			}
		});

		final CheckBox suggestionEnabled = new CheckBox("suggestion enabled");
		suggestionEnabled.setValue(true);
		layout.addComponent(suggestionEnabled);
		suggestionEnabled.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				suggestionBox.setSuggestionEnabled(suggestionEnabled.getValue());
			}
		});

		// configure and add SuggestTextField
		suggestionBox.setCaption("Select with uuid mapping");
		suggestionBox.getTextField().addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(ValueChangeEvent event) {
				System.out.println("Foo");
			}
		});
		suggestionBox.setSuggestionEnabled(true);
		suggestionBox.setLimit(10);
		suggestionBox.setPopupDelay(500);
		layout.addComponent(suggestionBox);
		BeanItemContainer<PersonForUUIDMapping> container = new BeanItemContainer<>(PersonForUUIDMapping.class);

		for (int i = 0; i < 100; i++) {
			container.addBean(new PersonForUUIDMapping("Florian" + i, "Pirchner" + i));
			container.addBean(new PersonForUUIDMapping("Klemens" + i, "Edler" + i));
			container.addBean(new PersonForUUIDMapping("Berni" + i, "Edler" + i));
		}
		container.addBean(new PersonForUUIDMapping("Sabrina", "Hopf"));

		suggestionBox.setContainerDataSource(container);
		suggestionBox.setCaptionPropertyId("lastname");
		suggestionBox.setFilterPropertyId("lastname");
		suggestionBox.setUniqueIdPropertyId("uuid");
	}
}