/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 *
 */

package org.apache.openaz.xacml.admin.components;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.apache.openaz.xacml.admin.XacmlAdminAuthorization;
import org.apache.openaz.xacml.admin.XacmlAdminUI;
import org.apache.openaz.xacml.admin.jpa.Attribute;
import org.apache.openaz.xacml.admin.jpa.Category;
import org.apache.openaz.xacml.admin.jpa.Datatype;
import org.apache.openaz.xacml.admin.view.windows.AttributeEditorWindow;
import com.vaadin.addon.jpacontainer.EntityItem;
import com.vaadin.addon.jpacontainer.JPAContainer;
import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Container.Filter;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window.CloseEvent;
import com.vaadin.ui.Window.CloseListener;

public class AttributeDictionary extends CustomComponent {
	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private Table table;
	@AutoGenerated
	private HorizontalLayout horizontalLayoutToolbar;
	@AutoGenerated
	private ComboBox comboBoxFilterDatatype;
	@AutoGenerated
	private ComboBox comboBoxFilterCategory;
	@AutoGenerated
	private Button buttonClone;
	@AutoGenerated
	private Button buttonRemove;
	@AutoGenerated
	private Button buttonNew;
	private static final long serialVersionUID = 4553719412188869190L;
	private static final Log logger	= LogFactory.getLog(AttributeDictionary.class);
	private static final Object[] visibleColumns = new Object[] { "xacmlId", "description", "categoryBean", "datatypeBean", "constraintType", "modifiedBy", "modifiedDate", "createdBy", "createdDate"};
	private static final String[] columnHeaders = new String[] { "Attribute ID", "Description", "Category", "DataType", "Constraint", "Modified By", "Modified Date", "Created By", "Created Date"};
	
	private AttributeDictionary self = this;

