package somiba.dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import org.springframework.dao.DataAccessException;
import org.springframework.transaction.annotation.Transactional;

import somiba.domain.Season;

@Transactional(readOnly = true)
public class HibernateSeasonDao extends AbstractHibernateDao implements
		SeasonDao {

	@Transactional(readOnly = false)
	@Override
	public void delete(Season season) throws DataAccessException {
        super.delete(season);
	}

	@Override
	public Season get(String name, String year, String team)
			throws DataAccessException {
        return (Season) super.findOne("from Season where name=? and year=? and team=?", name, year, team);
	}

    @SuppressWarnings("unchecked")
	@Override
	public List<Season> getAll() throws DataAccessException {
        return (List<Season>) super.findAll("from Season");
	}

    @SuppressWarnings("unchecked")
	@Override
	public List<Season> getAllByName(String name) throws DataAccessException {
        List<Season> seasonList = (List<Season>) super.findAll("from Season where name=?", name);
        Iterator<Season> itr = seasonList.iterator();
		List<Season> preY2KList = new ArrayList<Season>();
		while (itr.hasNext()) {
			Season season = itr.next();
			if (!season.getYear().equals("") && Integer.parseInt(season.getYear()) >= 96)
				preY2KList.add(season);
		}
		seasonList.removeAll(preY2KList);
		seasonList.addAll(0, preY2KList);
		return seasonList;
	}

    void processForComposite(List<Season> list) {
    	ListIterator<Season> itr = list.listIterator();
    	while (itr.hasNext()) {
    		Season season = itr.next();
    		if (!season.getTeam().equals("composite")) {
    			List<Season> seasons = getSameYear(season.getName(), season.getYear());
    			if (seasons.size() > 1)
    				itr.remove();
    		}    		
    	}
    }
    
    @SuppressWarnings("unchecked")
	@Override
	public List<Season> getAllByQuery(String whereClause, int maxResults)
			throws DataAccessException {
        List<Season> list = (List<Season>) super.findAllByQuery("from Season " + whereClause, maxResults);
        processForComposite(list);
        return list;
	}

    @SuppressWarnings("unchecked")
	@Override
	public List<Season> getAllTotals() throws DataAccessException {
        return (List<Season>) super.findAll("from Season where team = 'totals'");
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Season> getSameYear(String name, String year)
			throws DataAccessException {
        return (List<Season>) super.findAll("from Season where name=? and year=?", name, year);
	}

	@Transactional(readOnly = false)
	@Override
	public void save(Season season) throws DataAccessException {
        super.save(season);
	}

	@Transactional(readOnly = false)
	@Override
	public void update(Season season) throws DataAccessException {
        super.save(season);
	}

}
