package com.bizofficer.teacher.schedule;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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.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.module.MysqlTableNames;
import com.bizofficer.util.system.MakeDate;


@Service
public class SaveScheduleServicebk{
	
	@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();
			
			System.out.println("SaveScheduleService Id: "+objBean.getId());
			System.out.println("SaveScheduleService Teacher Login Id: "+objBean.getLoginId());
			System.out.println("SaveScheduleService testTitle: "+objBean.getTestTitle());
			System.out.println("SaveScheduleService topicTestId: "+objBean.getTopicTestId());
			System.out.println("SaveScheduleService className: "+objBean.getClassName());
			System.out.println("SaveScheduleService totalTime: "+objBean.getTotalTime());
			System.out.println("SaveScheduleService testDateTime: "+objBean.getTestDateTime());
			System.out.println("SaveScheduleService markCorrectAns: "+objBean.getMarkCorrectAns());
			System.out.println("SaveScheduleService markIncorrectAns: "+objBean.getMarkIncorrectAns());
			System.out.println("SaveScheduleService 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");
				System.out.println("**************************************************************");
				System.out.println("SaveScheduleService AlreadyExistsError");
				System.out.println("SaveScheduleService Teacher Id: "+objBean.getLoginId());
				System.out.println("**************************************************************");

			}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());
				
				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.setTotalMark(objBean.getTotalQuestion()*objBean.getMarkCorrectAns());
					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");
					System.out.println("**************************************************************");
					System.out.println("SaveScheduleService Successfully Teacher Login Id: "+objBean.getLoginId());
					System.out.println("**************************************************************");
					
				}
				
			}	
			
			entityManager.getTransaction().commit();
			entityManager.close();
			
			
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		///System.out.println( "dataList >>> " +  dataList );
			
		return dataObj;
	}
	
	
	private String getTopTopicTitleByTopicId(String topicId) {
		String path = "";
		
		try {
	        conn = appDataSource.getConnection();
	        if (conn != null) {
		
		    	PreparedStatement ps = conn.prepareStatement("SELECT a.topic_title FROM "+MysqlTableNames.getPgprepAssessmentTreeview()+" a where a.path=(SELECT substring_index(b.path,'.',1) FROM "+MysqlTableNames.getPgprepAssessmentTreeview()+" b where b.topic_id=?)");
		        ps.setString(1, topicId);
		        ResultSet myTopic = ps.executeQuery();	
		        System.out.println("SaveScheduleService: " + ps);
		        if (myTopic.next()) {
		        	System.out.println("Top Topic Title: " + myTopic.getString("topic_title") );
		        	path = myTopic.getString("topic_title");
		        }
		        myTopic.close();
		        ps.close();
		        
	        }     
	        conn.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return path;
	}
	
}
