package com.bizofficer.apiweb.testdetail;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
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.PgprepTestDetails;
import com.bizofficer.hibernate.entity.PgprepTestSummary;
import com.bizofficer.hibernate.entity.QbAssessmentItem;
import com.bizofficer.hibernate.entity.QbGroupedItem;
import com.bizofficer.module.questioncd.QuestionMapperBeanCD;
import com.bizofficer.module.questioncd.XmlToJsonCD;
import com.bizofficer.util.module.BeanQuestion;
import com.bizofficer.util.module.QuestionHtml;



@Service
public class ResultSelfTestAPIService{
	
	private static final Logger logger = Logger.getLogger(ResultSelfTestAPIService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
    DataSource appDataSource;
    Connection conn;
    PreparedStatement ps;
    ResultSet rs;
    
	public List<?> doExecute(Object obj) throws NotFoundException{
		BeanTesting objBean = (BeanTesting) obj; 	
		List<TestingPageBean> dataList = new ArrayList<TestingPageBean>();
		
		try {

			if(objBean.getTestSession()==null) {
				return dataList;
			}
			
			logger.info("ResultSelfTestAPIService Test Session: "+objBean.getTestSession() );
		
			List<QuestionNumbersBean> questionNumbersList = new ArrayList<QuestionNumbersBean>();
			List<SectionSetBean> sectionSetList = new ArrayList<SectionSetBean>();
			SectionSetBean sectionSetBeanObj = new SectionSetBean();
			List<QuestionSetBean> questionSetList = new ArrayList<QuestionSetBean>();
			
			EntityManager entityManager = entityManagerFactory.createEntityManager();
			entityManager.getTransaction().begin();
			
			TestingPageBean testingPageBeanObj = new TestingPageBean();
			
			int questionIndex = 0;
			
				TypedQuery<PgprepTestSummary> queryTS = (TypedQuery<PgprepTestSummary>) entityManager.createQuery("from "+PgprepTestSummary.class.getName()+" where testSession=:testSession", PgprepTestSummary.class);
				queryTS.setParameter("testSession", objBean.getTestSession());			
				queryTS.setFirstResult(0);
				queryTS.setMaxResults(1);
				List<?> resultListTS = queryTS.getResultList();
				Iterator<?> iteratorTS = resultListTS.iterator();
				if(iteratorTS.hasNext()){
					PgprepTestSummary myObjTS = (PgprepTestSummary)iteratorTS.next();
					
					logger.info( "Self Test: " +   myObjTS.getTestTitle() );
					
					testingPageBeanObj.setTestId(myObjTS.getTestRootId());
					testingPageBeanObj.setTestName(myObjTS.getTestTitle());	
					testingPageBeanObj.setTestType(myObjTS.getTestType());
					testingPageBeanObj.setModelTestId(myObjTS.getTestNodeId());
					testingPageBeanObj.setSectionLock("No_Lock");
					testingPageBeanObj.setTotalTime(myObjTS.getTotalTime());
					testingPageBeanObj.setRemainingTime(myObjTS.getTotalTime());
					
					if(myObjTS.getAnswerDivision()!=null && myObjTS.getAnswerDivision().length()>0) {
						String[] answeredArr = myObjTS.getAnswerDivision().split("\\|");
						testingPageBeanObj.setCorrectCount(Integer.valueOf(answeredArr[0]));
						testingPageBeanObj.setIncorrectCount(Integer.valueOf(answeredArr[1]));
						testingPageBeanObj.setNotAnsweredCount(Integer.valueOf(answeredArr[2]));
					}
					if(myObjTS.getMarksDivision()!=null && myObjTS.getMarksDivision().length()>0) {
						String[] marksArr = myObjTS.getMarksDivision().split(";");
						objBean.setMarksCorrectAnswer(Double.valueOf(marksArr[0]));
						objBean.setMarksIncorrectAnswer(Double.valueOf(marksArr[1]));
						objBean.setMarksNotAttempted(Double.valueOf(marksArr[2]));
					}
					
					logger.info( "Self Test Marks Division: " +   myObjTS.getMarksDivision() );
					
				}
			
				sectionSetBeanObj = new SectionSetBean();
				
				///logger.info( "Self Test Topic: " +   objBean.getSearchQuery() );
				
				
				
				TypedQuery<PgprepTestDetails> queryQBI = (TypedQuery<PgprepTestDetails>) entityManager.createQuery("from "+PgprepTestDetails.class.getName()+" where testSession=:testSession ", PgprepTestDetails.class);
				queryQBI.setParameter("testSession", objBean.getTestSession());
				List<?> resultListQBI = queryQBI.getResultList();
				Iterator<?> iteratorQBI = resultListQBI.iterator();				
				while(iteratorQBI.hasNext()){
					PgprepTestDetails myObjQBI = (PgprepTestDetails)iteratorQBI.next();

					logger.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
					logger.info("QbItems Item Id: "+myObjQBI.getItemId());
					
					TypedQuery<QbAssessmentItem> queryASTM = (TypedQuery<QbAssessmentItem>) entityManager.createQuery("from "+QbAssessmentItem.class.getName()+" where assessId="+myObjQBI.getAssessId(), QbAssessmentItem.class);
					queryASTM.setFirstResult(0);
					queryASTM.setMaxResults(1);
					List<?> resultListASTM = queryASTM.getResultList();
					Iterator<?> iteratorASTM = resultListASTM.iterator();
					if(iteratorASTM.hasNext()){
						QbAssessmentItem myObjASTM = (QbAssessmentItem)iteratorASTM.next();
						
						logger.info("QbAssessmentItem Assess Id: "+myObjASTM.getAssessId());
						
						//*******************************************************************************
						//	COMMON DATA QUESTION TYPE
						//*******************************************************************************
						if(("Common Data".equals(myObjASTM.getAssessTitle()) || "Common Data (5)".equals(myObjASTM.getAssessTitle()))  ) {

							QuestionMapperBeanCD questionObj = (QuestionMapperBeanCD) new XmlToJsonCD().parse(myObjASTM.getAssessText());
							
								TypedQuery<QbGroupedItem> queryGBGI = (TypedQuery<QbGroupedItem>) entityManager.createQuery("from "+QbGroupedItem.class.getName()+" where itemId="+myObjQBI.getItemId(), QbGroupedItem.class);
								List<?> resultListGBGI = queryGBGI.getResultList();
								Iterator<?> iteratorGBGI = resultListGBGI.iterator();
								if(iteratorGBGI.hasNext()){
									QbGroupedItem myObjGBGI = (QbGroupedItem)iteratorGBGI.next();
									///logger.info("Item ID >> " + myObjGBGI.getItemId()  );
									
									//*******************************************************************************
									//	QUESTION SET START
									//*******************************************************************************
									QuestionSetBean questionSetBeanObj = new QuestionSetBean();
									
									logger.info("QbGroupedItem Assess Id: "+myObjGBGI.getItemId()*10000);
									logger.info("QbGroupedItem Assess Title: "+myObjGBGI.getItemTitle());
									logger.info(" PASSING TO PARSER ");
									logger.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");						
									
									BeanQuestion bqObj = new BeanQuestion();
									bqObj.setQuestionId(myObjGBGI.getItemId()*10000);
									bqObj.setItemId(myObjGBGI.getItemId());
									bqObj.setQuestionDisplayId(String.valueOf(myObjGBGI.getDisplayId()));
									bqObj.setQuestionType(myObjGBGI.getItemTitle());
									bqObj.setQuestionTypeLabel(myObjGBGI.getItemTitle());
									bqObj.setQuestionBody(myObjGBGI.getItemText());
									bqObj.setCommonDataDescription(questionObj.getItem().getDescription());
									////bqObj.setCommonDataDescription("Consider an ionic solid that dissolves in water according");

									questionSetBeanObj = new QuestionHtml().getXmlParser(bqObj,true);
									
									questionSetBeanObj.setStudentResponse(myObjQBI.getAnswerGiven());
									
									questionSetBeanObj.setTopicId(String.valueOf(myObjQBI.getTopicId()));
									
									questionSetBeanObj.setCorrectAnswerMarks(objBean.getMarksCorrectAnswer());
									questionSetBeanObj.setIncorrectAnswerMarks(objBean.getMarksIncorrectAnswer());
									questionSetBeanObj.setNotAnswerMarks(objBean.getMarksNotAttempted());
									
									QuestionNumbersBean questionNumbersBeanObj = new QuestionNumbersBean();
									questionNumbersBeanObj.setQuestionIndex(questionIndex);
									questionNumbersBeanObj.setQuestionId(myObjGBGI.getItemId()*10000);
									questionNumbersBeanObj.setAnswerStatus(myObjQBI.getStatus());
									questionNumbersList.add(questionNumbersBeanObj);
									
									questionSetList.add(questionSetBeanObj);
									
									logger.info("questionIndex: "+questionIndex);
									
									questionIndex++;
									
									//*******************************************************************************
									//	QUESTION SET END
									//*******************************************************************************

								}
								
						//*******************************************************************************
						//	OTHER QUESTION TYPES THAN COMMON DATA
						//*******************************************************************************
						}else{							
							
							
							//*******************************************************************************
							//	QUESTION SET START
							//*******************************************************************************
							QuestionSetBean questionSetBeanObj = new QuestionSetBean();
							
							logger.info("QbGroupedItem Assess Id: "+myObjASTM.getAssessId());
							logger.info("QbGroupedItem Assess Title: "+myObjASTM.getAssessTitle());
							logger.info(" PASSING TO PARSER ");
							logger.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");						
							
							BeanQuestion bqObj = new BeanQuestion();
							bqObj.setQuestionId(myObjASTM.getAssessId());
							bqObj.setItemId(null);
							bqObj.setQuestionDisplayId(String.valueOf(myObjASTM.getDisplayId()));
							bqObj.setQuestionType(myObjASTM.getAssessTitle());
							bqObj.setQuestionTypeLabel(myObjASTM.getAssessTitle());
							bqObj.setQuestionBody(myObjASTM.getAssessText());
							bqObj.setCommonDataDescription(null);

							questionSetBeanObj = new QuestionHtml().getXmlParser(bqObj,true);
							
							questionSetBeanObj.setStudentResponse(myObjQBI.getAnswerGiven());
							
							questionSetBeanObj.setTopicId(String.valueOf(myObjQBI.getTopicId()));
							
							questionSetBeanObj.setCorrectAnswerMarks(objBean.getMarksCorrectAnswer());
							questionSetBeanObj.setIncorrectAnswerMarks(objBean.getMarksIncorrectAnswer());
							questionSetBeanObj.setNotAnswerMarks(objBean.getMarksNotAttempted());
							
							QuestionNumbersBean questionNumbersBeanObj = new QuestionNumbersBean();
							questionNumbersBeanObj.setQuestionIndex(questionIndex);
							questionNumbersBeanObj.setQuestionId(myObjASTM.getAssessId());
							questionNumbersBeanObj.setAnswerStatus(myObjQBI.getStatus());
							questionNumbersList.add(questionNumbersBeanObj);
							
							questionSetList.add(questionSetBeanObj);
							
							logger.info("questionIndex: "+questionIndex);
							
							questionIndex++;							
							//*******************************************************************************
							//	QUESTION SET END
							//*******************************************************************************
						
						} /// ELSE CLOSE OF OTHER QUESITION TYPES
						
						
						
						
						
						
					}					
				}	
				
				
				sectionSetBeanObj.setQuestionNumbers(questionNumbersList);
				sectionSetList.add(sectionSetBeanObj);
				
			
			testingPageBeanObj.setSectionSet(sectionSetList);
			testingPageBeanObj.setQuestionSet(questionSetList);
			dataList.add(testingPageBeanObj);
			
			entityManager.getTransaction().commit();
			entityManager.close();
			
			logger.info("**************************************************************************");
			
			if(sectionSetList!=null) {
				logger.info("sectionSetList Count: "+sectionSetList.size());
			}
			
			if(questionSetList!=null) {
				logger.info("questionSetList Count: "+questionSetList.size());
			}
			
			logger.info("SELF TEST RESULT CREATED");
			
			logger.info("**************************************************************************");
			
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		////logger.info( "dataList >>> " +  dataList );
			
		return dataList;
	}
	

	
	
	
	
	
}
