package no.divvun.Analyzer.Communication;

import java.util.HashMap;

public class XMLRequestFactory {
	public XMLRequestFactory () {}
	
	public static String toXML(InitRequest request) {
		StringBuffer buffer = new StringBuffer();
		printTagStart(buffer, XMLTags.TAG_PARAMETERS, null);
		printParameters(buffer, request.getParameters());
		printTagEnd(buffer, XMLTags.TAG_PARAMETERS);
		return buffer.toString();
	}
	
	public static String toXML(AnalyzeRequest request) {
		StringBuffer buffer = new StringBuffer();
		HashMap<String, String> attribute = new HashMap<String, String>();
		attribute.put(XMLTags.TAG_TOOL, XMLTags.TAG_ANALYZE);
		printTagStart(buffer, XMLTags.TAG_INPUT, attribute);
		
		attribute = new HashMap<String, String>();
		attribute.put(XMLTags.TAG_FORM, request.getWord());
		printTagStartEnd(buffer, XMLTags.TAG_WORD, attribute);
		printTagEnd(buffer, XMLTags.TAG_INPUT);
		return buffer.toString();
	}
	
	public static String toXML(ParadigmRequest request) {
		StringBuffer buffer = new StringBuffer();
		HashMap<String, String> attribute = new HashMap<String, String>();
		attribute.put(XMLTags.TAG_TOOL, XMLTags.TAG_PARADIGM);
		printTagStart(buffer, XMLTags.TAG_INPUT, attribute);

		attribute = new HashMap<String, String>();
		attribute.put(XMLTags.TAG_FORM, request.getWord() + " " + request.getPOS());
		printTagStartEnd(buffer, XMLTags.TAG_WORD, attribute);
		printTagEnd(buffer, XMLTags.TAG_INPUT);
		return buffer.toString();
	}
	
	public static String toXML(GenerateRequest request) {
		StringBuffer buffer = new StringBuffer();
		HashMap<String, String> attribute = new HashMap<String, String>();
		attribute.put(XMLTags.TAG_TOOL, XMLTags.TAG_GENERATE);
		printTagStart(buffer, XMLTags.TAG_INPUT, attribute);
		
		attribute = new HashMap<String, String>();
		attribute.put(XMLTags.TAG_FORM, request.getWord());
		printTagStartEnd(buffer, XMLTags.TAG_WORD, attribute);
		printTagEnd(buffer, XMLTags.TAG_INPUT);
		return buffer.toString();
	}
	
	public static String toXML(HyphenateRequest request) {
		StringBuffer buffer = new StringBuffer();
		HashMap<String, String> attributes = new HashMap<String, String>();
		attributes.put(XMLTags.TAG_TOOL, XMLTags.TAG_HYPHENATE);
		attributes.put(XMLTags.TAG_FILTER, "yes");
		printTagStart(buffer, XMLTags.TAG_INPUT, attributes);
		
		attributes = new HashMap<String, String>();
		attributes.put(XMLTags.TAG_FORM, request.getWord());
		printTagStartEnd(buffer, XMLTags.TAG_WORD, attributes);
		printTagEnd(buffer, XMLTags.TAG_INPUT);
		return buffer.toString();
	}
	
	private static void printParameters(StringBuffer buffer, Parameters param) {
		if(param.isPreprocess()) {
			HashMap<String, String> attributes = new HashMap<String, String>();
			attributes.put(XMLTags.TAG_TOOL, XMLTags.TAG_PREPROCESS);
			printTagStartEnd(buffer, XMLTags.TAG_ACTION, attributes);
		}
		if(param.isAnalyze()) {
			HashMap<String, String> attributes = new HashMap<String, String>();
			attributes.put(XMLTags.TAG_TOOL, XMLTags.TAG_ANALYZE);
			printTagStartEnd(buffer, XMLTags.TAG_ACTION, attributes);
		}
		if(param.isHyphenate()) {
			HashMap<String, String> attributes = new HashMap<String, String>();
			attributes.put(XMLTags.TAG_TOOL, XMLTags.TAG_HYPHENATE);
			if(param.isUseFilter())
				attributes.put(XMLTags.TAG_FILTER, "yes");
			printTagStartEnd(buffer, XMLTags.TAG_ACTION, attributes);
		}
		if(param.isDisamb()) {
			HashMap<String, String> attributes = new HashMap<String, String>();
			attributes.put(XMLTags.TAG_TOOL, XMLTags.TAG_DISAMB);
			printTagStartEnd(buffer, XMLTags.TAG_ACTION, attributes);
		}
		if(param.isGenerate()) {
			HashMap<String, String> attributes = new HashMap<String, String>();
			attributes.put(XMLTags.TAG_TOOL, XMLTags.TAG_GENERATE);
			if(param.getFst() != null) {
				attributes.put(XMLTags.TAG_FST, param.getFst());
			}
			printTagStartEnd(buffer, XMLTags.TAG_ACTION, attributes);
		}
		if(param.isParadigm()) {
			HashMap<String, String> attributes = new HashMap<String, String>();
			attributes.put(XMLTags.TAG_TOOL, XMLTags.TAG_PARADIGM);
			if(param.getFst() != null) {
				attributes.put(XMLTags.TAG_FST, param.getFst());
				attributes.put(XMLTags.TAG_GRAMMAR, param.getGrammar());
				attributes.put(XMLTags.TAG_TAGS, param.getTags());
			}
			printTagStartEnd(buffer, XMLTags.TAG_ACTION, attributes);
		}
			
		if(param.getLang() != null) {
			printTagStart(buffer, XMLTags.TAG_LANG, null);
			printData(buffer, param.getLang());
			printTagEnd(buffer, XMLTags.TAG_LANG);
		}
		
//		if(param.getFst() != null) {
//			printTagStart(buffer, XMLTags.TAG_FST, null);
//			printData(buffer, param.getFst());
//			printTagEnd(buffer, XMLTags.TAG_FST);
//		}
		
		if(param.isXml_in()) printTagStartEnd(buffer, XMLTags.TAG_XML_IN, null);
		if(param.isXml_out()) printTagStartEnd(buffer, XMLTags.TAG_XML_OUT, null);
	}
	
	private static void printHeader(StringBuffer buffer) {
		buffer.append(XMLTags.TAG_HEADER);
	}
	
	private static void printTagStart(StringBuffer buffer, String tag, HashMap<String, String> attributes) {
		buffer.append("<" + tag);
		if (attributes != null)
			printAttributes(buffer, attributes);
		buffer.append(">");
	}
	
	private static void printTagStartEnd(StringBuffer buffer, String tag, HashMap<String, String> attributes) {
		buffer.append("<" + tag);
		if (attributes != null)
			printAttributes(buffer, attributes);
		buffer.append("/>");
	}
	
	private static void printTagEnd(StringBuffer buffer, String tag) {
		buffer.append("</" + tag + ">\n");
	}
	
	private static void printAttributes(StringBuffer buffer, HashMap<String, String> attributes) {
		for (String key : attributes.keySet()) {
			buffer.append(" " + key + "=\"" + (String)attributes.get(key) + "\"");
		}
	}
	
	public static void printData(StringBuffer buffer, String data) {
		buffer.append(data + "\n");
	}
}