	private final JPAContainer<Attribute> attributes = new JPAContainer<Attribute>(Attribute.class);
	private final JPAContainer<Category> categories = new JPAContainer<Category>(Category.class);
	private final JPAContainer<Datatype> datatypes = new JPAContainer<Datatype>(Datatype.class);
	
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public AttributeDictionary() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		//
		// Finish initializing the container
		//
		boolean isReadOnly;
		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
				XacmlAdminAuthorization.AdminAction.ACTION_WRITE, 
				XacmlAdminAuthorization.AdminResource.RESOURCE_DICTIONARIES)) {
			if (logger.isDebugEnabled()) {
				logger.debug("write access");
			}
			//
			// Make it mutable
			//
			isReadOnly = false;
			this.attributes.setEntityProvider(new CachingMutableLocalEntityProvider<Attribute>(Attribute.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
		} else {
			if (logger.isDebugEnabled()) {
				logger.debug("read access");
			}
			//
			// Make it read-only
			//
			isReadOnly = true;
			this.attributes.setEntityProvider(new CachingLocalEntityProvider<Attribute>(Attribute.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
		}
		this.categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
		this.categories.sort(new String[]{"xacmlId"}, new boolean[]{true});
		this.datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
		this.datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true});
		//
		// Initialize
		//
		this.initializeTable(isReadOnly);
		this.initializeButtons(isReadOnly);
		this.initializeCategoryComboFilter();
		this.initializeDatatypeComboFilter();
	}
	
	protected void initializeTable(boolean isReadOnly) {
		//
		// This is the data source
		//
		this.table.setContainerDataSource(this.attributes);
		//
		// Setup table
		//
		this.table.setVisibleColumns(visibleColumns);
		this.table.setColumnHeaders(columnHeaders);
		this.table.setImmediate(true);
		this.table.setColumnCollapsingAllowed(true);
		//
		// Read only?
		//
		if (isReadOnly) {
			if (logger.isDebugEnabled()) {
				logger.debug("read only table");
			}
			return;
		}
		this.table.setSelectable(true);
		//
		// Respond to clicks
		//
		this.table.addItemClickListener(new ItemClickListener() {
			private static final long serialVersionUID = 1L;
			@Override
			public void itemClick(ItemClickEvent event) {
				if (event.isDoubleClick()) {
					//
					// Create our editor window
					//
					final AttributeEditorWindow attributeEditor = new AttributeEditorWindow(self.attributes.getItem(event.getItemId()));
					attributeEditor.setCaption("Edit Attribute");
					attributeEditor.setModal(true);
					attributeEditor.center();
					UI.getCurrent().addWindow(attributeEditor);
				}
			}
		});
		//
		// Respond to selections
		//
		this.table.addValueChangeListener(new ValueChangeListener() {
			private static final long serialVersionUID = 1L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				Object value = self.table.getValue();
				if (value == null) {
					self.buttonRemove.setEnabled(false);
					self.buttonClone.setEnabled(false);
				} else {
					self.buttonRemove.setEnabled(true);
					self.buttonClone.setEnabled(true);
				}
			}
		});
	}
	
	protected void initializeButtons(boolean isReadOnly) {
		if (isReadOnly) {
			this.buttonNew.setVisible(false);
			this.buttonRemove.setVisible(false);
			this.buttonClone.setVisible(false);
			return;
		}
		this.buttonNew.addClickListener(new ClickListener() {
			private static final long serialVersionUID = 1L;

			@Override
			public void buttonClick(ClickEvent event) {
				AttributeDictionary.createNewAttributeWindow();
			}
			
		});
		
		this.buttonRemove.setEnabled(false);
		this.buttonRemove.addClickListener(new ClickListener() {
			private static final long serialVersionUID = 1L;

			@Override
			public void buttonClick(ClickEvent event) {
				//
				// Get the selected item
				//
				Object id = self.table.getValue();
				//
				// Sanity check
				//
				if (id == null) {
					return;
				}
				//
				// Remove the attribute
				//
				self.attributes.removeItem(id);
				//
				// Unfortunately, removing the item does NOT result
				// in a ValueChange event being generated. So we must
				// trigger it ourselves.
				//
				self.table.select(self.table.getNullSelectionItemId());
			}	
		});
		
		this.buttonClone.setEnabled(false);
		this.buttonClone.addClickListener(new ClickListener() {
			private static final long serialVersionUID = 1L;

			@Override
			public void buttonClick(ClickEvent event) {
				Object id = self.table.getValue();
				if (id == null) {
					return;
				}
				Item item = self.table.getItem(id);
				if (item instanceof EntityItem) {
					@SuppressWarnings("unchecked")
					//
					// Get the entity
					//
					EntityItem<Attribute> entityItem = (EntityItem<Attribute>) item;
					//
					// Clone it
					//
					Attribute newAttribute = new Attribute(entityItem.getEntity(), ((XacmlAdminUI)UI.getCurrent()).getUserid());
					//
					// Add it to the database
					//
					id = self.attributes.addEntity(newAttribute);
					//
					// Now select it
					//
					self.table.select(id);
					//
					// Refresh it to get the latest modified date
					//
					self.attributes.refreshItem(id);
				}
			}
		});
	}

	protected void initializeCategoryComboFilter() {
		//
		// Set data source
		//
		this.comboBoxFilterCategory.setContainerDataSource(self.categories);
		this.comboBoxFilterCategory.setItemCaptionMode(ItemCaptionMode.PROPERTY);
		this.comboBoxFilterCategory.setItemCaptionPropertyId("xacmlId");
		//
		// Initialize GUI properties
		//
		this.comboBoxFilterCategory.setNullSelectionAllowed(true);
		this.comboBoxFilterCategory.setImmediate(true);
		//
		// Respond to value changes
		//
		this.comboBoxFilterCategory.addValueChangeListener(new ValueChangeListener() {
			private static final long serialVersionUID = 1L;
			Filter currentFilter = null;

			@Override
			public void valueChange(ValueChangeEvent event) {
				//
				// Remove filter
				//
				if (currentFilter != null) {
					self.attributes.removeContainerFilter(this.currentFilter);
					this.currentFilter = null;
				}
				//
				// Set the new one
				//
				Object id = self.comboBoxFilterCategory.getValue();
				if (id == null) {
					return;
				}
				Category cat = self.categories.getItem(id).getEntity();
				this.currentFilter = new Compare.Equal("categoryBean", cat);
				self.attributes.addContainerFilter(this.currentFilter);
			}
		});
	}
	
	protected void initializeDatatypeComboFilter() {
		//
		// Set data source
		//
		this.comboBoxFilterDatatype.setContainerDataSource(self.datatypes);
		this.comboBoxFilterDatatype.setItemCaptionMode(ItemCaptionMode.PROPERTY);
		this.comboBoxFilterDatatype.setItemCaptionPropertyId("xacmlId");
		//
		// Initialize GUI properties
		//
		this.comboBoxFilterDatatype.setNullSelectionAllowed(true);
		this.comboBoxFilterDatatype.setImmediate(true);
		//
		// Respond to value changes
		//
		this.comboBoxFilterDatatype.addValueChangeListener(new ValueChangeListener() {
			private static final long serialVersionUID = 1L;
			Filter currentFilter = null;

			@Override
			public void valueChange(ValueChangeEvent event) {
				//
				// Remove filter
				//
				if (currentFilter != null) {
					self.attributes.removeContainerFilter(this.currentFilter);
					this.currentFilter = null;
				}
				//
				// Set the new one
				//
				Object id = self.comboBoxFilterDatatype.getValue();
				if (id == null) {
					return;
				}
				Datatype cat = self.datatypes.getItem(id).getEntity();
				this.currentFilter = new Compare.Equal("datatypeBean", cat);
				self.attributes.addContainerFilter(this.currentFilter);
			}
		});
	}
	
	public void refreshContainer() {
		this.attributes.refresh();
		this.categories.refresh();
		this.datatypes.refresh();
	}
	
	public static void createNewAttributeWindow() {
		//
		// Create our new attribute
		//
		String domain = XacmlAdminUI.getDomain();
		String userid = ((XacmlAdminUI)UI.getCurrent()).getUserid();
		final Attribute newAttribute = new Attribute(domain, userid);
		try {
			newAttribute.setCategoryBean(((XacmlAdminUI)UI.getCurrent()).getDefaultCategory());
			newAttribute.setDatatypeBean(((XacmlAdminUI)UI.getCurrent()).getDefaultDatatype());
		} catch (Exception e) {
			logger.error(e);
			return;
		}
		//
		// Create our editor window
		//
		final AttributeEditorWindow attributeEditor = new AttributeEditorWindow(((XacmlAdminUI)UI.getCurrent()).getAttributes().createEntityItem(newAttribute));
		attributeEditor.setCaption("Add New Attribute");
		attributeEditor.setModal(true);
		attributeEditor.addCloseListener(new CloseListener() {
			private static final long serialVersionUID = 1L;

			@Override
			public void windowClose(CloseEvent e) {
				//
				// Did the user hit save?
				//
				if (attributeEditor.isSaved()) {
					//
					// Add the new attribute
					//
					((XacmlAdminUI)UI.getCurrent()).getAttributes().addEntity(newAttribute);
					((XacmlAdminUI)UI.getCurrent()).refreshAttributes();
				}
			}
			
		});
		attributeEditor.center();
		UI.getCurrent().addWindow(attributeEditor);
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("-1px");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("-1px");
		setHeight("-1px");
		
		// horizontalLayoutToolbar
		horizontalLayoutToolbar = buildHorizontalLayoutToolbar();
		mainLayout.addComponent(horizontalLayoutToolbar);
		
		// table
		table = new Table();
		table.setImmediate(false);
		table.setWidth("100.0%");
		table.setHeight("-1px");
		mainLayout.addComponent(table);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayoutToolbar() {
		// common part: create layout
		horizontalLayoutToolbar = new HorizontalLayout();
		horizontalLayoutToolbar.setImmediate(false);
		horizontalLayoutToolbar.setWidth("-1px");
		horizontalLayoutToolbar.setHeight("-1px");
		horizontalLayoutToolbar.setMargin(false);
		horizontalLayoutToolbar.setSpacing(true);
		
		// buttonNew
		buttonNew = new Button();
		buttonNew.setCaption("New");
		buttonNew.setImmediate(true);
		buttonNew.setDescription("Create a new attribute");
		buttonNew.setWidth("70px");
		buttonNew.setHeight("-1px");
		horizontalLayoutToolbar.addComponent(buttonNew);
		horizontalLayoutToolbar.setComponentAlignment(buttonNew, new Alignment(
				9));
		
		// buttonRemove
		buttonRemove = new Button();
		buttonRemove.setCaption("Remove");
		buttonRemove.setImmediate(true);
		buttonRemove.setDescription("Remove the selected attribute(s)");
		buttonRemove.setWidth("-1px");
		buttonRemove.setHeight("-1px");
		horizontalLayoutToolbar.addComponent(buttonRemove);
		horizontalLayoutToolbar.setComponentAlignment(buttonRemove,
				new Alignment(9));
		
		// buttonClone
		buttonClone = new Button();
		buttonClone.setCaption("Clone");
		buttonClone.setImmediate(true);
		buttonClone.setDescription("Clone an attribute.");
		buttonClone.setWidth("-1px");
		buttonClone.setHeight("-1px");
		horizontalLayoutToolbar.addComponent(buttonClone);
		horizontalLayoutToolbar.setComponentAlignment(buttonClone,
				new Alignment(9));
		
		// comboBoxFilterCategory
		comboBoxFilterCategory = new ComboBox();
		comboBoxFilterCategory.setCaption("Filter By Category");
		comboBoxFilterCategory.setImmediate(false);
		comboBoxFilterCategory.setWidth("-1px");
		comboBoxFilterCategory.setHeight("-1px");
		horizontalLayoutToolbar.addComponent(comboBoxFilterCategory);
		
		// comboBoxFilterDatatype
		comboBoxFilterDatatype = new ComboBox();
		comboBoxFilterDatatype.setCaption("Filter By Data Type");
		comboBoxFilterDatatype.setImmediate(false);
		comboBoxFilterDatatype.setWidth("-1px");
		comboBoxFilterDatatype.setHeight("-1px");
		horizontalLayoutToolbar.addComponent(comboBoxFilterDatatype);
		
		return horizontalLayoutToolbar;
	}

}
