/**
 * PartnerHDAO.java
 * Created on May 13, 2008
 * (C) Copyright TANDBERG Television Ltd.
 */
package com.tandbergtv.watchpoint.pmm.partner.dao;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.tandbergtv.watchpoint.pmm.dao.hibernate.HibernateDAO;
import com.tandbergtv.watchpoint.pmm.entities.Partner;
import com.tandbergtv.workflow.driver.search.SearchParameterBase;
import com.tandbergtv.workflow.util.SearchCriteria;

/**
 * @author Vlada Jakobac
 * 
 */
public class PartnerHDAO extends HibernateDAO<Partner, Long> {

	private static final Logger log = Logger.getLogger(PartnerHDAO.class);

	public PartnerHDAO(Class<Partner> persistentClass, Session session) {
		super(persistentClass, session);

	}

	/**
	 * @param session
	 *            The Hibernate Session
	 */
	public PartnerHDAO(Session session) {
		super(Partner.class, session);
	}

	public List<Partner> findActiveBySearchCriteria(SearchCriteria searchCriteria) {
		String logString = "Finding all active Partners by Search Criteria using Ordering: ";
		for (SearchParameterBase param : searchCriteria.getSearchList()) {
			if (param.getSortingOrder() == null)
				continue;
			logString += param.getSortingOrder() + " for property: ";
			logString += param.getFieldName() + " ";
		}
		log.debug(logString);

		// Only active partners are allowed
		Criteria criteria = this.createCriteria(Restrictions.eq("isActive", true));

		// Set the first record and the number of allowed records
		criteria.setFirstResult(searchCriteria.getStartingRecordNumber());
		if (searchCriteria.getRecordsCount() > 0) {
			criteria.setMaxResults(searchCriteria.getRecordsCount());
		}

		for (SearchParameterBase param : searchCriteria.getSearchList()) {
			// Get the Ordering Property
			if (param.getSortingOrder() == null)
				continue;
			String orderProperty = param.getFieldName();
			switch (param.getSortingOrder()) {
				case ASCENDING :
					criteria.addOrder(Order.asc(orderProperty));
					// Add the partner id as the second sort parameter to ensure
					// that sorting on a column with non-unique data will retain the
					// order of records displayed per page.
					criteria.addOrder(Order.asc("id"));
					break;

				case DESCENDING :
					criteria.addOrder(Order.desc(orderProperty));
					// Add the partner id as the second sort parameter to ensure
					// that sorting on a column with non-unique data will retain the
					// order of records displayed per page.
					criteria.addOrder(Order.desc("id"));
					break;
			}
		}
		List<Partner> activeList = this.findByCriteria(criteria);

		log.debug("Found the Partners (" + activeList.size()
				+ ") for the given Search Criteria.");

		return activeList;
	}
	
	public List<Partner> findByActive(boolean isActive) {
		Criteria criteria = this.createCriteria(Restrictions.eq("isActive", isActive));
		List<Partner> activeList = this.findByCriteria(criteria);

		return activeList;
	}
	
	
}
