package com.bizofficer.util.module;

import com.bizofficer.apiweb.testdetail.ColumnRowsBean;
import com.bizofficer.apiweb.testdetail.ColumnsBean;
import com.bizofficer.apiweb.testdetail.QuestionSetBean;
import com.bizofficer.apiweb.testdetail.ResponseChoiceBean;
////import com.bizofficer.module.questionmcmt.MaterialTxtBeanMCMT;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

public class QuestionHtml {

	
	public QuestionSetBean getXmlParser(BeanQuestion beanQuesObj, Boolean withAns)
    {
		
		BeanQuestion bqObj = (BeanQuestion) beanQuesObj;
		QuestionSetBean questionSetBeanObj = new QuestionSetBean();

	        try {
	        	
	        	List<ColumnsBean> columnsListMCMT = new ArrayList<ColumnsBean>();
	        	
	        	ResponseChoiceBean responseChoiceBeanObj;
				ColumnsBean columnsBeanObj = null;
				ColumnRowsBean columnRowsBeanObj = null;
				///String shuffle="No";
				
				System.out.println("*********************************************************");
				System.out.println("************** XML PARSER START *************************");
				System.out.println("AA Question ID: "+bqObj.getQuestionId());
                System.out.println("AA Question Type: "+bqObj.getQuestionType());
                System.out.println("*********************************************************");
	        	
	        	questionSetBeanObj = new QuestionSetBean();
				questionSetBeanObj.setQuestionId(bqObj.getQuestionId());
				questionSetBeanObj.setItemId(bqObj.getItemId());
				questionSetBeanObj.setQuestionDisplayId(bqObj.getQuestionDisplayId());
				questionSetBeanObj.setQuestionType(bqObj.getQuestionType().replaceAll(" ", "-"));
				questionSetBeanObj.setQuestionTypeLabel(bqObj.getQuestionTypeLabel());
				questionSetBeanObj.setCommonDataDescription(bqObj.getCommonDataDescription());
	        	
	        	
	            DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
	            
	            if(bqObj.getQuestionId()>0)
	            {
	                String xmlSource = bqObj.getQuestionBody();
	                InputSource is = new InputSource();
	                is.setCharacterStream(new StringReader(xmlSource));
	                Document doc = db.parse(is);
	                NodeList nodes = doc.getElementsByTagName("item");
	                System.out.println("Question ID: "+bqObj.getQuestionId());
	                System.out.println("Question Type: "+bqObj.getQuestionType());
	                String correctAns = "";
	                String explanation="";
	                
	                ///List<TestQuestionOptionDao> optionList = new ArrayList<>();
	                List<ResponseChoiceBean> responseChoiceList = new ArrayList<ResponseChoiceBean>();
	                ////System.out.println("getItemId: "+bqObj.getItemId());
	                /// we are skipping this condition for time being
	                
	                	//*********************************************************************
	                	//				FOR All Type Question Excepts Common Type
	                	//*********************************************************************
	                    for(int i=0; i<nodes.getLength();i++)
	                    {
	                        Node nNode = nodes.item(i);
	                        Element elem = (Element) nNode;
	                        
	                        ////Question = elem.getElementsByTagName("mattext").item(0).getTextContent();	                        
	                        ////System.out.println("Question: "+Question);	
	                        /// 	QUESTION BODY
	                        
	                        ///questionSetBeanObj.setQuestionBody("Testing");
	                        questionSetBeanObj.setQuestionBody(elem.getElementsByTagName("mattext").item(0).getTextContent().trim());
	                        ///System.out.println("QuestionBody: "+elem.getElementsByTagName("mattext").item(0).getTextContent());
	                    }
	                    if(bqObj.getQuestionType().equals("MR Matching Type") || bqObj.getQuestionType().equals("MC Matching Type")) //For Matrix Type Questions
	                    {
	                        ///String otherPartOfQuestionText = "<table class='table table-bordered'>";
	                        NodeList otherPartOfQuestionLeft = doc.getElementsByTagName("left_lid");
	                        NodeList otherPartOfQuestionRight = doc.getElementsByTagName("right_lid");
	                        Node leftPart = otherPartOfQuestionLeft.item(0);
	                        Element elemLeft = (Element) leftPart;
	                        Node rightPart = otherPartOfQuestionRight.item(0);
	                        Element elemRight = (Element) rightPart;
	                       
	                        
	    					/************************
	    					 * COLUMNS START
	    					 ************************/
	    					columnsListMCMT = new ArrayList<ColumnsBean>();
	    					
	    					/************************
	    					 * LEFT COLUMN
	    					 ************************/
	    					columnsBeanObj = new ColumnsBean();								
	    					columnsBeanObj.setColumnHeader(elemLeft.getAttribute("ident").trim());
	    					List<ColumnRowsBean> columnRowsListOne = new ArrayList<ColumnRowsBean>();
	    					NodeList leftPartCont = elemLeft.getElementsByTagName("material");
	    					for(int i = 0; i < leftPartCont.getLength(); i++){
	                            Node leftNode = leftPartCont.item(i);	                            
	                            Element leftElem = (Element) leftNode;
	                            columnRowsBeanObj = new ColumnRowsBean();
    							columnRowsBeanObj.setRowId(leftElem.getAttribute("ident").trim());
    							columnRowsBeanObj.setRowName(leftElem.getElementsByTagName("mattext").item(0).getTextContent().trim());
    							columnRowsListOne.add(columnRowsBeanObj);
	                        }
	    					columnsBeanObj.setColumnRows(columnRowsListOne);								
	    					columnsListMCMT.add(columnsBeanObj);
	    					
	    					
	    					/************************
	    					 * RIGHT COLUMN
	    					 ************************/
	    					columnsBeanObj = new ColumnsBean();								
	    					columnsBeanObj.setColumnHeader(elemRight.getAttribute("ident").trim());
	    					List<ColumnRowsBean> columnRowsListTwo = new ArrayList<ColumnRowsBean>();	
	    					NodeList rightPartCont = elemRight.getElementsByTagName("material");
    						for(int i=0; i<rightPartCont.getLength(); i++) {
    							Node rightNode = rightPartCont.item(i);
	                            Element rightElem = (Element) rightNode;
    							columnRowsBeanObj = new ColumnRowsBean();
    							columnRowsBeanObj.setRowId(rightElem.getAttribute("ident").trim());
    							columnRowsBeanObj.setRowName(rightElem.getElementsByTagName("mattext").item(0).getTextContent().trim());
    							columnRowsListTwo.add(columnRowsBeanObj);
    						}
	    					columnsBeanObj.setColumnRows(columnRowsListTwo);								
	    					columnsListMCMT.add(columnsBeanObj);
	    					
	    					
	    					questionSetBeanObj.setColumns(columnsListMCMT);
	    					
	    					/************************
	    					 * COLUMNS END 
	    					 ************************/
	                                               
	                    }
	                    
	                    
	                    NodeList options = doc.getElementsByTagName("response_label");
	                    for(int j=0; j<options.getLength();j++)
	                    {
	                        Node optNode = options.item(j);
	                        Element elem = (Element) optNode;
	                        
	                        responseChoiceBeanObj = new ResponseChoiceBean();
	                        responseChoiceBeanObj.setResponseId(elem.getAttribute("ident").trim());
	                        if(elem.getElementsByTagName("mattext").item(0)!=null)
	                        {
		                        responseChoiceBeanObj.setResponseText(elem.getElementsByTagName("mattext").item(0).getTextContent().trim());

	                        }
	                        responseChoiceList.add(responseChoiceBeanObj);
	                    }
	                    
	                    
	                    NodeList item_correct_option = doc.getElementsByTagName("respcondition");
	                    Node optCorrectNode = item_correct_option.item(0);
	                    Element elemCorrectAns = (Element) optCorrectNode;
	                    NodeList correct_ans_list = elemCorrectAns.getElementsByTagName("varequal");
	                    for(int ca = 0; ca < correct_ans_list.getLength(); ca++)
	                    {
	                        Node correctAnsNode = correct_ans_list.item(ca);
	                        //System.out.println("Correct Answer Options: "+correctAnsNode.getTextContent());
	                        correctAns += correctAnsNode.getTextContent()+"~";
	                    }
	                    
	                    
	                    //Get Explanation For common Questions
	                    NodeList exp_option = doc.getElementsByTagName("itemfeedback");
	                    if(exp_option!=null)
	                    {
	                        Node exp_node = exp_option.item(0);
	                        Element elemExp = (Element) exp_node;
	                        if(elemExp!=null){
	                            NodeList expList = elemExp.getElementsByTagName("mattext");
	                            for(int e = 0; e < expList.getLength(); e++)
	                            {
	                                Node expNode = expList.item(e);
	                                //System.out.println("Explanation Options: "+expNode.getTextContent());
	                                explanation = expNode.getTextContent().trim();
	                            }
	                        }
	                    }
	                    
	                ///System.out.println("Question Text: "+Question);
	                
	                ///questionSetBeanObj.setQuestionBody(Question);
	                /*if(testQuestion.getUserAnswer()!=null){
	                    if(testQuestion.getUserAnswer().trim().equals("") )
	                    {
	                        Collections.shuffle(optionList);
	                    }
	                }*/
	                questionSetBeanObj.setResponseChoice(responseChoiceList);
	                
	                //Set correct Ans For Common Questions
	                if(correctAns.indexOf("~") != -1){
	                    correctAns = correctAns.substring(0,correctAns.length() - 1);
	                }
	                
	                System.out.println("Correct Response: "+correctAns);
	                
	                if(Boolean.TRUE.equals(withAns)) {
	                	questionSetBeanObj.setCorrectResponse(correctAns);
	                	questionSetBeanObj.setExplanations(explanation);
	                }else {
	                	questionSetBeanObj.setCorrectResponse("");
	                	questionSetBeanObj.setExplanations("");
	                }
	                	                
	                
	            }
	        } catch (ParserConfigurationException ex) {
	            java.util.logging.Logger.getLogger(QuestionHtml.class.getName()).log(Level.SEVERE, null, ex);
	        } catch (SAXException ex) {
	            java.util.logging.Logger.getLogger(QuestionHtml.class.getName()).log(Level.SEVERE, null, ex);
	        } catch (IOException ex) {
	            java.util.logging.Logger.getLogger(QuestionHtml.class.getName()).log(Level.SEVERE, null, ex);
	        }


			System.out.println("*********************************************************");
			System.out.println("BB Question ID: "+bqObj.getQuestionId());
            System.out.println("BB Question Type: "+bqObj.getQuestionType());
			System.out.println("************** XML PARSER END ***************************");
            System.out.println("*********************************************************");
	        
	        return questionSetBeanObj;
		
    }
	
	
	
