package no.divvun.Analyzer.Communication;

import no.divvun.Analyzer.Objects.Element;
import no.divvun.Analyzer.Objects.Paradigm;
import no.divvun.Analyzer.Objects.Reading;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ParadigmResponseParser extends DefaultHandler {
	ElementContainer container;

	public ParadigmResponseParser(ElementContainer container) {
		this.container = container;
	}

	public ElementContainer getElementContainer() {
		return container;
	}

	public void parseResponse(StringBuilder xml, int offset) {
		int start=-1;
		int docend=offset;
		int end=docend;
		boolean responseEnd = false;
		while(!responseEnd)
		{
			if((start = xml.indexOf("<" + XMLTags.TAG_WORD, docend)) != -1) {
				docend = xml.indexOf(">", start);
				String xmlElement = xml.substring(start, docend+1);
				Paradigm paradigm = new Paradigm();

//				start = xmlElement.indexOf("lemma=\"");
//				end = xmlElement.indexOf("\"", start+7);
//				String word = xmlElement.substring(start+7, end);

				String word = getValue(xmlElement, "lemma");

				if (word != null) {
					paradigm.setWord(word);
				}
				container.add(paradigm);
			}

			else if((start = xml.indexOf("<" + XMLTags.TAG_SURFACE, docend)) != -1) {
				docend = xml.indexOf("/>", start);
				String xmlElement = xml.substring(start, docend+1);

//				start = xmlElement.indexOf("analysis=\"");
//				end = xmlElement.indexOf("\"", start+10);
//				String analysis = xmlElement.substring(start+10, end);
//
//				start = xmlElement.indexOf("form=\"");
//				end = xmlElement.indexOf("\"", start+6);
//				String form = xmlElement.substring(start+6, end);

				String analysis = getValue(xmlElement, "analysis");
				String form = getValue(xmlElement, "form");

				if (analysis != null && form != null) {
					Element element = new Element(new Reading(Reading.Type.ANALYSIS, analysis));
					element.getReading().setNext(new Reading(Reading.Type.FORM, form));
					container.getParadigm().add(element);
				}
			}

			else if((start = xml.indexOf("</" + XMLTags.TAG_WORD + ">", docend)) != -1)
				responseEnd = true;
		}
	}

	private String getValue(String xmlElement, String attribute) {
		int start = xmlElement.indexOf(attribute + "=\"") + attribute.length() +2;
		int end = xmlElement.indexOf("\"", start);
		String value = xmlElement.substring(start, end);
		return value;
	}

	public void startElement (String namespaceURI, String localName, String blockName, Attributes attributes)
		throws SAXException
	{
		if(blockName.equalsIgnoreCase(XMLTags.TAG_WORD)) {
			Paradigm paradigm = new Paradigm();
			String word = attributes.getValue("lemma");
			if (word != null) {
				paradigm.setWord(word);
			}
			container.add(paradigm);
		}

		else if(blockName.equalsIgnoreCase(XMLTags.TAG_SURFACE)) {
			String analysis = attributes.getValue("analysis");
			String form = attributes.getValue("form");

			if (analysis != null && form != null) {
				Element element = new Element(new Reading(Reading.Type.ANALYSIS, analysis));
				element.getReading().setNext(new Reading(Reading.Type.FORM, form));
				container.getParadigm().add(element);
			}
		}
	}
}
