package com.bizofficer.teacher.schedule;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManagerFactory;
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.apiweb.testdetail.BeanTesting;
import com.bizofficer.apiweb.testdetail.QuestionNumbersBean;
import com.bizofficer.apiweb.testdetail.QuestionSetBean;
import com.bizofficer.apiweb.testdetail.SectionSetBean;
import com.bizofficer.apiweb.testdetail.TestingPageBean;
import com.bizofficer.hibernate.entity.PgprepCacheTopictest;
import com.bizofficer.hibernate.repository.PgprepCacheTopictestRepository;
import com.bizofficer.hibernate.repository.PgprepTestSummaryRepository;
import com.bizofficer.module.questioncd.QuestionMapperBeanCD;
import com.bizofficer.module.questioncd.XmlToJsonCD;
import com.bizofficer.pojo.response.ListResponsePojo;
import com.bizofficer.util.module.BeanQuestion;
import com.bizofficer.util.module.MysqlTableNames;
import com.bizofficer.util.module.QuestionHtml;
import com.google.gson.Gson;



@Service
public class TeacherTopicTestAPIService{
	
	private static final Logger logger = Logger.getLogger(TeacherTopicTestAPIService.class);
	
	@Autowired
	EntityManagerFactory entityManagerFactory;
	
	@Autowired
	PgprepTestSummaryRepository pgprepTestSummaryRepoObj; 
	
	@Autowired
	PgprepCacheTopictestRepository objCacheTopictestRepo;
	
	@Autowired
    DataSource appDataSource;
    Connection conn;
    PreparedStatement ps, psX;
    ResultSet rs, rsX;
    
