/*******************************************************************************
 * Copyright (c) 2011, 2013 Formal Mind GmbH and University of Dusseldorf.
 * 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:
 *     Lukas Ladenberger - initial API and implementation
 ******************************************************************************/
package org.eclipse.rmf.reqif10.pror.editor.util;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandWrapper;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.rmf.reqif10.AttributeValue;
import org.eclipse.rmf.reqif10.DatatypeDefinition;
import org.eclipse.rmf.reqif10.EnumValue;
import org.eclipse.rmf.reqif10.ReqIF;
import org.eclipse.rmf.reqif10.SpecHierarchy;
import org.eclipse.rmf.reqif10.SpecObject;
import org.eclipse.rmf.reqif10.Specification;
import org.eclipse.rmf.reqif10.XhtmlContent;
import org.eclipse.rmf.reqif10.common.util.ProrXhtmlSimplifiedHelper;
import org.eclipse.rmf.reqif10.common.util.ReqIF10Util;
import org.eclipse.rmf.reqif10.common.util.ReqIF10XhtmlUtil;
import org.eclipse.rmf.reqif10.pror.configuration.Column;
import org.eclipse.rmf.reqif10.pror.configuration.ProrPresentationConfiguration;
import org.eclipse.rmf.reqif10.pror.configuration.ProrSpecViewConfiguration;
import org.eclipse.rmf.reqif10.pror.configuration.UnifiedColumn;
import org.eclipse.rmf.reqif10.pror.editor.IReqifEditor;
import org.eclipse.rmf.reqif10.pror.editor.ISpecificationEditor;
import org.eclipse.rmf.reqif10.pror.editor.presentation.service.IProrCellRenderer;
import org.eclipse.rmf.reqif10.pror.editor.presentation.service.PresentationEditorInterface;
import org.eclipse.rmf.reqif10.pror.util.ConfigurationUtil;
import org.eclipse.rmf.reqif10.pror.util.ProrUtil;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;

public class ProrEditorUtil {

	private static String createHtmlHeader(Specification spec,
			AdapterFactory adapterFactory) {
		StringBuilder sb = new StringBuilder();
		String title = ConfigurationUtil.getSpecElementLabel(spec,
				adapterFactory);
		
		sb.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
		sb.append("<html>\n");
		sb.append("<head>\n");
		sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n");
		sb.append("<meta name=\"GENERATOR\" content=\"ProR (www.pror.org)\">\n");
		sb.append("<title>" + title + "</title>\n");
		sb.append("<style type=\"text/css\">\n");
		sb.append("body {font-family: Arial, sans-serif;}\n");
		sb.append("h1 {text-align: center;}\n");
		sb.append("table, th, td { border-bottom: 1px solid #cccccc; }\n");
		sb.append("td { padding: 2pt; }\n");
		sb.append("table { border-collapse: collapse; }");
		sb.append("</style>\n");
		sb.append("</head>\n\n");
		sb.append("<body>\n");
		sb.append("<h1>" + title + "</h1>\n");

		return sb.toString();
	}
	
	private static String getDefaultValue(AttributeValue av) {
		Object value = av == null ? null : ReqIF10Util.getTheValue(av);
		String textValue;
		if (value == null) {
			textValue = "";
		} else if (value instanceof List<?>) {
			textValue = "";
			for (Iterator<?> i = ((List<?>) ((List<?>) value)).iterator(); i
					.hasNext();) {
				EnumValue enumValue = (EnumValue) i.next();
				textValue += enumValue.getLongName();
				if (i.hasNext()) {
					textValue += ", ";
				}
			}
		} else if (value instanceof XhtmlContent) {
			textValue = ProrXhtmlSimplifiedHelper
					.xhtmlToSimplifiedString((XhtmlContent) value);
			try {
				String xhtmlString = ReqIF10XhtmlUtil
						.getXhtmlString((XhtmlContent) value);
				xhtmlString = xhtmlString.replace("<xhtml:", "<");
				xhtmlString = xhtmlString.replace("</xhtml:", "</");
				textValue = xhtmlString;
			} catch (IOException e) {
			}
		} else if (value instanceof GregorianCalendar) {
			GregorianCalendar cal = (GregorianCalendar)value;
			SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MMM-dd hh:mm:ss z");  
			textValue = formatter.format(cal.getTime());
		} else {
			textValue = value.toString();
		}
		return textValue;
	}

