/*******************************************************************************
 * Copyright (c) 2008 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:
 *    Kentarou FUKUDA - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.visualization.blind.html;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Vector;

import org.eclipse.actf.model.IModelService;
import org.eclipse.actf.model.IWebBrowserACTF;
import org.eclipse.actf.model.dom.html.impl.SHDocument;
import org.eclipse.actf.model.dom.html.util.HtmlParserUtil;
import org.eclipse.actf.util.DebugPrintUtil;
import org.eclipse.actf.util.html2view.Html2ViewMapMaker;
import org.eclipse.actf.visualization.IVisualizationConst;
import org.eclipse.actf.visualization.blind.BlindVisualizerBase;
import org.eclipse.actf.visualization.blind.IBlindVisualizer;
import org.eclipse.actf.visualization.blind.ui.internal.Messages;
import org.eclipse.actf.visualization.engines.blind.BlindVizEnginePlugin;
import org.eclipse.actf.visualization.engines.blind.eval.EvaluationResultBlind;
import org.eclipse.actf.visualization.engines.blind.html.IVisualizeMapData;
import org.eclipse.actf.visualization.engines.blind.html.VisualizeEngine;
import org.eclipse.actf.visualization.engines.blind.html.eval.HtmlErrorLogListener;
import org.eclipse.actf.visualization.engines.blind.html.util.HandleFramePage;
import org.eclipse.actf.visualization.engines.blind.util.ParamBlind;
import org.eclipse.actf.visualization.eval.EvaluationPreferencesUtil;
import org.eclipse.actf.visualization.eval.HtmlCheckTargetImpl;
import org.eclipse.actf.visualization.eval.IHtmlCheckTarget;
import org.eclipse.actf.visualization.eval.IHtmlChecker;
import org.eclipse.actf.visualization.eval.guideline.GuidelineHolder;
import org.eclipse.actf.visualization.eval.html.HtmlEvalUtil;
import org.eclipse.actf.visualization.eval.html.statistics.PageData;
import org.eclipse.actf.visualization.eval.problem.HighlightTargetNodeInfo;
import org.eclipse.actf.visualization.eval.problem.IProblemItem;
import org.w3c.dom.Document;

public class BlindVisualizerHtml extends BlindVisualizerBase implements
		IBlindVisualizer {

	public static final int FRAME = 1;

	public static final String ORIG_HTML_FILE = "origSource.html";

	public static final String IE_HTML_FILE = "ieSource.html";

	private IWebBrowserACTF webBrowser;

	@Override
	public boolean setModelService(IModelService targetModel) {
		webBrowser = null;
		if (super.setModelService(targetModel)) {
			webBrowser = (IWebBrowserACTF) targetModel;
			return true;
		}
		return false;
	}

	public boolean isTarget(IModelService modelService) {
		if (null != modelService && modelService instanceof IWebBrowserACTF) {
			return true;
		}
		return false;
	}

	public int visualize() {
		GuidelineHolder.getInstance().setTargetMimeType("text/html");

		int frameId = 0;
		checkResult = new EvaluationResultBlind();

		try {

			webBrowser.saveOriginalDocument(tmpDirS + ORIG_HTML_FILE);
			webBrowser.saveDocumentAsHTMLFile(tmpDirS + IE_HTML_FILE);
			// for srcViewer
			webBrowser.saveOriginalDocument(tmpDirS + HTML_SOURCE_FILE);

			Html2ViewMapMaker h2vmm = new Html2ViewMapMaker();

			Vector html2ViewMapV = new Vector();
			HtmlParserUtil hpu = new HtmlParserUtil();
			HtmlErrorLogListener errorLogListener = new HtmlErrorLogListener();
			hpu.addErrorLogListener(errorLogListener);
			String targetFile = tmpDirS + MAPPED_HTML_FILE_PRE + frameId
					+ ".html";

			boolean isIEhtml = false;
			if (EvaluationPreferencesUtil.isOriginalDOM()) {
				html2ViewMapV = h2vmm.makeMap(ORIG_HTML_FILE,
						MAPPED_HTML_FILE_PRE + frameId + ".html", tmpDirS);
				// decode miss
				if (html2ViewMapV.size() == 0) {
					isIEhtml = true;
				}
			} else {
				isIEhtml = true;
			}

			// for line<>id mapping
			// HtmlLine2Id htmlLine2Id = new HtmlLine2Id(html2ViewMapV);

			Document document;
			Document ieDom;
			Document originalDocument;
			if (isIEhtml) {
				ieDom = webBrowser.getLiveDocument();

				// TODO replace with DomByCom (need clone/write support)
				HtmlParserUtil tmpHPU = new HtmlParserUtil();
				tmpHPU.parse(new FileInputStream(tmpDirS + IE_HTML_FILE));
				document = tmpHPU.getSHDocument();

				tmpHPU.parse(new FileInputStream(tmpDirS + ORIG_HTML_FILE));
				originalDocument = tmpHPU.getSHDocument();

			} else {
				hpu.parse(new FileInputStream(targetFile));
				document = hpu.getSHDocument();
				originalDocument = document;
				ieDom = webBrowser.getLiveDocument();
			}
			// System.out.println(document+" "+ _originalDom+" "+ ieDom);

			boolean hasFrame = false;

			if (document == null) {
				return ERROR;
			} else if (HandleFramePage.hasFrameset(document, webBrowser) == true) {
				hasFrame = true;
			}

			setStatusMessage(Messages.getString("BlindView.Now_processing")); // //$NON-NLS-1$

			pageData = new PageData();

			VisualizeEngine engine = new VisualizeEngine();
			engine.setBaseUrl(""); //$NON-NLS-1$
			// TODO "\"->"/" windows
			// engine.setBaseUrl("file:///"+RESULT_DIR);

			engine.setTargetUrl(targetUrl);
			engine.setDocument(document);
			engine.setHtml2viewMapV(html2ViewMapV);

			// TODO invisibleElements
			// HashSet invisibleIdSet = new HashSet();
			// if (webBrowser != null) {
			// String[] invisibleIds = webBrowser.getInvisibleEleId();
			// for (int i = 0; i < invisibleIds.length; i++) {
			// invisibleIdSet.add(invisibleIds[i]);
			// }
			// }
			// engine.setInvisibleIdSet(invisibleIdSet);

			engine.setInvisibleIdSet(new HashSet());

			engine.setPageData(pageData);
			engine.calculate();

			maxReachingTime = engine.getMaxTime();
			setInfoMessage(createMaxTimeString());

			resultDocument = engine.getResult();
			checkResult.setProblemList(engine.getProbelems());
			checkResult.setTargetUrl(targetUrl);

			checkResult.addAssociateFile(engine.getVariantFile());

			IVisualizeMapData mapData = engine.getVisualizeMapData();

			// TODO
			checkResult.setSourceFile(new File(tmpDirS + HTML_SOURCE_FILE));

			boolean isDBCS = false;
			if (ParamBlind.getInstance().iLanguage == ParamBlind.JP) {
				isDBCS = true;
			}

			HtmlEvalUtil edu = new HtmlEvalUtil(document, resultDocument,
					targetUrl, mapData.getOrig2idMap(), originalDocument,
					ieDom, pageData, isDBCS, isIEhtml);

			ArrayList<IProblemItem> tmpResults = new ArrayList<IProblemItem>(
					1024);

			// TODO re-impl BrowserAndStyleInfo
			//
			// BrowserAndStyleInfo data =
			// webBrowser.getBrowserAndStyleInfo();
			IHtmlCheckTarget checkTarget = new HtmlCheckTargetImpl(document,
					webBrowser.getURL(), null, edu);

			for (int i = 0; i < checkers.length; i++) {
				if (checkers[i] instanceof IHtmlChecker) {
					tmpResults.addAll(((IHtmlChecker) checkers[i])
							.checkHtml(checkTarget));
				} else if (checkers[i].isTargetFormat(webBrowser
						.getCurrentMIMEType())
						&& checkers[i].isEnabled()) {
					tmpResults.addAll(checkers[i].check(checkTarget));
				}
			}

			// TODO support blind biz -> visitor
			for (int i = 0; i < tmpResults.size(); i++) {
				IProblemItem tmpItem = (IProblemItem) tmpResults.get(i);
				HighlightTargetNodeInfo nodeInfo = tmpItem
						.getHighlightTargetNodeInfo();
				if (nodeInfo != null) {
					tmpItem.setHighlightTargetIds(nodeInfo
							.getHighlightTargetIds(mapData.getOrig2idMap()));
					if (EvaluationPreferencesUtil.isOriginalDOM()) {
						tmpItem.setHighlightTargetSourceInfo(nodeInfo
								.getHighlightTargetSourceInfo(html2ViewMapV));
					}
				}
			}
			checkResult.addProblemItems(tmpResults);
			checkResult
					.addProblemItems(errorLogListener.getHtmlProblemVector());
			checkResult.accept(pageData);

			// TODO move (add Icons into result doc) here

			resultFile = BlindVizEnginePlugin.createTempFile(
					IVisualizationConst.PREFIX_RESULT,
					IVisualizationConst.SUFFIX_HTML);
			File tmpFile = BlindVizEnginePlugin.createTempFile("tmp",
					IVisualizationConst.SUFFIX_HTML);

			try {
				HtmlParserUtil.saveHtmlDocumentAsUTF8(
						(SHDocument) resultDocument, tmpFile, resultFile);
			} catch (Exception e3) {
				DebugPrintUtil
						.devOrDebugPrintln("error: saveHtmlDocumentAsUTF8");
				try {
					PrintWriter pw = new PrintWriter(new OutputStreamWriter(
							new FileOutputStream(resultFile), "UTF-8"));
					((SHDocument) resultDocument).printAsSGML(pw, true);
					pw.flush();
					pw.close();
				} catch (Exception e4) {

				}
			}

			if (hasFrame) {
				return FRAME;
			} else if (webBrowser != null && !webBrowser.isUrlExists()) {
				// TODO
				return ERROR;
			}
			return OK;

		} catch (Exception e) {
			setStatusMessage("Visualization Error");
			e.printStackTrace();
			return ERROR;
		}

	}

}