	public Object doExecute(Object obj) throws NotFoundException{
		BeanTesting objBean = (BeanTesting) obj; 	
		ListResponsePojo responseObj = new ListResponsePojo();
		
		try {
			
			responseObj.setResponseTxt("failed");

			if(objBean.getTestId()==null) {
				return responseObj;
			}

			List<TestingPageBean> dataList = new ArrayList<TestingPageBean>();
			
//			PgprepCacheTopictest objCacheTopictest = objCacheTopictestRepo.findByMocktestId(objBean.getTestId());
//			if(objCacheTopictest!=null && objCacheTopictest.getId()>0 && objCacheTopictest.getTestDetail().length()>50) {
//				ObjectMapper mapper = new ObjectMapper();
//				dataList = mapper.readValue(objCacheTopictest.getTestDetail(), new TypeReference<List<TestingPageBean>>(){});
//				logger.info("Topic Test Created From Cache");
//				
//				responseObj.setList(dataList);
//				
//				responseObj.setResponseTxt("success");
//				
//				return responseObj;
//			}
			
			List<QuestionNumbersBean> questionNumbersList = new ArrayList<QuestionNumbersBean>();
			List<SectionSetBean> sectionSetList = new ArrayList<SectionSetBean>();
			SectionSetBean sectionSetBeanObj = new SectionSetBean();
			List<QuestionSetBean> questionSetList = new ArrayList<QuestionSetBean>();
			
			TestingPageBean testingPageBeanObj = new TestingPageBean();
			
			int questionIndex = 0;

            this.conn = this.appDataSource.getConnection();
            if (this.conn != null) {
			
	            this.psX = this.conn.prepareStatement("SELECT m.pattern_id,m.mocktest_title,m.mocktest_id,tpp.total_time,tpp.marks_correct,tpp.marks_incorrect,tpp.marks_not_attempted FROM "+MysqlTableNames.getTopicPatternMocktestAssociation()+" m, "+MysqlTableNames.getTemplateTopicPatternAssociation()+" t, "+MysqlTableNames.getTopicPatternParameter()+" tpp where m.pattern_id=t.pattern_id AND tpp.pattern_id=m.pattern_id AND m.mocktest_id=? ");
	            this.psX.setInt(1, objBean.getTestId());
	            this.rsX = this.psX.executeQuery();
	            if(this.rsX.next()) {

					testingPageBeanObj.setTestId(rsX.getInt("mocktest_id"));
					testingPageBeanObj.setTestName(rsX.getString("mocktest_title"));	
					testingPageBeanObj.setTestType(2);
					testingPageBeanObj.setModelTestId(0);
					testingPageBeanObj.setSectionLock("No_Lock");
					testingPageBeanObj.setLastQuestionIndex(0);
					testingPageBeanObj.setTotalTime(rsX.getInt("total_time"));
					testingPageBeanObj.setRemainingTime(rsX.getInt("total_time")*60);
	        
	    	        String sql = "SELECT m.question_id, m.no_of_question, t.qb_id, q.assess_id, q.assess_title, q.assess_text, q.display_id FROM "+MysqlTableNames.getTopicMocktestGeneratedQuestion()+" m, "+MysqlTableNames.getQbItems()+" t, "+MysqlTableNames.getQbAssessmentItem()+" q WHERE m.question_id=t.item_id AND m.question_id=q.assess_id AND m.mocktest_id=?";
	            	this.ps = this.conn.prepareStatement(sql);
	                this.ps.setInt(1, objBean.getTestId());
	                logger.info("quesions query: " + this.ps);
	                this.rs = this.ps.executeQuery();
	                while (this.rs.next()) {
	                    if (this.rs.getString("assess_title").equals("Common Data") || this.rs.getString("assess_title").equals("Common Data (5)")) {
	                       
							QuestionMapperBeanCD questionObj = (QuestionMapperBeanCD) new XmlToJsonCD().parse(rs.getString("assess_text"));
	                    	
	                    	PreparedStatement ps1 = this.conn.prepareStatement("SELECT * FROM "+MysqlTableNames.getQbGroupedItem()+" WHERE assess_id=? LIMIT " + this.rs.getInt("no_of_question"));
	                        ps1.setInt(1, rs.getInt("question_id"));
	                        ResultSet rs1 = ps1.executeQuery();
	                        while (rs1.next()) {
	                            
								//*******************************************************************************
								//	QUESTION SET START
								//*******************************************************************************
								QuestionSetBean questionSetBeanObj = new QuestionSetBean();
								
								logger.info("Common Data Assess Id: "+rs1.getInt("item_id")*10000);
								logger.info("Common Data Assess Title: "+rs1.getString("item_title"));
								logger.info(" PASSING TO PARSER ");
								logger.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");						
								
								BeanQuestion bqObj = new BeanQuestion();
								bqObj.setQuestionId(rs1.getInt("item_id")*10000);
								bqObj.setItemId(rs1.getInt("item_id"));
								bqObj.setQuestionDisplayId(rs1.getString("display_id"));
								bqObj.setQuestionType(rs1.getString("item_title"));
								bqObj.setQuestionTypeLabel(rs1.getString("item_title"));
								bqObj.setQuestionBody(rs1.getString("item_text"));
								bqObj.setCommonDataDescription(questionObj.getItem().getDescription());
								////bqObj.setCommonDataDescription("Consider an ionic solid that dissolves in water according");

								questionSetBeanObj = new QuestionHtml().getXmlParser(bqObj,false);
								
								questionSetBeanObj.setTopicId(String.valueOf(rs.getInt("qb_id")));
								questionSetBeanObj.setTimeSpent(0);
								questionSetBeanObj.setCssName("qbg-not-visited");
								questionSetBeanObj.setBackgroundImg("url('/not-visited.png')");
								
								questionSetBeanObj.setCorrectAnswerMarks(rsX.getDouble("marks_correct"));
								questionSetBeanObj.setIncorrectAnswerMarks(rsX.getDouble("marks_incorrect"));
								questionSetBeanObj.setNotAnswerMarks(rsX.getDouble("marks_not_attempted"));
								
								QuestionNumbersBean questionNumbersBeanObj = new QuestionNumbersBean();
								questionNumbersBeanObj.setQuestionIndex(questionIndex);
								questionNumbersBeanObj.setQuestionId(rs1.getInt("item_id")*10000);
								questionNumbersList.add(questionNumbersBeanObj);
								
								questionSetList.add(questionSetBeanObj);
								
								logger.info("questionIndex: "+questionIndex);
								
								questionIndex++;
								
								//*******************************************************************************
								//	QUESTION SET END
								//*******************************************************************************
	                            
	                        }
	                        rs1.close();
	                        ps1.close();
	                    } else {
	                        
							//*******************************************************************************
							//	QUESTION SET START
							//*******************************************************************************
							QuestionSetBean questionSetBeanObj = new QuestionSetBean();
							
							logger.info("QbGroupedItem Assess Id: "+rs.getInt("question_id"));
							logger.info("QbGroupedItem Assess Title: "+rs.getString("assess_title"));
							logger.info(" PASSING TO PARSER ");
							logger.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");						
							
							BeanQuestion bqObj = new BeanQuestion();
							bqObj.setQuestionId(rs.getInt("question_id"));
							bqObj.setItemId(null); 
							bqObj.setQuestionDisplayId(String.valueOf(rs.getInt("display_id")));
							bqObj.setQuestionType(rs.getString("assess_title"));
							bqObj.setQuestionTypeLabel(rs.getString("assess_title"));
							bqObj.setQuestionBody(rs.getString("assess_text"));
							bqObj.setCommonDataDescription(null);

							questionSetBeanObj = new QuestionHtml().getXmlParser(bqObj,false);
							
							questionSetBeanObj.setTopicId(String.valueOf(rs.getInt("qb_id")));
							questionSetBeanObj.setTimeSpent(0);
							questionSetBeanObj.setCssName("qbg-not-visited");
							questionSetBeanObj.setBackgroundImg("url('/not-visited.png')");

							questionSetBeanObj.setCorrectAnswerMarks(rsX.getDouble("marks_correct"));
							questionSetBeanObj.setIncorrectAnswerMarks(rsX.getDouble("marks_incorrect"));
							questionSetBeanObj.setNotAnswerMarks(rsX.getDouble("marks_not_attempted"));
							
							QuestionNumbersBean questionNumbersBeanObj = new QuestionNumbersBean();
							questionNumbersBeanObj.setQuestionIndex(questionIndex);
							questionNumbersBeanObj.setQuestionId(rs.getInt("assess_id"));
							questionNumbersList.add(questionNumbersBeanObj);
							
							questionSetList.add(questionSetBeanObj);
							
							logger.info("questionIndex: "+questionIndex);
							
							questionIndex++;							
							//*******************************************************************************
							//	QUESTION SET END
							//*******************************************************************************
	                        
	                    }
	                }
	                rs.close();
	                ps.close();
	            }    
            }

            rsX.close();
            psX.close();
            conn.close();
            
            sectionSetBeanObj.setQuestionNumbers(questionNumbersList);
			sectionSetList.add(sectionSetBeanObj);
                
            testingPageBeanObj.setSectionSet(sectionSetList);	
			testingPageBeanObj.setQuestionSet(questionSetList);
			dataList.add(testingPageBeanObj);
			
			if(dataList!=null && questionSetList.size()>2) {
				Gson gson = new Gson();
				PgprepCacheTopictest objPgprepCacheTopictest = new PgprepCacheTopictest();
				objPgprepCacheTopictest.setMocktestId(objBean.getTestId());
				objPgprepCacheTopictest.setTestDetail(gson.toJson(dataList));
				objCacheTopictestRepo.save(objPgprepCacheTopictest);
				logger.info("CACHE CREATED");
			}
			
			logger.info("**************************************************************************");
			
			if(questionSetList!=null) {
				logger.info("questionSetList Count: "+questionSetList.size());
			}
			
			logger.info("TOPIC TEST API CREATED");
			
			logger.info("**************************************************************************");
			
			responseObj.setList(dataList);
			
			responseObj.setResponseTxt("success");
            
		}catch(Exception e) {
			e.getStackTrace();
		}
		
		////logger.info( "dataList >>> " +  dataList );
			
		return responseObj;
	}
	

	
	
	
	
	
}
