/**
 * SearchParameter.java
 * Created May 20, 2008
 * Copyright (c) TANDBERG Television 2007-2008
 */
package com.tandbergtv.watchpoint.search;

import com.tandbergtv.workflow.driver.search.SearchOperator;
import com.tandbergtv.workflow.driver.search.SearchParameterBase;
import com.tandbergtv.workflow.driver.search.SearchType;
import com.tandbergtv.workflow.driver.search.SortParameter;
import com.tandbergtv.workflow.util.SortingOrder;

/**
 * Decorates a SearchParameterBase in order to expose some more properties
 * 
 * @author Sahil Verma
 */
public class SearchParameter extends SearchParameterBase {

	protected SearchParameterBase parameter;
	protected boolean isConjunction = true;
	private SearchOperator operator = null;
	
	/**
	 * Creates a SearchParameter
	 * @param name
	 */
	protected SearchParameter(String name) {
		super(name, SearchType.STRING, false);
	}
	
	/**
	 * Creates a SearchParameter
	 * @param parameter
	 */
	public SearchParameter(SearchParameterBase parameter) {
		super(parameter.getFieldName());
		this.parameter = parameter;
	}
	
	/**
	 * Gets the actual (legacy) parameter we are decorating
	 * 
	 * @return
	 */
	public SearchParameterBase getDecoratedParameter() {
		return this.parameter;
	}
	
	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.driver.search.SearchParameterBase#getPredicate()
	 */
	public String getPredicate() {
		return parameter.getPredicate();
	}

	/**
	 * Returns the suffix for the entity name in the query which is used to create a unique alias
	 * 
	 * @return
	 */
	public int getObjectCount() {
		return this.objectCount;
	}
	
	/**
	 * Sets the object count
	 * 
	 * @param count
	 */
	public void setObjectCount(int count) {
		this.objectCount = count;
	}
	
	/**
	 * Returns the alias
	 * 
	 * @return
	 */
	public String getAlias() {
		return this.alias;
	}
	
	/**
	 * Sets the alias
	 * 
	 * @param alias
	 */
	public void setAlias(String alias) {
		this.alias = alias;
	}
	
	/**	AND/OR. Returns TRUE for AND.
	 * @return the isConjunction
	 */
	public boolean isConjunction() {
		return isConjunction;
	}

	/**
	 * @param isConjunction the isConjunction to set
	 */
	public void setConjunction(boolean isConjunction) {
		this.isConjunction = isConjunction;
	}

	/**
	 * @param count
	 * @return
	 */
	public String getPartialFromClause(int count) {
		throw new UnsupportedOperationException();
	}
	
	/**
	 * Returns the unique alias for the query
	 * 
	 * @return
	 */
	public String getCompleteAlias() {
		return alias + objectCount;
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.driver.search.SearchParameterBase#getFieldName()
	 */
	public String getFieldName() {
		if (parameter != null)
			return parameter.getFieldName();
		
		return super.getFieldName();
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.driver.search.SearchParameterBase#getSortingColumn()
	 */
	public String getSortingColumn() {
		if (parameter instanceof SortParameter)
			return parameter.getSortingColumn();
		
		throw new RuntimeException("This is not a sort parameter");
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.driver.search.SearchParameterBase#getSortingOrder()
	 */
	public SortingOrder getSortingOrder() {
		if (parameter instanceof SortParameter)
			return parameter.getSortingOrder();
		
		throw new RuntimeException("This is not a sort parameter");
	}
	
	/**
	 * Returns the order-by clause element for this parameter without the alias
	 * 
	 * @return
	 */
	public String getPartialOrderByClause() {
		if (parameter instanceof SortParameter) {
			String order = getSortingOrder() == SortingOrder.ASCENDING ? " ASC" : " DESC";
			return getSortingColumn() + order;
		}
		
		throw new RuntimeException("This is not a sort parameter");
	}

	/* (non-Javadoc)
	 * @see com.tandbergtv.workflow.driver.search.SearchParameterBase#getPartialWhereClause()
	 */
	public String getPartialWhereClause() {
		String property = parameter.getFieldName();
		String predicate = parameter.getPredicate();
		
		if(parameter.getIgnoreCase()) {
			return "lower(" + getCompleteAlias() + "." + property + ") " + predicate;			
		}

		return getCompleteAlias() + "." + property + " " + predicate;
	}

	public void setOperator(SearchOperator operator) {
		this.operator = operator;
	}

	public SearchOperator getOperator() {
		return operator;
	}
}
