/*******************************************************************************
 * Copyright (C) 2018 Fondazione Bruno Kessler.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *  
 * Contributors:
 *   Alberto Debiasi - initial API and implementation
 ******************************************************************************/
package org.polarsys.chess.contracts.verificationService.test.runtime.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.AnnotatedElement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import org.junit.runners.Suite.SuiteClasses;
import org.w3c.dom.Document;
import org.w3c.dom.Element;



public class TestUtil {
	
	private static TestUtil testUtil;

	public static TestUtil getInstance() {
		if (testUtil == null) {
			testUtil = new TestUtil();
		}
		return testUtil;
	}
	
	

	private List<String> extractQNamesFromSuite(SuiteClasses suite) {
		List<String> allTests = new ArrayList<String>();
		String str = suite.toString();
		str = str.substring(str.indexOf("[")+1, str.indexOf("]"));
		String[] tokens = str.split("class");
		for (String token : tokens) {
			token = token.trim();
			if (token.endsWith(",")){
				token = token.substring(0, token.lastIndexOf(","));
			}
			if(!token.isEmpty()){
				allTests.add(token);
			}
		}
		
		return allTests;
		
	}
	
	public File generateXMLReport(String resultsFilePath,Result result, AnnotatedElement classTest) throws Exception {
		
		File resultsFile = new File(resultsFilePath);
		if(!resultsFile.exists()){
			resultsFile.createNewFile();
		}
		
		
		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
		
		Document doc = docBuilder.newDocument();
		Element testSuiteElem = doc.createElement("testsuite");
		testSuiteElem.setAttribute("errors", "0"); //can't find a way to get this info, assuming zero for the moment
		testSuiteElem.setAttribute("failures", Integer.toString(result.getFailureCount()));
		testSuiteElem.setAttribute("hostname", "CHESS Runtime Tests");
		testSuiteElem.setAttribute("name", classTest.toString());
		testSuiteElem.setAttribute("skipped", "0");
		testSuiteElem.setAttribute("tests", Integer.toString(result.getRunCount()));
		long l = result.getRunTime();
		if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE){
			throw new IllegalArgumentException
            (l + " cannot be cast to int without changing its value.");
		}else{
			float f  = l;
			f = f / 1000;
			testSuiteElem.setAttribute("time", Float.toString(f));
		}
		doc.appendChild(testSuiteElem);
		
		List<String> failedTests = new ArrayList<String>();
		for (Failure failure : result.getFailures()) {
			Element testCaseElem = doc.createElement("testcase");
			String th = failure.getTestHeader();
			String classname = th.substring(th.indexOf("(")+1, th.indexOf(")"));
			String name = th.substring(0, th.indexOf("("));
			testCaseElem.setAttribute("classname", classname);
			testCaseElem.setAttribute("name", name);
			failedTests.add(classname);
			Element failureElem = doc.createElement("failure");
			failureElem.setAttribute("message", failure.getException().getMessage());
			failureElem.setAttribute("type", failure.getException().getClass().getName());
			failureElem.appendChild(doc.createTextNode(failure.getTrace()));
			testCaseElem.appendChild(failureElem);
			testSuiteElem.appendChild(testCaseElem);
		}
		
//		System.out.println(failedTests);
		SuiteClasses suite =  ((AnnotatedElement) classTest).getAnnotation(SuiteClasses.class);
		List<String> allTests = extractQNamesFromSuite(suite);
//		System.out.println(allTests);
		List<String> passedTests = new ArrayList<String>();
		
		for (String aTest : allTests) {
			if(!failedTests.contains(aTest)){
				passedTests.add(aTest);
			}
		}
//		System.out.println(passedTests);
		for (String pTest : passedTests) {
			Element testCaseElem = doc.createElement("testcase");
			testCaseElem.setAttribute("classname", pTest);
			testCaseElem.setAttribute("name", pTest.substring(pTest.lastIndexOf(".")+1, pTest.length()));
			testSuiteElem.appendChild(testCaseElem);
		}
		
		// write the content into xml file
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
		DOMSource source = new DOMSource(doc);
		StreamResult streamResult = new StreamResult(resultsFile);
		transformer.transform(source, streamResult);
		
		return resultsFile;
	}
	
	
	public Properties getConfigTestProperties() throws IOException{
		File configFile = new File("configTest.properties");
	
		    FileReader reader = new FileReader(configFile);
		    Properties props = new Properties();
		    props.load(reader);
		    reader.close();
		 return props;
		  
	}
	
}
