/**
 *                                                                            
 * 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.kanban.sample;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.annotation.WebServlet;

import org.eclipse.osbp.vaadin.addons.kanban.KanbanBoard;
import org.eclipse.osbp.vaadin.addons.kanban.KanbanCard;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

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

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

	private VerticalLayout content;
	private KanbanBoard board;

	@Override
	protected void init(VaadinRequest request) {

		board = new KanbanBoard();
		setContent(board);

		board.setDoubleClickListener(this::refreshDto);

		List<SampleEnum> allowedStates = new ArrayList<>();
		allowedStates.add(SampleEnum.ENTERED);
		allowedStates.add(SampleEnum.RELEASED);
		allowedStates.add(SampleEnum.SHIPPED);
		allowedStates.add(SampleEnum.INVOICED);
		board.initialize(allowedStates.toArray(new SampleEnum[allowedStates.size()]), new KanbanBoard.DropAdapter() {
			@Override
			public boolean dropAllowed(Enum<?> sourceState, Enum<?> targetState, Object itemId) {
				// if (sourceState == SampleEnum.INVOICED || targetState ==
				// SampleEnum.ENTERED) {
				// return false;
				// }
				return true;
			}

			@Override
			public boolean drop(Enum<?> sourceState, Enum<?> targetState, Object itemId) {
				return targetState != SampleEnum.RELEASED;
			}
		}, new KanbanBoard.KanbanCardAdapter() {

			@Override
			public KanbanCard createCard(Object itemId) {
				Bean bean = (Bean) itemId;
				KanbanCard card = new KanbanCard(bean.getId(), bean.getState(), bean);
				card.setContent(new Label(bean.getFirstName() + " " + bean.getLastName()));
				return card;
			}
		}, null);
 
		BeanItemContainer<Bean> container = new BeanItemContainer<>(Bean.class);
		for (int i = 0; i < 70; i++) {
			container.addBean(new Bean(Integer.toString(i), getState(i), "Flo" + i, "Test" + i));
		}

		board.setContainerDatasource(container);
	}

	private void refreshDto(KanbanCard card) {
		Bean newBean = new Bean(card.getCardId(), (SampleEnum) card.getCardState(), "Double", "Clicked");
		board.refresh(newBean);
	}

	private SampleEnum getState(int i) {
		if (i % 4 == 0) {
			return SampleEnum.ENTERED;
		}
		if (i % 3 == 0) {
			return SampleEnum.RELEASED;
		}
		if (i % 2 == 0) {
			return SampleEnum.INVOICED;
		}
		return SampleEnum.SHIPPED;
	}

}