package com.eassessment.model;

import java.util.Date;
import java.util.List;

 

import org.hibernate.classic.Session;

import com.eassessment.pojo.AnswerMemo;
import com.eassessment.pojo.Options;
import com.eassessment.pojo.Questions;
import com.eassessment.pojo.Topics;
import com.eassessment.pojo.User;
import com.eassessment.util.Constants;
import com.eassessment.util.StringUtil;

import org.hibernate.Criteria;
import org.hibernate.Query;
public class AdminDao extends BaseDao {
	private static AdminDao adminDao = new AdminDao();

	private AdminDao() {

	}

	public static AdminDao getInstance() {
		if (adminDao == null) {
			adminDao = new AdminDao();
		}
		return adminDao;
	}

	public boolean approveStudent(Long id, int status) {
		Session session = null;
		try {
			session = super.getSession();
			session.beginTransaction();
			User user = (User) session.get(User.class, id);
			user.setStatus(status);
			session.update(user);
			session.getTransaction().commit();
			session.evict(user);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}
	
	public boolean changeStudentStatus(Long id, int status, String testType) {
		Session session = null;
		try {
			session = super.getSession();
			session.beginTransaction();
			User user = (User) session.get(User.class, id);
			if(testType.equals(Constants.TEST_REAL)){
				user.setStatus(status);
			}else if(testType.equals(Constants.TEST_DEMO)){
				user.setDemostatus(status);
			}
			user.setTestdate(new Date());
			session.update(user);
			session.getTransaction().commit();
			session.evict(user);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}

	 
	public List<?> getUserList(String sqlquery) {
		List<?> userlist=null;
		Session session = null;
		try {
			session = super.getSession();
			Query query=(Query)  session
					.createSQLQuery(sqlquery);
					 
			query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
			userlist=query.list();
			session.evict(userlist);

			return userlist;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}
	
	public List<User> getPendingUser() {

		Session session = null;
		try {
			session = super.getSession();
			List<User> user = session
					.createQuery(
							"FROM User where role='" + Constants.ROLE_STUDENT
									+ "' order by status,id").setMaxResults(100)
					.list();

			session.evict(user);

			return user;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}

	public List<AnswerMemo> getDistinctAnswerMemo(String testType) {

		Session session = null;
		try {
			session = super.getSession();
			List<AnswerMemo> userans = session
					.createQuery("from AnswerMemo where testtype=? group by user_id").setParameter(0, testType).list();

			session.evict(userans);

			return userans;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}
	
	public List<AnswerMemo> getAnswerMemoUser(String whereclause) {

		Session session = null;
		try {
			
			session = super.getSession();		
			List<AnswerMemo> userans = session
					.createQuery("from AnswerMemo "+ whereclause).list();

			session.evict(userans);

			return userans;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}
	
	public List<AnswerMemo> getAnswerMemo(String userid, String testType) {

		Session session = null;
		try {
			
			session = super.getSession();		
			List<AnswerMemo> userans = session
					.createQuery("from AnswerMemo where user_id.id=? and testtype=? group by topic_id.topic_id , ques_id.question_id")
					.setParameter(0, Long.parseLong(userid)).setParameter(1, testType).list();

			session.evict(userans);

			return userans;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}
	public List<Options> getOptions(int quesId) {

		Session session = null;
		try {
			session = super.getSession();
			List<Options> optList = session.createQuery(
					"FROM Options where questions=" + quesId).list();

			session.evict(optList);

			return optList;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}

	public Topics getTopic(String id) {
		Session session = null;
		Topics topic = null;
		try {
			session = super.getSession();

			topic = (Topics) session.get(Topics.class, Integer.parseInt(id));

			session.evict(topic);
			return topic;
		} catch (Exception e) {
			e.printStackTrace();
			return topic;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}
	}

	public List<Topics> getMainTopic() {

		Session session = null;
		try {
			session = super.getSession();
			List<Topics> mainTopic = session.createQuery("FROM Topics").list();
			//List<Topics> mainTopic = session.createQuery("FROM Topics where topic_id=7").list();
			System.out.println("Total topic="+mainTopic.size());
			session.evict(mainTopic);
			return mainTopic;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}

	public User isValidUser(String user, String pass) {

		Session session = null;
		try {
			session = super.getSession();
			User userRecord = (User) session
					.createQuery("FROM User where username=? and password=?")
					.setParameter(0, user).setParameter(1, pass).uniqueResult();

			session.evict(userRecord);
			return userRecord;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}

	public User getUser(String userid) {

		Session session = null;
		try {
			session = super.getSession();
			User userRecord = (User) session
					.createQuery("FROM User where id=?")
					.setParameter(0, Long.parseLong(userid)).uniqueResult();

			session.evict(userRecord);
			return userRecord;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}
	
	public User getUserByName(String username) {

		Session session = null;
		try {
			session = super.getSession();
			User userRecord = (User) session
					.createQuery("FROM User where username=?")
					.setParameter(0, username).uniqueResult();

			session.evict(userRecord);
			//System.out.println("====>"+userRecord);
			return userRecord;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}

	public Questions getQuestion(String id) {
		Session session = null;
		Questions question = null;
		try {
			session = super.getSession();

			question = (Questions) session.get(Questions.class,
					Integer.parseInt(id));

			session.evict(question);
			return question;
		} catch (Exception e) {
			e.printStackTrace();
			return question;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}
	}

	public Options getOption(String id) {
		Session session = null;
		Options option = null;
		try {
			session = super.getSession();

			option = (Options) session.get(Options.class, Integer.parseInt(id));

			session.evict(option);
			return option;
		} catch (Exception e) {
			e.printStackTrace();
			return option;
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}
	}

	public String newRegistration(User user) {
		 
		if(AdminDao.getInstance().getUserByName(user.getUsername())!=null){
			return Constants.USERNAME_EXIST_MESSGE;
		}
		Session session = null;
		try {
			session = super.getSession();
			session.beginTransaction();

			session.save(user);
			session.getTransaction().commit();
			session.evict(user);
			return Constants.OK;
		} catch (Exception e) {
			e.printStackTrace();
			return e.getMessage();
		} finally {
			try {
				if (session.isOpen()) {
					session.close();
				}
			} catch (Exception e) {

			}

		}

	}
}