	public String getAnswerFromXmlParser(String questionBody, String questionType)
    {
		
	        try {
	        	
	        	List<ColumnsBean> columnsListMCMT = new ArrayList<ColumnsBean>();
	        	
	        	ResponseChoiceBean responseChoiceBeanObj;
				ColumnsBean columnsBeanObj = null;
				ColumnRowsBean columnRowsBeanObj = null;
				///String shuffle="No";
				
				System.out.println("************** getAnswerFromXmlParser START *************************");
	        	
	            DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
	            
	            if(questionBody!=null && questionBody.length()>0)
	            {
	                String xmlSource = questionBody;
	                InputSource is = new InputSource();
	                is.setCharacterStream(new StringReader(xmlSource));
	                Document doc = db.parse(is);
	                //NodeList nodes = doc.getElementsByTagName("item");
	                String correctAns = "";
	                //String explanation="";
	                
	                ///List<TestQuestionOptionDao> optionList = new ArrayList<>();
	                List<ResponseChoiceBean> responseChoiceList = new ArrayList<ResponseChoiceBean>();
	                ////System.out.println("getItemId: "+bqObj.getItemId());
	                /// we are skipping this condition for time being
	                
	                	//*********************************************************************
	                	//				FOR All Type Question Excepts Common Type
	                	//*********************************************************************
//	                    for(int i=0; i<nodes.getLength();i++)
//	                    {
//	                        Node nNode = nodes.item(i);
//	                        Element elem = (Element) nNode;
//	                        
//	                        ////Question = elem.getElementsByTagName("mattext").item(0).getTextContent();	                        
//	                        ////System.out.println("Question: "+Question);	
//	                        /// 	QUESTION BODY
//	                        
//	                        ///questionSetBeanObj.setQuestionBody("Testing");
//	                        ///questionSetBeanObj.setQuestionBody(elem.getElementsByTagName("mattext").item(0).getTextContent().trim());
//	                        ///System.out.println("QuestionBody: "+elem.getElementsByTagName("mattext").item(0).getTextContent());
//	                    }
	                    if(questionType.equals("MR Matching Type") || questionType.equals("MC Matching Type")) //For Matrix Type Questions
	                    {
	                        ///String otherPartOfQuestionText = "<table class='table table-bordered'>";
	                        NodeList otherPartOfQuestionLeft = doc.getElementsByTagName("left_lid");
	                        NodeList otherPartOfQuestionRight = doc.getElementsByTagName("right_lid");
	                        Node leftPart = otherPartOfQuestionLeft.item(0);
	                        Element elemLeft = (Element) leftPart;
	                        Node rightPart = otherPartOfQuestionRight.item(0);
	                        Element elemRight = (Element) rightPart;
	                       
	                        
	    					/************************
	    					 * COLUMNS START
	    					 ************************/
	    					columnsListMCMT = new ArrayList<ColumnsBean>();
	    					
	    					/************************
	    					 * LEFT COLUMN
	    					 ************************/
	    					columnsBeanObj = new ColumnsBean();								
	    					columnsBeanObj.setColumnHeader(elemLeft.getAttribute("ident").trim());
	    					List<ColumnRowsBean> columnRowsListOne = new ArrayList<ColumnRowsBean>();
	    					NodeList leftPartCont = elemLeft.getElementsByTagName("material");
	    					for(int i = 0; i < leftPartCont.getLength(); i++){
	                            Node leftNode = leftPartCont.item(i);	                            
	                            Element leftElem = (Element) leftNode;
	                            columnRowsBeanObj = new ColumnRowsBean();
    							columnRowsBeanObj.setRowId(leftElem.getAttribute("ident").trim());
    							columnRowsBeanObj.setRowName(leftElem.getElementsByTagName("mattext").item(0).getTextContent().trim());
    							columnRowsListOne.add(columnRowsBeanObj);
	                        }
	    					columnsBeanObj.setColumnRows(columnRowsListOne);								
	    					columnsListMCMT.add(columnsBeanObj);
	    					
	    					
	    					/************************
	    					 * RIGHT COLUMN
	    					 ************************/
	    					columnsBeanObj = new ColumnsBean();								
	    					columnsBeanObj.setColumnHeader(elemRight.getAttribute("ident").trim());
	    					List<ColumnRowsBean> columnRowsListTwo = new ArrayList<ColumnRowsBean>();	
	    					NodeList rightPartCont = elemRight.getElementsByTagName("material");
    						for(int i=0; i<rightPartCont.getLength(); i++) {
    							Node rightNode = rightPartCont.item(i);
	                            Element rightElem = (Element) rightNode;
    							columnRowsBeanObj = new ColumnRowsBean();
    							columnRowsBeanObj.setRowId(rightElem.getAttribute("ident").trim());
    							columnRowsBeanObj.setRowName(rightElem.getElementsByTagName("mattext").item(0).getTextContent().trim());
    							columnRowsListTwo.add(columnRowsBeanObj);
    						}
	    					columnsBeanObj.setColumnRows(columnRowsListTwo);								
	    					columnsListMCMT.add(columnsBeanObj);
	    					
	    					
	    					///questionSetBeanObj.setColumns(columnsListMCMT);
	    					
	    					/************************
	    					 * COLUMNS END 
	    					 ************************/
	                                               
	                    }
	                    
	                    
	                    NodeList options = doc.getElementsByTagName("response_label");
	                    for(int j=0; j<options.getLength();j++)
	                    {
	                        Node optNode = options.item(j);
	                        Element elem = (Element) optNode;
	                        
	                        responseChoiceBeanObj = new ResponseChoiceBean();
	                        responseChoiceBeanObj.setResponseId(elem.getAttribute("ident").trim());
	                        if(elem.getElementsByTagName("mattext").item(0)!=null)
	                        {
		                        responseChoiceBeanObj.setResponseText(elem.getElementsByTagName("mattext").item(0).getTextContent().trim());

	                        }
	                        responseChoiceList.add(responseChoiceBeanObj);
	                    }
	                    
	                    
	                    NodeList item_correct_option = doc.getElementsByTagName("respcondition");
	                    Node optCorrectNode = item_correct_option.item(0);
	                    Element elemCorrectAns = (Element) optCorrectNode;
	                    NodeList correct_ans_list = elemCorrectAns.getElementsByTagName("varequal");
	                    for(int ca = 0; ca < correct_ans_list.getLength(); ca++)
	                    {
	                        Node correctAnsNode = correct_ans_list.item(ca);
	                        System.out.println("Correct Answer Options: "+correctAnsNode.getTextContent());
	                        correctAns += correctAnsNode.getTextContent()+"~";
	                    }
	                    
	                    
	                    //Get Explanation For common Questions
	                    NodeList exp_option = doc.getElementsByTagName("itemfeedback");
	                    if(exp_option!=null)
	                    {
	                        Node exp_node = exp_option.item(0);
	                        Element elemExp = (Element) exp_node;
	                        if(elemExp!=null){
	                            NodeList expList = elemExp.getElementsByTagName("mattext");
	                            for(int e = 0; e < expList.getLength(); e++)
	                            {
	                                Node expNode = expList.item(e);
	                                System.out.println("Explanation Options: "+expNode.getTextContent());
	                                ///explanation = expNode.getTextContent().trim();
	                            }
	                        }
	                    }
	                    
	                ///System.out.println("Question Text: "+Question);
	                
	                ///questionSetBeanObj.setQuestionBody(Question);
	                /*if(testQuestion.getUserAnswer()!=null){
	                    if(testQuestion.getUserAnswer().trim().equals("") )
	                    {
	                        Collections.shuffle(optionList);
	                    }
	                }*/
	                ///questionSetBeanObj.setResponseChoice(responseChoiceList);
	                
	                //Set correct Ans For Common Questions
	                if(correctAns.indexOf("~") != -1){
	                    correctAns = correctAns.substring(0,correctAns.length() - 1);
	                }
	                
	                System.out.println("Correct Response: "+correctAns);
	                
	                return correctAns;	                	                
	                
	            }
	        } catch (ParserConfigurationException ex) {
	            java.util.logging.Logger.getLogger(QuestionHtml.class.getName()).log(Level.SEVERE, null, ex);
	        } catch (SAXException ex) {
	            java.util.logging.Logger.getLogger(QuestionHtml.class.getName()).log(Level.SEVERE, null, ex);
	        } catch (IOException ex) {
	            java.util.logging.Logger.getLogger(QuestionHtml.class.getName()).log(Level.SEVERE, null, ex);
	        }


			System.out.println("************** getAnswerFromXmlParser PARSER END ***************************");
	        
	        return null;
		
    }
	
	
	
}
