package com.bizofficer.apiweb.teststop;



import java.math.BigDecimal;
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 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.PgprepTestSummary;
import com.bizofficer.hibernate.repository.PgprepTestDetailsRepository;
import com.bizofficer.hibernate.repository.PgprepTestSummaryRepository;
import com.bizofficer.util.system.MakeDate;



@Service
public class TestStopService{
	
	private static final Logger logger = Logger.getLogger(TestStopService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepTestDetailsRepository tdRepoObj;
	
	@Autowired
	PgprepTestSummaryRepository tsRepoObj;
	
	public Object save(Object obj) throws NotFoundException{
		TestStopBean objBean = (TestStopBean) obj; 	
		TestStopResponseBean testSubmitResponseBeanObj = new TestStopResponseBean();
		
		try {
			testSubmitResponseBeanObj.setResponseTxt("failed");
			
			if(objBean.getOrganisationId()==null || objBean.getStudentId()==null || objBean.getTestName()==null || objBean.getTestDetail()==null) {
				return testSubmitResponseBeanObj;
			}
			
			logger.info("TestStopService Organisation Id: "+objBean.getOrganisationId() );
			logger.info("TestStopService Student Id: "+objBean.getStudentId() );
			logger.info("TestStopService Test Name: "+objBean.getTestName() );
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			MakeDate makeDateObj = new MakeDate();
			
			Long testSummaryId = null;
			
			TypedQuery<PgprepTestSummary> query = (TypedQuery<PgprepTestSummary>) entityManager.createQuery("from "+PgprepTestSummary.class.getName()+" where testStatus=0 and organisationId=:organisationId and studentId=:studentId and testSession=:testSession order by id desc ", PgprepTestSummary.class);
			query.setParameter("organisationId", objBean.getOrganisationId()); 
			query.setParameter("studentId", objBean.getStudentId()); 
			query.setParameter("testSession", objBean.getTestSession());
			query.setFirstResult(0);
			query.setMaxResults(1);
			List<?> resultListCat = query.getResultList();
			Iterator<?> iteratorCat=resultListCat.iterator();	
			if(iteratorCat.hasNext()){
				PgprepTestSummary myObj = (PgprepTestSummary)iteratorCat.next();
				testSummaryId = myObj.getId();
			}

			if(testSummaryId!=null) {
				PgprepTestSummary saveObj = (PgprepTestSummary)entityManager.find(PgprepTestSummary.class ,testSummaryId);
				saveObj.setTestDetail(objBean.getTestDetail());
				saveObj.setEndDate(makeDateObj.getCurrentTimeStamp());
				entityManager.getTransaction().commit();				
			}else {			
				
				/// DELETE IF EXIST INCOMPLETE TEST
				TypedQuery<PgprepTestSummary> querya = (TypedQuery<PgprepTestSummary>) entityManager.createQuery("from "+PgprepTestSummary.class.getName()+" where testStatus=0 and organisationId=:organisationId and studentId=:studentId order by id desc ", PgprepTestSummary.class);
				querya.setParameter("organisationId", objBean.getOrganisationId()); 
				querya.setParameter("studentId", objBean.getStudentId()); 
				querya.setFirstResult(0);
				querya.setMaxResults(1);
				List<?> resultList = querya.getResultList();
				Iterator<?> iterator=resultList.iterator();	
				if(iterator.hasNext()){
					PgprepTestSummary myObj = (PgprepTestSummary)iterator.next();
					PgprepTestSummary enquiryb = entityManager.find(PgprepTestSummary.class, myObj.getId());
					if(enquiryb != null){					
						entityManager.remove(enquiryb);
						entityManager.getTransaction().commit();
			        }
				}
				
				PgprepTestSummary  saveTSObj = new PgprepTestSummary();
				saveTSObj.setOrganisationId(objBean.getOrganisationId());
				saveTSObj.setTestSession(UUID.randomUUID().toString());
				saveTSObj.setStudentId(objBean.getStudentId());
				saveTSObj.setTestTitle(objBean.getTestName());
				saveTSObj.setTestDetail(objBean.getTestDetail());
				saveTSObj.setTestRootId(0);
				saveTSObj.setTestNodeId(0);
				saveTSObj.setTestType(0);				
				saveTSObj.setTestOption(0);
				saveTSObj.setAnswerDivision("");
				saveTSObj.setTotalTime(0);
				saveTSObj.setTimeSpent(0);
				saveTSObj.setMarksDivision("");				
				saveTSObj.setFullMarks(new BigDecimal(0));
				saveTSObj.setMarksObtain(new BigDecimal(0));
				saveTSObj.setStartDate(makeDateObj.getCurrentTimeStamp());
				saveTSObj.setEndDate(makeDateObj.getCurrentTimeStamp());
				saveTSObj.setTestStatus(0);
				saveTSObj.setLastVisitedQuestion(0);
				saveTSObj.setTotalQuestion(0);
				PgprepTestSummary resultObj = tsRepoObj.save(saveTSObj);
				testSummaryId = resultObj.getId();
				
			}	
				
				if(testSummaryId!=null && testSummaryId>0) {
					testSubmitResponseBeanObj.setResponseTxt("OK");
					
					logger.info("**************************************************************");
					logger.info("Test Stopped successfully. Student Id: "+objBean.getStudentId());
					logger.info("**************************************************************");
					
				}
			
				entityManager.getTransaction().commit();
				entityManager.close();
				
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		
		return testSubmitResponseBeanObj;
	}
	
	
	
	
}
