package somiba.web;

import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.servlet.ModelAndView;

import somiba.Util;
import somiba.domain.Season;

public class SeasonRankerController extends AbstractDaoController {
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req,
            HttpServletResponse resp) throws Exception {
		List<Season> seasonList = null;
		StringBuilder whereClause = new StringBuilder("WHERE");

		if (ServletRequestUtils.getStringParameter(req, "sum").equals("0")) {
			String year_min = ServletRequestUtils.getStringParameter(req, "year_min");
			String year_max = ServletRequestUtils.getStringParameter(req, "year_max");
			int yearMin = Integer.parseInt(year_min);
			int yearMax = Integer.parseInt(year_max);
			year_min = year_min.substring(2);
			year_max = year_max.substring(2);
			if (yearMax >= yearMin) {
				if (yearMin >= 2000 || yearMax < 2000) 
					whereClause.append(" AND year >= '" + year_min + "' AND year <= '" + year_max + "'");
				else
					whereClause.append(" AND (year >= '" + year_min + "' OR year <= '" + year_max +"')");
			}
		}

		if (!Util.isEmpty(ServletRequestUtils.getStringParameter(req, "qual"))) {
			if (ServletRequestUtils.getStringParameter(req, "qual").equals("pts_per_g_req"))
				whereClause.append(" AND (gp >= 70 OR pts >= 1400)");
			if (ServletRequestUtils.getStringParameter(req, "qual").equals("trb_per_g_req"))
				whereClause.append(" AND (gp >= 70 OR (off + def) >= 800)");
			if (ServletRequestUtils.getStringParameter(req, "qual").equals("ast_per_g_req"))
				whereClause.append(" AND (gp >= 70 OR ast >= 400)");
			if (ServletRequestUtils.getStringParameter(req, "qual").equals("stl_per_g_req"))
				whereClause.append(" AND (gp >= 70 OR stl >= 125)");
			if (ServletRequestUtils.getStringParameter(req, "qual").equals("blk_per_g_req"))
				whereClause.append(" AND (gp >= 70 OR blk >= 100)");
			if (ServletRequestUtils.getStringParameter(req, "qual").equals("fg_pct_req"))
				whereClause.append(" AND fgm >= 300");
			if (ServletRequestUtils.getStringParameter(req, "qual").equals("fg3_pct_req"))
				whereClause.append(" AND tpm >= 55");
			if (ServletRequestUtils.getStringParameter(req, "qual").equals("ft_pct_req"))
				whereClause.append(" AND ftm >= 125");
        }
		
		if (!Util.isEmpty(ServletRequestUtils.getStringParameter(req, "c1stat")) && !Util.isEmpty(ServletRequestUtils.getStringParameter(req, "c1val")))
			whereClause.append(" AND " + ServletRequestUtils.getStringParameter(req, "c1stat") + " " + ServletRequestUtils.getStringParameter(req, "c1comp") + " '" + ServletRequestUtils.getStringParameter(req, "c1val") + "'");
		if (!Util.isEmpty(ServletRequestUtils.getStringParameter(req, "c2stat")) && !Util.isEmpty(ServletRequestUtils.getStringParameter(req, "c2val")))
			whereClause.append(" AND " + ServletRequestUtils.getStringParameter(req, "c2stat") + " " + ServletRequestUtils.getStringParameter(req, "c2comp") + " '" + ServletRequestUtils.getStringParameter(req, "c2val") + "'");
		if (!Util.isEmpty(ServletRequestUtils.getStringParameter(req, "c3stat")) && !Util.isEmpty(ServletRequestUtils.getStringParameter(req, "c3val")))
			whereClause.append(" AND " + ServletRequestUtils.getStringParameter(req, "c3stat") + " " + ServletRequestUtils.getStringParameter(req, "c3comp") + " '" + ServletRequestUtils.getStringParameter(req, "c3val") + "'");
		if (!Util.isEmpty(ServletRequestUtils.getStringParameter(req, "c4stat")) && !Util.isEmpty(ServletRequestUtils.getStringParameter(req, "c4val")))
			whereClause.append(" AND " + ServletRequestUtils.getStringParameter(req, "c4stat") + " " + ServletRequestUtils.getStringParameter(req, "c4comp") + " '" + ServletRequestUtils.getStringParameter(req, "c4val") + "'");

		if (ServletRequestUtils.getStringParameter(req, "sum").equals("1"))
			whereClause.append(" AND team = 'Totals'");
		else
			whereClause.append(" AND team != 'Totals'");
		whereClause.append(" ORDER BY " + ServletRequestUtils.getStringParameter(req, "order_by"));
		if (!Util.isEmpty(ServletRequestUtils.getStringParameter(req, "order_by_asc")))
			whereClause.append(" ASC");
		else
			whereClause.append(" DESC");
		int maxResults = 100; // could allow user to set
		String whereClauseString = whereClause.toString().replaceFirst(" AND", "");
		if (whereClauseString.equals("WHERE"))
			whereClauseString = "";
		seasonList = super.getDaoRepository().getSeasonDao().getAllByQuery(whereClauseString, maxResults);
        StringBuilder report = new StringBuilder(whereClauseString + "\n\n");
		report.append("                                                                                                          REBOUNDS\n");
		report.append("NAME      YR TM         GP  GS   MIN   FGM   FGA  FG%  3PM  3PA  3P%  FTM  FTA  FT%  STL  BLK   TO   PF  OFF   TOT   AST   PTS\n");
		Iterator<Season> itr = seasonList.iterator();
		String type = ServletRequestUtils.getStringParameter(req, "type");
		double divisor = -1.;
		while (itr.hasNext()) {
			Season season = itr.next();
			if (type.equals("per_game"))
				divisor = (double)season.getGp();
			if (type.equals("per_minute"))
				divisor =  season.getMin() / Double.parseDouble(ServletRequestUtils.getStringParameter(req, "per_minute_base")); 
			report.append(season.customFill(divisor) + "\n");
		}
        ModelAndView mav = super.handleRequestInternal(req, resp);
        mav.addObject("data", report);
		return mav;
    }
}
