package com.bizofficer.teacher.schedule;

import java.sql.Connection;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.TypedQuery;
import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException;
import org.springframework.stereotype.Service;

import com.bizofficer.hibernate.entity.PgprepScheduleClassTest;
import com.bizofficer.hibernate.repository.PgprepScheduleClassTestRepository;
import com.bizofficer.util.system.MakeDate;


@Service
public class SaveScheduleService{
	
	private static final Logger logger = Logger.getLogger(SaveScheduleService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepScheduleClassTestRepository sctRepoObj;
	
	@Autowired
    DataSource appDataSource;
    Connection conn;
	
	public Object doExecute(Object obj) throws NotFoundException{
		BeanSchedule objBean = (BeanSchedule) obj; 	
		SaveScheduleResponseBean dataObj = new SaveScheduleResponseBean();
		
		try {
		
			dataObj.setResponseTxt("failed");
			
			if(objBean.getLoginId()==null || objBean.getTestDateTime()==null) {
				return dataObj;
			}
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			MakeDate mkdate = new MakeDate();
			
			logger.info("Id: "+objBean.getId());
			logger.info("Teacher Login Id: "+objBean.getLoginId());
			logger.info("testTitle: "+objBean.getTestTitle());
			logger.info("topicTestId: "+objBean.getTopicTestId());
			logger.info("Topic Id: "+objBean.getTopicId());
			logger.info("className: "+objBean.getClassName());
			logger.info("totalTime: "+objBean.getTotalTime());
			logger.info("testDateTime: "+objBean.getTestDateTime());
			logger.info("markCorrectAns: "+objBean.getMarkCorrectAns());
			logger.info("markIncorrectAns: "+objBean.getMarkIncorrectAns());
			logger.info("markNotAttempt: "+objBean.getMarkNotAttempt());
			
			if(objBean.getMarkCorrectAns()<1) {
				objBean.setMarkCorrectAns(Double.valueOf(1));
			}
			if(objBean.getTotalTime()<5) {
				objBean.setTotalTime(5);
			}
			if(objBean.getTestTitle()==null || objBean.getTestTitle().length()<3) {
				objBean.setTestTitle("Class Test");
			}
			
			Long autoTestId = null;
			String whereQry="";
			if(objBean.getId()!=null && objBean.getId()>0) {
				whereQry=" AND id!=:id ";
			}
			///CHECK MULTIPLE TEST CAN BE SET AT SAME DATE AND TIME
			TypedQuery<PgprepScheduleClassTest> querySCT = (TypedQuery<PgprepScheduleClassTest>) entityManager.createQuery("from "+PgprepScheduleClassTest.class.getName()+" where createdById=:createdById AND topicTestId=:topicTestId AND className=:className AND testDateTime=:testDateTime "+whereQry, PgprepScheduleClassTest.class);
			querySCT.setParameter("createdById", objBean.getLoginId());
			querySCT.setParameter("topicTestId", objBean.getTopicTestId());
			querySCT.setParameter("className", objBean.getClassName());
			querySCT.setParameter("testDateTime", mkdate.getStringToDate(objBean.getTestDateTime(), "yyyy-MM-dd HH:mm:ss"));
			if(objBean.getId()!=null && objBean.getId()>0) {
				querySCT.setParameter("id", objBean.getId());
			}
			querySCT.setFirstResult(0);
			querySCT.setMaxResults(1);
			List<?> resultListSCT = querySCT.getResultList();
			Iterator<?> iteratorSCT=resultListSCT.iterator();
			if(iteratorSCT.hasNext()) {
				dataObj.setResponseTxt("AlreadyExistsError");
				logger.info("**************************************************************");
				logger.info("AlreadyExistsError");
				logger.info("Teacher Id: "+objBean.getLoginId());
				logger.info("**************************************************************");

			}else{
			
				PgprepScheduleClassTest saveObj = null;
				if(objBean.getId()!=null && objBean.getId()>0) {
					saveObj = (PgprepScheduleClassTest)entityManager.find(PgprepScheduleClassTest.class ,objBean.getId());
				}else {
					saveObj = new PgprepScheduleClassTest();
				}
				
				saveObj.setTestTitle(objBean.getTestTitle());				
				saveObj.setTotalTime(objBean.getTotalTime());
				
				if(objBean.getTestDateTime()!=null && objBean.getTestDateTime().length()>5) {
					saveObj.setTestDateTime(mkdate.getStringToDate(objBean.getTestDateTime(), "yyyy-MM-dd HH:mm:ss"));
				}
				
				saveObj.setMarkCorrectAns(objBean.getMarkCorrectAns());
				saveObj.setMarkIncorrectAns(objBean.getMarkIncorrectAns());
				saveObj.setMarkNotAttempt(objBean.getMarkNotAttempt());
				
				saveObj.setTotalMark(objBean.getTotalQuestion()*objBean.getMarkCorrectAns());
				saveObj.setSubject(objBean.getSubject());
				
				if(objBean.getId()!=null && objBean.getId()>0) {
					entityManager.getTransaction().commit();
					autoTestId = objBean.getId();
				}else {
					saveObj.setScheduleId(UUID.randomUUID().toString().replaceAll("-", "")+"-"+objBean.getTopicTestId());
					saveObj.setTopicTestId(objBean.getTopicTestId());
					saveObj.setClassName(objBean.getClassName());
					saveObj.setSchoolName(objBean.getSchoolName());
					saveObj.setSchoolId(objBean.getSchoolId());
					
					
//					if(objBean.getTopicId()!=null && objBean.getTopicId()>0) {
//						saveObj.setSubject(this.getTopTopicTitleByTopicId(objBean.getTopicId().toString()));
//						
//					}
					
					saveObj.setTotalQuestion(objBean.getTotalQuestion());					
					saveObj.setQuestionType(objBean.getQuestionType());
					saveObj.setCreatedDateTime(mkdate.getCurrentTimeStamp());
					saveObj.setCreatedById(objBean.getLoginId());
					PgprepScheduleClassTest resultObj = sctRepoObj.save(saveObj);
					autoTestId = resultObj.getId();
				}
			
				if(autoTestId!=null && autoTestId>0){
					
					dataObj.setResponseTxt("OK");
					logger.info("**************************************************************");
					logger.info("Successfully Teacher Login Id: "+objBean.getLoginId());
					logger.info("**************************************************************");
					
				}
				
			}	
			
			entityManager.getTransaction().commit();
			entityManager.close();
			
			
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		///logger.info( "dataList >>> " +  dataList );
			
		return dataObj;
	}
	
	
//	private String getTopTopicTitleByTopicId(String topicId) {
//		String path = "";
//		
//		try {
//	        conn = appDataSource.getConnection();
//	        if (conn != null) {
//		
//		    	PreparedStatement ps = conn.prepareStatement("SELECT a.childnode_name FROM "+MysqlTableNames.getPgprepAssessmentTreeview()+" a where a.path=(SELECT substring_index(b.path,'.',1) FROM "+MysqlTableNames.getPgprepAssessmentTreeview()+" b where b.childnode_id=?)");
//		        ps.setString(1, topicId);
//		        ResultSet myTopic = ps.executeQuery();	
//		        logger.info("SaveScheduleService: " + ps);
//		        if (myTopic.next()) {
//		        	logger.info("Top Topic Title: " + myTopic.getString("childnode_name") );
//		        	path = myTopic.getString("childnode_name");
//		        }
//		        myTopic.close();
//		        ps.close();
//		        
//	        }     
//	        conn.close();
//			
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		
//		return path;
//	}

	
}
