/*
 *  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;

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

import org.apache.openaz.xacml.admin.components.AttributeDictionary;
import org.apache.openaz.xacml.admin.components.ObadviceDictionary;
import org.apache.openaz.xacml.admin.components.PDPManagement;
import org.apache.openaz.xacml.admin.components.PIPManagement;
import org.apache.openaz.xacml.admin.components.PolicyWorkspace;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.ThemeResource;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Embedded;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

public class XacmlAdminConsole extends CustomComponent implements View {
	private static final long serialVersionUID = 1L;
	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private Label labelCopyright;
	@AutoGenerated
	private TabSheet tabSheet;
	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;
	@AutoGenerated
	private Label labelWelcome;
	@AutoGenerated
	private Label caption;
	@AutoGenerated
	private Embedded embedded_1;

	private static Log logger	= LogFactory.getLog(XacmlAdminConsole.class);
	
	private final PolicyWorkspace policyWorkspace;
	private final AttributeDictionary attributeDictionary;
	private final ObadviceDictionary obadvice;
	private final PDPManagement pdp;
	private final PIPManagement pip;
//	private final UserManagement user;
	
	/**
	 * 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 XacmlAdminConsole() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		
		if (logger.isDebugEnabled()) {
			logger.debug("Creating tabs...");
		}
		
		this.labelWelcome.setValue("Welcome " + ((XacmlAdminUI)UI.getCurrent()).getUserName());
		this.labelCopyright.setContentMode(ContentMode.HTML);
		
		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
				XacmlAdminAuthorization.AdminAction.ACTION_READ, 
				XacmlAdminAuthorization.AdminResource.RESOURCE_POLICY_WORKSPACE)) {
			this.policyWorkspace = new PolicyWorkspace();
			this.tabSheet.addComponent(this.policyWorkspace);
			this.tabSheet.getTab(this.policyWorkspace).setCaption("Policy Workspace");
		} else {
			this.policyWorkspace = null;
		}
		
		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
				XacmlAdminAuthorization.AdminAction.ACTION_READ, 
				XacmlAdminAuthorization.AdminResource.RESOURCE_DICTIONARIES)) {
			this.attributeDictionary = new AttributeDictionary();
			this.tabSheet.addComponent(this.attributeDictionary);
			this.tabSheet.getTab(this.attributeDictionary).setCaption("Attribute Dictionary");

			this.obadvice = new ObadviceDictionary(); 
			this.tabSheet.addComponent(this.obadvice);
			this.tabSheet.getTab(this.obadvice).setCaption("Obligation/Advice Dictionary");
		} else {
			this.attributeDictionary = null;
			this.obadvice = null;
		}
		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
									XacmlAdminAuthorization.AdminAction.ACTION_READ, 
									XacmlAdminAuthorization.AdminResource.RESOURCE_PDP_ADMIN)) {
			this.pdp = new PDPManagement(((XacmlAdminUI)UI.getCurrent()).getPAPEngine());
			this.tabSheet.addComponent(this.pdp);
			this.tabSheet.getTab(this.pdp).setCaption("PDP Management");
		} else {
			this.pdp = null;
		}
		
		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
				XacmlAdminAuthorization.AdminAction.ACTION_READ, 
				XacmlAdminAuthorization.AdminResource.RESOURCE_PIP_ADMIN)) {
			this.pip = new PIPManagement();
			this.tabSheet.addComponent(this.pip);
			this.tabSheet.getTab(this.pip).setCaption("PIP Management");
		} else {
			this.pip = null;
		}
		/*
		 * TODO  - figure out how to add this in
		 *
		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
				XacmlAdminAuthorization.AdminAction.ACTION_READ, 
				XacmlAdminAuthorization.AdminResource.RESOURCE_POLICY_WORKSPACE)) {
			this.user = new UserManagement();
			this.tabSheet.addComponent(this.user);
			this.tabSheet.getTab(this.user).setCaption("User Management");
		}
		*/
		
		if (logger.isDebugEnabled()) {
			logger.debug("Done creating tabs.");
		}
	}
	
	public void refreshAttributes() {
		this.attributeDictionary.refreshContainer();
	}
	public void refreshObadvice() {
		this.obadvice.refreshContainer();
	}

	public void refreshPIPConfiguration() {
		this.pip.refreshContainer();
	}

	public void refreshPDPGroups() {
		this.pdp.refreshContainer();
	}

	public TabSheet getTabSheet() { return tabSheet;}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		mainLayout.addComponent(horizontalLayout_1);
		
		// tabSheet
		tabSheet = new TabSheet();
		tabSheet.setImmediate(false);
		tabSheet.setWidth("100.0%");
		tabSheet.setHeight("100.0%");
		mainLayout.addComponent(tabSheet);
		mainLayout.setExpandRatio(tabSheet, 1.0f);
		
		// labelCopyright
		labelCopyright = new Label();
		labelCopyright.setImmediate(false);
		labelCopyright.setWidth("-1px");
		labelCopyright.setHeight("40px");
		labelCopyright
				.setValue("<center>Copyright &copy; 2015 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</center>");
		mainLayout.addComponent(labelCopyright);
		mainLayout.setComponentAlignment(labelCopyright, new Alignment(48));
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("100.0%");
		horizontalLayout_1.setHeight("40px");
		horizontalLayout_1.setMargin(false);
		
		// embedded_1
		embedded_1 = new Embedded();
		embedded_1.setImmediate(false);
		embedded_1.setWidth("30px");
		embedded_1.setHeight("30px");
		embedded_1.setSource(new ThemeResource("img/att.png"));
		embedded_1.setType(1);
		embedded_1.setMimeType("image/png");
		horizontalLayout_1.addComponent(embedded_1);
		horizontalLayout_1.setComponentAlignment(embedded_1, new Alignment(33));
		
		// caption
		caption = new Label();
		caption.setImmediate(false);
		caption.setWidth("-1px");
		caption.setHeight("-1px");
		caption.setValue("Apache OpenAZ Admin Console");
		horizontalLayout_1.addComponent(caption);
		horizontalLayout_1.setExpandRatio(caption, 1.0f);
		horizontalLayout_1.setComponentAlignment(caption, new Alignment(33));
		
		// labelWelcome
		labelWelcome = new Label();
		labelWelcome.setImmediate(false);
		labelWelcome.setWidth("-1px");
		labelWelcome.setHeight("40px");
		labelWelcome.setValue("Label");
		horizontalLayout_1.addComponent(labelWelcome);
		horizontalLayout_1.setComponentAlignment(labelWelcome,
				new Alignment(34));
		
		return horizontalLayout_1;
	}

	@Override
	public void enter(ViewChangeEvent event) {
		//
		// This needs to be implemented
		//
	}
}
