/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.html.core.tests.parser;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Writer;

import junit.framework.TestCase;

import org.eclipse.wst.html.core.tests.utils.DateUtil;
import org.eclipse.wst.html.core.tests.utils.FileUtil;
import org.eclipse.wst.html.core.tests.utils.StringCompareUtil;
import org.eclipse.wst.html.core.tests.utils.TestWriter;
import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.provisional.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.util.StringUtils;
import org.eclipse.wst.xml.core.internal.document.StructuredDocumentRegionChecker;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.w3c.dom.Node;

public abstract class ModelTest extends TestCase {

	public final static String testResultsDirectoryPrefix = "ParserResults";
	private final static String fileExtension = ".txt";
	protected TestWriter fOutputWriter = new TestWriter();
	private int READ_BUFFER_SIZE = 4096;

	private boolean echoToSystemOut = false;
	private boolean printedOnce;
	private boolean printSummaryToSystemOut;

	/**
	 * Constructor for ModelTest.
	 * 
	 * @param name
	 */
	public ModelTest(String name) {
		super(name);
		try {
			printClass();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}

	public ModelTest() {
		this("dummy");
		//		try {
		//			printClass();
		//		} catch (IOException e) {
		//			e.printStackTrace();
		//		}
	}

	public static IDOMModel createHTMLModel() {

		//return new XMLModelImpl();

		IStructuredModel model = null;
		try {
			IModelManager modelManager = StructuredModelManager.getModelManager();

			model = modelManager.getModelForEdit("test.html", new NullInputStream(), null);

			// always use the same line delimiter for these tests, regardless
			// of
			// plaform or preference settings
			model.getStructuredDocument().setLineDelimiter(TestWriter.commonEOL);
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		//assertTrue("basic XML empty model could not be created", model !=
		// null);
		return (IDOMModel) model;

	}

	public static IDOMModel createXMLModel() {

		//return new XMLModelImpl();

		IStructuredModel model = null;
		try {
			IModelManager modelManager = StructuredModelManager.getModelManager();
			//assertTrue("modelManager must not be null", modelManager !=
			// null);

			model = modelManager.getModelForEdit("test.xml", new NullInputStream(), null);

			// always use the same line delimiter for these tests, regardless
			// of
			// plaform or preference settings
			model.getStructuredDocument().setLineDelimiter(TestWriter.commonEOL);


		}
		catch (Exception e) {
			e.printStackTrace();
		}
		//assertTrue("basic XML empty model could not be created", model !=
		// null);
		return (IDOMModel) model;

	}

	/**
	 */
	private void printClass() throws IOException {
		fOutputWriter.writeln(getClass().getName());
	}

	public static void printException(Exception ex) {
		ex.printStackTrace();
	}

	private void printNode(Node node, int indent) {
		try {
			StringBuffer buffer = new StringBuffer(10);
			for (int i = 0; i < indent; i++)
				buffer.append("--");
			buffer.append(StringUtils.escape(node.toString()));
			fOutputWriter.writeln(buffer.toString());
			indent++;
			Node child = node.getFirstChild();
			while (child != null) {
				printNode(child, indent);
				child = child.getNextSibling();
			}
		}
		catch (Exception ex) {
			printException(ex);
		}
	}

	public void printSource(IDOMModel model) {
		try {
			fOutputWriter.writeln("Source :");
			fOutputWriter.writeln(model.getStructuredDocument().getText());
			fOutputWriter.writeln("");
		}
		catch (Exception ex) {
			printException(ex);
		}
	}

	public void printTree(IDOMModel model) {
		try {
			printFlatModel(model.getStructuredDocument());
			new StructuredDocumentRegionChecker(fOutputWriter).checkModel(model);
			fOutputWriter.writeln("Tree :");
			printNode(model.getDocument(), 0);
			fOutputWriter.writeln("");

		}
		catch (Exception ex) {
			printException(ex);
		}

	}

	protected void saveAndCompareTestResults() {
		try {
			String testOutputDirectory = testResultsDirectoryPrefix + DateUtil.now();
			String currentFilename = getClass().getName() + fileExtension;
			File fileout = FileUtil.makeFileFor(testOutputDirectory, currentFilename, testResultsDirectoryPrefix);
			Writer fileWriter = new FileWriter(fileout);
			fileWriter.write(fOutputWriter.toString());
			fileWriter.close();
			compareWithPreviousResults(fOutputWriter, currentFilename);

			if (echoToSystemOut) {
				System.out.println(fOutputWriter.toString());
			}

			fOutputWriter.close();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Method compareWithPreviousResults.
	 * 
	 * @param outputWriter
	 * @param currentFilename
	 */
	private void compareWithPreviousResults(TestWriter outputWriter, String currentFilename) throws IOException {
		boolean success = false;
		File previousResultsDir = FileUtil.getPreviousResultsDirectory(testResultsDirectoryPrefix);
		if (previousResultsDir != null) {
			String currentResults = outputWriter.toString();
			File previousResultsFile = new File(previousResultsDir, currentFilename);
			FileReader previousResultsFileReader = new FileReader(previousResultsFile);
			String previousResults = readString(previousResultsFileReader);
			StringCompareUtil stringCompare = new StringCompareUtil();
			// trying to "force" the same linedelimter didn't work well,
			// I think since the line delimiter is input on some tests,
			// and CVS is likely to change anyway (for ASCII files).
			// so we'll ignore in our comparisons. Note: we wouldn't
			// want to ignore whitespace. There might actually be some
			// tests that are not as accurate if we ignore EOL, but there
			// seems to be no easy way to handle, with out a lot of trouble.
			if (!stringCompare.equalsIgnoreLineSeperator(previousResults, currentResults)) {
				// previousResults.equals(currentResults)) {
				// fail
				success = false;

				System.out.println();
				System.out.println(currentFilename + " failed comparison to previous results");
				System.out.println("Previous: ");
				System.out.println(previousResults);
				System.out.println();
				System.out.println("Current: ");
				System.out.println(currentResults);
				System.out.println();
			}
			else {
				success = true;
				if (printSummaryToSystemOut) {
					System.out.println();
					System.out.println(currentFilename + " compared ok");
					System.out.println();
				}
			}
		}
		else {
			if (!printedOnce) {
				System.out.println();
				System.out.println("No Previous Directory found ... couldn't compare " + currentFilename + " with previous results");
				printedOnce = true;
				System.out.println();
			}
		}
		assertTrue("current is not equal to reference results for " + currentFilename, success);
	}

	/**
	 * Method readString.
	 * 
	 * @param previousResultsFileReader
	 * @return String
	 */
	private String readString(FileReader fileReader) throws IOException {
		return readInputStream(fileReader);
	}

	private String readInputStream(InputStreamReader inputStreamReader) throws IOException {
		int numRead = 0;
		StringBuffer buffer = new StringBuffer();
		char tBuff[] = new char[READ_BUFFER_SIZE];
		while ((numRead = inputStreamReader.read(tBuff, 0, tBuff.length)) != -1) {
			buffer.append(tBuff, 0, numRead);
		}
		// remember -- we didn't open stream ... so we don't close it
		return buffer.toString();
	}

	public abstract void testModel();

	protected void printFlatModel(IStructuredDocument flatModel) {
		fOutputWriter.writeln("");
		fOutputWriter.writeln("StructuredDocument Regions :");
		IStructuredDocumentRegion flatnode = flatModel.getFirstStructuredDocumentRegion();
		while (flatnode != null) {

			fOutputWriter.writeln(flatnode.toString());
			flatnode = flatnode.getNext();

		}
		fOutputWriter.writeln("");

	}
}