
package survey;

import survey.model.Model;
import survey.model.QuestionType;
import survey.model.TypeMultiChoice;
import survey.gui.Renderer;

import javax.swing.*;
import java.awt.*;
import java.io.IOException;


import java.io.IOException;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

/**
 * A way to visualize an already answered survey
 */
public class DisplaySurvey extends JFrame implements SurveyListener {

    Element surveyNode;
    private Survey survey;

    /**
     * Constructor
     */
    public DisplaySurvey(String surveyFileName, String surveyConfigFileName) throws Exception {
	super("Display Survey");
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	readSurvey(surveyFileName);
	
	try {
	    if (surveyConfigFileName != null)
		survey = new Survey(surveyConfigFileName);
	    else 
		survey = new Survey(getSurveyConfigNode());
	    survey.addListener(this);
	    getContentPane().setLayout(new BorderLayout());
	    getContentPane().add(survey, BorderLayout.CENTER);
	} catch (Exception e) {
	    e.printStackTrace();
	}

	fillAnswersFromFile();
	survey.updateRenderers();

	pack();
	setVisible(true);
	setExtendedState(JFrame.MAXIMIZED_BOTH);
    }



    /** Program Entry Point */
    public static void main(String [] args) throws Exception {
	new DisplaySurvey(args[0], (args.length > 1) ? args[1] : null);
    }

    public void surveyFinished() {
	System.exit(0);
    }


    void readSurvey(String surveyFileName) throws Exception {
	FileInputStream input = new FileInputStream(surveyFileName);

	//prepare parser
	DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	dbFactory.setIgnoringComments(true);
	dbFactory.setNamespaceAware(false);
	dbFactory.setValidating(false);
	DocumentBuilder builder = dbFactory.newDocumentBuilder();

	//parse the xml file
	org.w3c.dom.Document xmlDocument = builder.parse(input);
	input.close();

	//extract the survey
	surveyNode = xmlDocument.getDocumentElement();
    }


    Element getSurveyConfigNode() {
	return (Element)surveyNode.getElementsByTagName("surveyConfig").item(0);
    }


    void fillAnswersFromFile() throws Exception {

	Element answersElement = (Element)surveyNode.getElementsByTagName("Answers").item(0);
	//read all type templates
	NodeList answerList = answersElement.getElementsByTagName("QA");
        for (int i = 0; i < answerList.getLength(); i++) {
	    Element answerElement = (Element) answerList.item(i);

	    String questionId = answerElement.getAttribute("id");
	    
	    String answer = answerElement.getElementsByTagName("Answer").item(0).getTextContent();

	    QuestionType question = survey.getModel().getQuestionByID(questionId).getContentType();
	    if (question instanceof TypeMultiChoice) 
		((TypeMultiChoice)question).setAnswerById(answer);
	    else
		question.setAnswer(answer);
	}
    }

}

