package com.tandbergtv.metadatamanager.validation.Schematron;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class CustomSchematronBuilder {

	public static InputStream buildSchematron(Map<String, Boolean> rules) {
		Map<String, List<String>> sortedRules = new HashMap<String, List<String>>();
		for(Map.Entry<String, Boolean> rule : rules.entrySet()) {
			if(rule.getValue()) {
				String xpath = rule.getKey();
				String field = getField(xpath);
				String context = getContext(xpath);
				List<String> bucket = sortedRules.get(context);
				if(bucket == null)
					bucket = new ArrayList<String>();
				bucket.add(field);
				sortedRules.put(context, bucket);
			}
		}
		StringBuilder sb = new StringBuilder();
		sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
				"<iso:schema xmlns=\"http://purl.oclc.org/dsdl/schematron\" " +
				"xmlns:iso=\"http://purl.oclc.org/dsdl/schematron\" " +
				"xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" " +
				"xmlns:ext=\"http://www.schematron.com/namespace/extensionsAndExperiments\" " +
				"queryBinding=\'xslt2\' schemaVersion=\'ISO19757-3\'>" +
				"<iso:title>Custom Vaildations</iso:title><iso:pattern>");
		Set<Map.Entry<String, List<String>>> set = sortedRules.entrySet();
		for(Map.Entry<String, List<String>> contextGroup : set) {
			sb.append("<iso:rule context=\"" + contextGroup.getKey() + "\">");
			for(String fieldName : contextGroup.getValue()) {
				sb.append("<iso:report test=\"not(" + fieldName +
						")\">ERR-02 : " + fieldName.replace("@", "") + "</iso:report>");
			}
			sb.append("</iso:rule>");
		}
		sb.append("</iso:pattern></iso:schema>");

		byte[] bytes = null;
		try {
			bytes = sb.toString().getBytes("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return new ByteArrayInputStream(bytes);
	}

	private static String getContext(String xpath) {
		int lastSlash = xpath.lastIndexOf("/");
		return xpath.substring(0, lastSlash);
	}

	private static String getField(String xpath) {
		int lastSlash = xpath.lastIndexOf("/");
		int end = xpath.length();
		return xpath.substring(lastSlash + 1, end);
	}
}
