/**
 * Copyright (c) 2011, 2014 - Lunifera GmbH (Gross Enzersdorf, Austria), 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 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors: 
 * 		Florian Pirchner - Initial implementation
 */

package org.eclipse.osbp.runtime.web.ecview.presentation.vaadin.tests.ui.samples;

import org.eclipse.osbp.ecview.core.common.context.ContextException;
import org.eclipse.osbp.ecview.core.common.model.binding.BindingFactory;
import org.eclipse.osbp.ecview.core.common.model.binding.YBindingSet;
import org.eclipse.osbp.ecview.core.common.model.binding.YDetailValueBindingEndpoint;
import org.eclipse.osbp.ecview.core.common.model.binding.YEnumListBindingEndpoint;
import org.eclipse.osbp.ecview.core.common.model.core.YEmbeddableSelectionEndpoint;
import org.eclipse.osbp.ecview.core.common.model.core.YView;
import org.eclipse.osbp.ecview.core.extension.model.extension.YCheckBox;
import org.eclipse.osbp.ecview.core.extension.model.extension.YComboBox;
import org.eclipse.osbp.ecview.core.extension.model.extension.YGridLayout;
import org.eclipse.osbp.ecview.core.extension.model.extension.YNumericField;
import org.eclipse.osbp.ecview.core.extension.model.extension.YTable;
import org.eclipse.osbp.ecview.core.extension.model.extension.YTextField;
import org.eclipse.osbp.ecview.core.extension.model.extension.YVerticalLayout;
import org.eclipse.osbp.ecview.core.extension.model.extension.util.SimpleExtensionModelFactory;
import org.eclipse.osbp.runtime.web.ecview.presentation.vaadin.VaadinRenderer;

import com.vaadin.ui.CssLayout;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Label;

public class MasterDetailSample extends CustomComponent {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private final SimpleExtensionModelFactory factory = new SimpleExtensionModelFactory();

	private CssLayout layout;

	private YView yView;

	private YBindingSet yBindingSet;

	private YVerticalLayout yLayout;

	public MasterDetailSample() {
		layout = new CssLayout();
		setCompositionRoot(layout);

		init();
	}

	protected void init() {

		// TODO - fix me FP

		yView = factory.createView();
		yLayout = factory.createVerticalLayout();
		yView.setContent(yLayout);

		yBindingSet = yView.getOrCreateBindingSet();

		YVerticalLayout row1 = factory.createVerticalLayout();
		yLayout.addElement(row1);

		YTable yTable1_1 = factory.createTable();
		yTable1_1.setLabel("Master");
		yTable1_1.setType(Person.class);
		row1.addElement(yTable1_1);

		yTable1_1.getCollection().add(
				new Person("Sabrina", 21, "1220", "Am Nordseeteich", false,
						Gender.FEMALE));
		yTable1_1.getCollection().add(
				new Person("Klemens", 36, "1220", "Irgendwo hinterm Ort", true,
						Gender.MALE));
		yTable1_1.getCollection().add(
				new Person("Flo", 35, "2301", "Hinterm Mond", false,
						Gender.MALE));

		YGridLayout yGrid = factory.createGridLayout();
		yLayout.addElement(yGrid);

		YTextField name = factory.createTextField();
		name.setLabel("Name");
		yGrid.addElement(name);

		YNumericField age = factory.createNumericField();
		age.setLabel("Age");
		yGrid.addElement(age);

		YTextField postalcode = factory.createTextField();
		postalcode.setLabel("Postalcode");
		yGrid.addElement(postalcode);

		YTextField street = factory.createTextField();
		street.setLabel("Street");
		yGrid.addElement(street);

		YCheckBox hasChild = factory.createCheckBox();
		hasChild.setLabel("Has child");
		yGrid.addElement(hasChild);

		YComboBox gender = factory.createComboBox();
		gender.setLabel("Gender");
		gender.setType(Gender.class);
		yGrid.addElement(gender);

		// render now, fill in values later
		// to avoid overwriting values with bindings to empty fields
		VaadinRenderer renderer = new VaadinRenderer();
		try {
			renderer.render(layout, yView, null);
		} catch (ContextException e) {
			layout.addComponent(new Label(e.toString()));
		}

		yBindingSet.addBinding(name.createValueEndpoint(),
				selectionEndpoint(yTable1_1, "name"));
		yBindingSet.addBinding(age.createValueEndpoint(),
				selectionEndpoint(yTable1_1, "age"));
		yBindingSet.addBinding(postalcode.createValueEndpoint(),
				selectionEndpoint(yTable1_1, "postalcode"));
		yBindingSet.addBinding(street.createValueEndpoint(),
				selectionEndpoint(yTable1_1, "street"));
		yBindingSet.addBinding(hasChild.createValueEndpoint(),
				selectionEndpoint(yTable1_1, "hasChild"));
		yBindingSet.addBinding(gender.createSelectionEndpoint(),
				selectionEndpoint(yTable1_1, "gender"));
		YEnumListBindingEndpoint enumBinding = BindingFactory.eINSTANCE
				.createYEnumListBindingEndpoint();
		enumBinding.setEnum(Gender.class);
		yBindingSet.addBinding(gender.createCollectionEndpoint(), enumBinding);
	}

	protected YDetailValueBindingEndpoint selectionEndpoint(YTable yTable1_1,
			String path) {
		YEmbeddableSelectionEndpoint result = yTable1_1
				.createSelectionEndpoint();
		YDetailValueBindingEndpoint detailBinding = BindingFactory.eINSTANCE
				.createYDetailValueBindingEndpoint();
		detailBinding.setMasterObservable(result);
		detailBinding.setPropertyPath(path);
		detailBinding.setType(Person.class);

		return detailBinding;
	}

	public static class Person extends AbstractBean {

		private String name;
		private int age;
		private String postalcode;
		private String street;
		private boolean hasChild;
		private Gender gender;

		public Person(String name, int age, String postalcode, String street,
				boolean hasChild, Gender gender) {
			super();
			this.name = name;
			this.age = age;
			this.postalcode = postalcode;
			this.street = street;
			this.hasChild = hasChild;
			this.gender = gender;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			firePropertyChanged("name", this.name, this.name = name);
		}

		public int getAge() {
			return age;
		}

		public void setAge(int age) {
			firePropertyChanged("age", this.age, this.age = age);
		}

		public String getPostalcode() {
			return postalcode;
		}

		public void setPostalcode(String postalcode) {
			firePropertyChanged("postalcode", this.postalcode,
					this.postalcode = postalcode);
		}

		public String getStreet() {
			return street;
		}

		public void setStreet(String street) {
			firePropertyChanged("street", this.street, this.street = street);
		}

		public boolean isHasChild() {
			return hasChild;
		}

		public void setHasChild(boolean hasChild) {
			firePropertyChanged("hasChild", this.hasChild,
					this.hasChild = hasChild);
		}

		public Gender getGender() {
			return gender;
		}

		public void setGender(Gender gender) {
			firePropertyChanged("gender", this.gender, this.gender = gender);
		}
	}

	public static enum Gender {
		MALE, FEMALE
	}
}