	private static void printRecursive(StringBuilder html,
			ProrSpecViewConfiguration config, int indent,
			EList<SpecHierarchy> children,
			AdapterFactory adapterFactory) {
		for (SpecHierarchy child : children) {
			if (child.getObject() != null) {
				SpecObject specObject = child.getObject();
				boolean first = true;
				html.append("<tr>");
				for (Column col : config.getColumns()) {
					html.append("<td valign='top'>");

					// Handle indenting
					if (first) {
						html.append("<div style='margin-left: " + (indent * 20)
								+ "px;'>");
					}
					
					AttributeValue av;
					if (col instanceof UnifiedColumn) {
						av = ReqIF10Util.getAttributeValueForLabel(
								specObject, "ReqIF.Text");
						if (av == null || ReqIF10Util.getTheValue(av) == null) {
							av = ReqIF10Util.getAttributeValueForLabel(
									specObject, "ReqIF.ChapterName");							
						}
					} else {
						av = ReqIF10Util.getAttributeValueForLabel(
								specObject, col.getLabel());
					}
					DatatypeDefinition dd = ReqIF10Util
							.getDatatypeDefinition(av);
					ProrPresentationConfiguration configuration = ConfigurationUtil
							.getPresentationConfiguration(dd);

					Object itemProvider = ProrUtil.getItemProvider(
							adapterFactory, configuration);

					if (itemProvider instanceof PresentationEditorInterface) {
						PresentationEditorInterface presentationEditor = (PresentationEditorInterface) itemProvider;
						IProrCellRenderer renderer = presentationEditor
								.getCellRenderer(av);
						if (renderer != null) {
							String content = renderer.doDrawHtmlContent(av);
							if (content != null) {
								html.append(content);
							} else {
								html.append(HTMLPrinter.normalizeHtmlString(getDefaultValue(av)));
							}
						}

					} else {
						html.append(HTMLPrinter.normalizeHtmlString(getDefaultValue(av)));
					}

					if (first) {
						first = false;
						html.append("</div>");
					}
					html.append("</td>");
				}
				html.append("</tr>\n");
			}
			printRecursive(html, config, indent + 1, child.getChildren(),
					adapterFactory);
		}
	}

	public static String createHtmlContent(Specification spec,
			EditingDomain domain, AdapterFactory adapterFactory) {

		ProrSpecViewConfiguration config = ConfigurationUtil
				.createSpecViewConfiguration(spec, domain);

		StringBuilder html = new StringBuilder();

		// Draw the header
		html.append(ProrEditorUtil.createHtmlHeader(spec, adapterFactory));
		html.append("<table><tr>");
		EList<Column> cols = config.getColumns();
		for (Column col : cols) {
			html.append("<td><b>" + col.getLabel() + "</b></td>");
		}
		html.append("</tr>\n");
		printRecursive(html, config, 0, spec.getChildren(),
				adapterFactory);
		html.append("</table>");

		return html.toString();

	}

	public static Command getAffectedObjectCommand(final Object element,
			Command cmd) {
		return new CommandWrapper(cmd) {
			public java.util.Collection<?> getAffectedObjects() {
				List<Object> list = new ArrayList<Object>();
				list.add(element);
				return list;
			}
		};
	}
	
	/**
	 * Attempts to find the {@link IReqifEditor} or {@link ISpecificationEditor}
	 * for the given EObject by walking up the parent hierarchy to the enclosing
	 * {@link ReqIF} or {@link Specification}. If the {@link IReqifEditor} is
	 * found for a Specification, the corresponding editor will be opened.
	 * 
	 * @return the Editor or null if none found.
	 */
	public static IEditorPart getEditor(EObject eObject) {
		ReqIF reqif = null;
		Specification spec = null;
		while (eObject != null) {
			if (eObject instanceof Specification) {
				spec = (Specification) eObject;
			}
			if (eObject instanceof ReqIF) {
				reqif = (ReqIF) eObject;
				break;
			}
			eObject = eObject.eContainer();
		}
		if (reqif == null) return null;
		
		// Find the editor(s)
		IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
				.getActivePage();

		IEditorReference[] eRefs = activePage.getEditorReferences();
		for (IEditorReference eRef : eRefs) {
			IEditorPart editor = eRef.getEditor(false);
			if (editor instanceof ISpecificationEditor) {
				ISpecificationEditor specEditor = (ISpecificationEditor) editor;

				// Case 1: We found the right SpecificationEditor
				if (specEditor.getSpecification().equals(spec)) {
					return specEditor;
				}
			}
			if (editor instanceof IReqifEditor) {
				IReqifEditor reqifEditor = (IReqifEditor) editor;
				if (reqifEditor.getReqif().equals(reqif)) {
					
					// Case 2: We found the right Reqif10Editor
					if (spec == null) return reqifEditor;
					
					// Case 3: We found the Reqif10Editor, but need the SpecificationEditor
					return reqifEditor.openSpecEditor(spec);
				}
			}
		}
		// Case 4: Nothing found
		return null;		
	}

	
}
