/**
 * Copyright (c) 2011, 2015 - 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.ecview.core.common.uri;

import java.net.URI;

import org.eclipse.osbp.ecview.core.common.beans.IBeanRegistry;
import org.eclipse.osbp.ecview.core.common.beans.ISlot;

// TODO: Auto-generated Javadoc
/**
 * The Class BeanScope.
 */
public class BeanScope extends AbstractScope {

	/** The Constant URI_AUTHORITY. */
	public static final String URI_AUTHORITY = "bean";
	
	/** The Constant SEGMENT_TEMPLATE. */
	private static final String SEGMENT_TEMPLATE = "bean/%s";
	
	/** The parent. */
	private final AccessibleScope parent;
	
	/** The selector. */
	private final String selector;

	/** The fragment scope. */
	private FragmentScope fragmentScope;

	/**
	 * Instantiates a new bean scope.
	 *
	 * @param parent
	 *            the parent
	 * @param selector
	 *            the selector
	 */
	public BeanScope(AccessibleScope parent, String selector) {
		this.parent = parent;
		this.selector = selector;

		setURISegment(String.format(SEGMENT_TEMPLATE, selector));
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.ecview.core.common.uri.IURIScope#root()
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <A extends AccessibleScope> A root() {
		return (A) parent;
	}

	/**
	 * Gets the view scope.
	 *
	 * @return the view scope
	 */
	protected AccessibleScope getViewScope() {
		return root();
	}

	/**
	 * Returns the URI representation of this bean scope.
	 * 
	 * @return URI
	 */
	public URI toURI() {
		return URI.create(toURIString());
	}

	/**
	 * Returns the URI string of the produced string token.
	 * 
	 * @return String string
	 */
	public String toURIString() {
		return parent.getURISegment().concat(getURISegment());
	}

	/**
	 * Returns the fragment scope including the given fragment. <br>
	 * Is part of fluent API.
	 *
	 * @param fragment
	 *            the fragment
	 * @return the fragment scope
	 */
	public FragmentScope fragment(String fragment) {
		if (fragment == null || fragment.equals("")) {
			return null;
		}

		fragmentScope = new FragmentScope(this, fragment);
		return fragmentScope;
	}

	/**
	 * Accesses the object in the given context that is described by the uri
	 * segment of this scope. Also delegates to fragment scope if exists.
	 *
	 * @param accessible
	 *            the accessible
	 * @return the object
	 */
	public Object access(IBeanRegistry accessible) {
		Object result = null;
		Object bean = accessible.getBeanSlot(selector);
		if (fragmentScope != null) {
			result = fragmentScope.access(bean);
		} else {
			result = bean;
		}
		return result;
	}

	/**
	 * Accesses the bean slot in the given context and returns its value. URI
	 * fragments are ignored.
	 *
	 * @param accessible
	 *            the accessible
	 * @return the object
	 */
	public Object accessBean(IBeanRegistry accessible) {
		return accessBeanSlot(accessible).getValue();
	}

	/**
	 * Accesses the bean slot in the given context and returns it. URI fragments
	 * are ignored.
	 *
	 * @param accessible
	 *            the accessible
	 * @return the i slot
	 */
	public ISlot accessBeanSlot(IBeanRegistry accessible) {
		return accessible.getBeanSlot(selector);
	}

	/**
	 * Creates a new bean slot if not present yet.
	 *
	 * @param accessible
	 *            the accessible
	 * @param type
	 *            The type of the object that will be stored in the bean slot
	 * @return the i slot
	 */
	public ISlot createBeanSlot(IBeanRegistry accessible, Class<?> type) {
		ISlot slot = accessible.getBeanSlot(selector);
		if (slot == null) {
			slot = accessible.createBeanSlot(selector, type);
		}
		return slot;
	}

	/**
	 * Returns the selector that points to the target value in the bean scope.
	 *
	 * @return the selector
	 */
	public String getSelector() {
		return selector;
	}

	/**
	 * Returns the fragment scope.
	 *
	 * @return FragmentScope
	 */
	public FragmentScope getFragmentScope() {
		return fragmentScope;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return toURIString();
	}

}
