package com.eassessment.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.eassessment.model.AdminDao;
import com.eassessment.pojo.AnswerMemo;
import com.eassessment.pojo.FinalReport;
import com.eassessment.pojo.Options;
import com.eassessment.util.StringUtil;

/**
 * Servlet implementation class AssessmentReport
 */
public class AssessmentReport extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public AssessmentReport() {
		super();
	}

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		String testType = request.getParameter("testtype");
		List<AnswerMemo> ansmemo = AdminDao.getInstance().getAnswerMemo(id,
				testType);

		HashMap<Integer, FinalReport> map = new HashMap<Integer, FinalReport>();

		List<String> output_for_assessment_test = new ArrayList<String>();
		List<String> personality_traits = new ArrayList<String>();
		List<String> user_input = new ArrayList<String>();
		List<String> strengths = new ArrayList<String>();
		List<String> explore_initiate = new ArrayList<String>();
		List<String> need_coaching_guidance = new ArrayList<String>();
		List<String> self_improvement_opportunities = new ArrayList<String>();
		List<String> advantages_you_have_got = new ArrayList<String>();

		double self_organized = 0;
		double self_motivated = 0;
		double proper_coaching = 0;
		double guidance = 0;
		double enviornment = 0;
		double encouragement = 0;
		double hard_work = 0;

		/*
		 * Get unique topic id
		 */
		Set<Integer> set = new HashSet<Integer>();

		for (AnswerMemo memo : ansmemo) {
			set.add(memo.getTopic_id().getTopic_id());
		}

		/*
		 * Iterate over
		 */
		Iterator<Integer> it = set.iterator();
		while (it.hasNext()) {

			int topic_id = it.next();
			FinalReport report = new FinalReport();

			output_for_assessment_test = new ArrayList<String>();
			personality_traits = new ArrayList<String>();
			// user_input = new ArrayList<String>();
			strengths = new ArrayList<String>();
			explore_initiate = new ArrayList<String>();
			need_coaching_guidance = new ArrayList<String>();
			self_improvement_opportunities = new ArrayList<String>();
			advantages_you_have_got = new ArrayList<String>();

			self_organized = 0;
			self_motivated = 0;
			proper_coaching = 0;
			guidance = 0;
			enviornment = 0;
			encouragement = 0;
			hard_work = 0;

			double sleeping_habits = 0;
			double exercise = 0;
			double morning_person = 0;

			double balanced_diet = 0;
			double right_quantity = 0;
			double specfied_time = 0;

			double fixed_study_schedule = 0;
			double hobbies = 0;
			double entertainment = 0;

			List<String> achivers = new ArrayList<String>();
			List<String> believers = new ArrayList<String>();
			List<String> analysers = new ArrayList<String>();
			List<String> non_conformist = new ArrayList<String>();
			List<String> radical = new ArrayList<String>();

			double self_leaner = 0;
			double awarness = 0;
			double ready_to_change = 0;

			double cq = 0;
			double eq = 0;
			double aq = 0;
			double iq = 0;

			double yes = 0;
			double not_sure = 0;
			double no = 0;

			List<String> coaching_classes = new ArrayList<String>();
			List<String> crash_course = new ArrayList<String>();
			List<String> private_tuition = new ArrayList<String>();
			List<String> crash_course_coaching_classes = new ArrayList<String>();
			List<String> trues = new ArrayList<String>();
			List<String> falses = new ArrayList<String>();

			/*
			 * Get all option of topic and create Report obj
			 */
			int count = 0;
			int countB = 0;
			int countC = 0;
			int countD = 0;
			int countF = 0;
			int countG = 0;
			for (AnswerMemo memo : ansmemo) {
				if (memo.getTopic_id().getTopic_id() != topic_id) {
					continue;
				}

				Options option = AdminDao.getInstance().getOption(
						String.valueOf(memo.getOpt_id().getOptionId()));

				if (StringUtil.getEmptyString(option.getOutput_for_assessment_test()).length() > 0) {
					output_for_assessment_test.add(option
							.getOutput_for_assessment_test());
				}

				if (StringUtil.getEmptyString(option.getPersonality_traits()).length() > 0) {
					personality_traits.add(option.getPersonality_traits());
				}
				if (StringUtil.getEmptyString(option.getUser_input()).length() > 0) {
					user_input.add(option.getUser_input());
				}

				if (StringUtil.getEmptyString(option.getStrengths()).length()  > 0) {
					strengths.add(option.getStrengths());
				}

				if (StringUtil.getEmptyString(option.getExplore_initiate()).length() > 0) {
					explore_initiate.add(option.getExplore_initiate());
				}

				if (StringUtil.getEmptyString(option.getNeed_coaching_guidance()).length() > 0) {
					need_coaching_guidance.add(option
							.getNeed_coaching_guidance());
				}

				if (StringUtil.getEmptyString(option.getSelf_improvement_opportunities()).length() > 0) {
					self_improvement_opportunities.add(option
							.getSelf_improvement_opportunities());
				}

				if (StringUtil.getEmptyString(option.getAdvantages_you_have_got()).length() > 0) {
					advantages_you_have_got.add(option
							.getAdvantages_you_have_got());
				}

				if (StringUtil.getEmptyString(option.getAchivers()).length() > 0) {
					achivers.add(option.getAchivers());
				}
				if (StringUtil.getEmptyString(option.getBelievers()).length() > 0) {
					believers.add(option.getBelievers());
				}
				if (StringUtil.getEmptyString(option.getAnalysers()).length() > 0) {
					analysers.add(option.getAnalysers());
				}
				if (StringUtil.getEmptyString(option.getNon_conformist()).length() > 0) {
					non_conformist.add(option.getNon_conformist());
				}
				if (StringUtil.getEmptyString(option.getRadical()).length() > 0) {
					achivers.add(option.getRadical());
				}

				if (StringUtil.getEmptyString(option.getCoaching_classes()).length() > 0) {
					coaching_classes.add(option.getCoaching_classes());
				}
				if (StringUtil.getEmptyString(option.getCrash_course()).length() > 0) {
					crash_course.add(option.getCrash_course());
				}
				if (StringUtil.getEmptyString(option.getPrivate_tuition()).length() > 0) {
					private_tuition.add(option.getPrivate_tuition());
				}
				if (StringUtil.getEmptyString(option.getCrash_course_coaching_classes()).length() > 0) {
					crash_course_coaching_classes.add(option
							.getCrash_course_coaching_classes());
				}

				if (option.getQuestions().getQuestion_type().equals("A")) {
					self_organized += option.getSelf_organized();
					self_motivated += option.getSelf_motivated();
					proper_coaching += option.getProper_coaching();
					guidance += option.getGuidance();
					enviornment += option.getEnviornment();
					encouragement += option.getEncouragement();
					hard_work += option.getHard_work();
					++count;
				}

				if (option.getQuestions().getQuestion_type().equals("B")) {
					sleeping_habits += option.getSleeping_habits();
					exercise += option.getExercise();
					morning_person += option.getMorning_person();
					++countB;
				}
				if (option.getQuestions().getQuestion_type().equals("C")) {
					balanced_diet += option.getBalanced_diet();
					right_quantity += option.getRight_quantity();
					specfied_time += option.getSpecfied_time();

					++countC;
				}
				if (option.getQuestions().getQuestion_type().equals("D")) {
					fixed_study_schedule += option.getFixed_study_schedule();
					hobbies += option.getHobbies();
					entertainment += option.getEntertainment();
					++countD;
				}
				if (option.getQuestions().getQuestion_type().equals("F")) {
					self_leaner += option.getSelf_leaner();
					awarness += option.getAwarness();
					ready_to_change += option.getReady_to_change();
					++countF;
				}
				if (option.getQuestions().getQuestion_type().equals("G")) {
					cq += option.getCq();
					eq += option.getEq();
					aq += option.getAq();
					iq += option.getIq();
					++countG;
				}
				if (option.getQuestions().getQuestion_type().equals("G")) {
					yes += option.getYes();
					not_sure += option.getNot_sure();
					no += option.getNo();
				}
			}

			// setter
			report.setTopic_id(topic_id);
			report.setOutput_for_assessment_test(output_for_assessment_test);
			report.setPersonality_traits(personality_traits);
			report.setUser_input(user_input);
			report.setStrengths(strengths);
			report.setExplore_initiate(explore_initiate);
			report.setNeed_coaching_guidance(need_coaching_guidance);
			report.setSelf_improvement_opportunities(self_improvement_opportunities);
			report.setAdvantages_you_have_got(advantages_you_have_got);

			if (count > 0) {
				report.setSelf_organized(self_organized / count);
				report.setSelf_motivated(self_motivated / count);
				report.setProper_coaching(proper_coaching / count);
				report.setGuidance(guidance / count);
				report.setEnviornment(enviornment / count);
				report.setEncouragement(encouragement / count);
				report.setHard_work(hard_work / count);
			}
			if (countB > 0) {
				report.setSleeping_habits(sleeping_habits / countB);
				report.setExercise(exercise / countB);
				report.setMorning_person(morning_person / countB);
			}

			if (countC > 0) {
				report.setBalanced_diet(balanced_diet / countC);
				report.setRight_quantity(right_quantity / countC);
				report.setSpecfied_time(specfied_time / countC);
			}
			if (countD > 0) {
				report.setFixed_study_schedule(fixed_study_schedule / countD);
				report.setHobbies(hobbies / countD);
				report.setEntertainment(entertainment / countD);
			}
			if (countF > 0) {
				report.setSelf_leaner(self_leaner / countF);
				report.setAwarness(awarness / countF);
				report.setReady_to_change(ready_to_change / countF);

			}
			if (countG > 0) {
				report.setCq(100-cq );
				report.setEq(100-eq );
				report.setAq(100-aq );
				report.setIq(100-iq );

			}
			 
			report.setAchivers(achivers);
			report.setBelievers(believers);
			report.setAnalysers(analysers);
			report.setNon_conformist(non_conformist);
			
			report.setRadical(radical);
			report.setCoaching_classes(coaching_classes);
			report.setCrash_course(crash_course);
			report.setPrivate_tuition(private_tuition);
			report.setCrash_course_coaching_classes(crash_course_coaching_classes);
			// add into map
			map.put(topic_id, report);

		}

		request.setAttribute("ansList", map);
		request.setAttribute("user", AdminDao.getInstance().getUser(id));
		RequestDispatcher rd = request
				.getRequestDispatcher("AssessmentReport.jsp");
		rd.forward(request, response);
	}

}
