package com.eassessment.model;

import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.hibernate.classic.Session;

import com.eassessment.pojo.AnswerMemo;
import com.eassessment.pojo.AnswerSet;
import com.eassessment.pojo.Options;
import com.eassessment.pojo.Questions;
import com.eassessment.pojo.TestSet;
import com.eassessment.pojo.Topics;
import com.eassessment.pojo.User;
import com.eassessment.util.Constants;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
import com.sun.corba.se.impl.orbutil.closure.Constant;

public class CoordinateDao extends BaseDao {
	private static CoordinateDao coordinateDao = new CoordinateDao();

	private CoordinateDao() {

	}

	public static CoordinateDao getInstance() {
		if (coordinateDao == null) {
			coordinateDao = new CoordinateDao();
		}
		return coordinateDao;
	}

	public String updateOption(Integer id, Options opt) {
		Session session = null;
		try {
			session = super.getSession();
			session.beginTransaction();
			Options option = (Options) session.get(Options.class, id);

			option.setOption_name(opt.getOption_name());
			option.setMarks(opt.getMarks());
			option.setOutput_for_assessment_test(opt
					.getOutput_for_assessment_test());
			option.setPersonality_traits(opt.getPersonality_traits());
			option.setStrengths(opt.getStrengths());
			option.setExplore_initiate(opt.getExplore_initiate());
			option.setNeed_coaching_guidance(opt.getNeed_coaching_guidance());
			option.setSelf_improvement_opportunities(opt
					.getSelf_improvement_opportunities());
			option.setAdvantages_you_have_got(opt.getAdvantages_you_have_got());

			double mark = opt.getMarks();
			double SELF_ORGANIZED = Constants.EassessmentVar.SELF_ORGANIZED
					* mark;
			double SELF_MOTIVATED = Constants.EassessmentVar.SELF_MOTIVATED
					* mark;
			double PROPER_COACHING = Constants.EassessmentVar.PROPER_COACHING
					* mark;
			double GUIDANCE = Constants.EassessmentVar.GUIDANCE * mark;
			double ENVIORNMENT = Constants.EassessmentVar.ENVIORNMENT * mark;
			double ENCOURAGEMENT = Constants.EassessmentVar.ENCOURAGEMENT
					* mark;
			double HARD_WORK = Constants.EassessmentVar.HARD_WORK * mark;

			option.setSelf_organized(SELF_ORGANIZED);
			option.setSelf_motivated(SELF_MOTIVATED);
			option.setProper_coaching(PROPER_COACHING);
			option.setGuidance(GUIDANCE);
			option.setEnviornment(ENVIORNMENT);
			option.setEncouragement(ENCOURAGEMENT);
			option.setHard_work(HARD_WORK);

			option.setQuestions(AdminDao.getInstance().getQuestion(
					String.valueOf(opt.getQuestions().getQuestion_id())));

			session.update(option);
			session.getTransaction().commit();
			session.evict(opt);
			return Constants.OK;
		} catch (Exception e) {
			e.printStackTrace();
			return e.getMessage();
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}
		}

	}

	public String updateTopic(Integer id, String desc) {
		Session session = null;
		try {
			session = super.getSession();
			session.beginTransaction();
			Topics topic = (Topics) session.get(Topics.class, id);
			topic.setTopic_name(desc);
			session.update(topic);
			session.getTransaction().commit();
			session.evict(topic);
			return Constants.OK;
		} catch (Exception e) {
			e.printStackTrace();
			return e.getMessage();
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}
		}

	}

	public String saveTopic(Topics topic)
			throws MySQLIntegrityConstraintViolationException {
		Session session = null;
		try {
			session = super.getSession();
			session.beginTransaction();
			session.save(topic);
			session.getTransaction().commit();
			session.evict(topic);
			return Constants.OK;
		} catch (Exception e) {
			// e.printStackTrace();
			return e.getMessage();
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}
	}

	public String saveQuestion(Questions question)
			throws MySQLIntegrityConstraintViolationException {
		Session session = null;
		try {
			session = super.getSession();
			session.beginTransaction();
			session.save(question);
			session.getTransaction().commit();
			session.evict(question);
			return Constants.OK;
		} catch (Exception e) {
			// e.printStackTrace();
			return e.getMessage();
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}
	}

	public String updateQuestion(Integer id, String desc) {
		Session session = null;
		try {
			session = super.getSession();
			session.beginTransaction();
			Questions ques = (Questions) session.get(Questions.class, id);
			ques.setQuestion_name(desc);
			session.update(ques);
			session.getTransaction().commit();
			session.evict(ques);
			return Constants.OK;
		} catch (Exception e) {
			e.printStackTrace();
			return e.getMessage();
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}
		}

	}

	public String saveOption(Options option)
			throws MySQLIntegrityConstraintViolationException {
		Session session = null;
		try {
			session = super.getSession();
			session.beginTransaction();
			session.save(option);
			session.getTransaction().commit();
			session.evict(option);
			return Constants.OK;
		} catch (Exception e) {
			e.printStackTrace();
			return e.getMessage();
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}
		}
	}

	public String saveAllAnswers(Map<Integer, AnswerSet> ansmap,
			String user_id, String testType)
			throws MySQLIntegrityConstraintViolationException {

		Session session = null;
		try {
			if (!testType.equals(Constants.TEST_DEMO)) {
				session = super.getSession();
				session.beginTransaction();

				Set<Integer> set = ansmap.keySet();
				Iterator<Integer> it = set.iterator();
				while (it.hasNext()) {
					AnswerSet ansset = ansmap.get(it.next());
					AnswerMemo memo = new AnswerMemo();

					Topics topic = new Topics();
					topic.setTopic_id(ansset.getTopic_id());
					memo.setTopic_id(topic);

					Questions question = new Questions();
					question.setQuestion_id(ansset.getQues_id());
					memo.setQues_id(question);

					User user = new User();
					user.setId(Long.parseLong(user_id));
					memo.setUser_id(user);

					memo.setOpt_id(ansset.getOption());
					memo.setTesttype(testType);				 
					session.save(memo);

				}

				session.getTransaction().commit();
			}
			// Change status to finish
			AdminDao.getInstance().changeStudentStatus(Long.parseLong(user_id),
					Constants.TEST_GIVEN, testType);

			return Constants.OK;
		} catch (Exception e) {
			e.printStackTrace();
			return e.getMessage();
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}
		}
	}

}
