/*******************************************************************************
 * Copyright (c) 2015 RCP Vision (http://www.rcp-vision.com) 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:
 * Vincenzo Caselli - Initial contribution and API
 *******************************************************************************/
package org.eclipse.emf.parsley.web.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.parsley.composite.DialogControlFactory;
import org.eclipse.emf.parsley.config.Configurator;
import org.eclipse.emf.parsley.runtime.util.PolymorphicDispatcher;
import org.eclipse.emf.parsley.ui.provider.FeaturesProvider;
import org.eclipse.emf.parsley.ui.provider.FormFeatureCaptionProvider;
import org.eclipse.emf.parsley.ui.provider.ViewerLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DateTime;
import org.eclipse.swt.widgets.Text;

import com.google.inject.Injector;

/**
 * Servlet for handling generation of JSON output to represent the detail of a
 * given EMF object
 * 
 * @author Vincenzo Caselli
 * 
 */
public class JsonDetailsServlet extends JsonParsleyServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(final HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Injector injector = Application.getInstance(request).getInjector();
		Configurator configurator = Application.getInstance(request).getConfigurator();
		final PrintWriter out = prepareOutput(response);

		String id = request.getParameter(OBJECT_ID_PARAMETER);
		String entity = request.getParameter(SWITCH_PARAMETER);

		if (id != null) {
			out.write("{ ");
			Object element = Application.getInstance(request).get(id);
			EObject eObject = (EObject) element;

			ViewerLabelProvider labelProvider = (ViewerLabelProvider) injector.getInstance(ILabelProvider.class);

			final DialogControlFactory dialogControlFactory = injector.getInstance(DialogControlFactory.class);
			FormFeatureCaptionProvider formFeatureCaptionProvider = injector
					.getInstance(FormFeatureCaptionProvider.class);
			PolymorphicDispatcher<Object> imageDispatcher = PolymorphicDispatcher.createForSingleTarget("image", 1, 1,
					labelProvider);

			EClass clazz;
			List<EStructuralFeature> features;
			String imagePath;
			String label;
			if (eObject != null) {
				clazz = eObject.eClass();
				imagePath = (String) imageDispatcher.invoke(element);
				label = labelProvider.getText(eObject);
			} else {
				clazz = configurator.getEClass(entity);
				imagePath = "";
				label = "";
			}
			features = injector.getInstance(FeaturesProvider.class).getFeatures(clazz);
			out.write("\"icon\" : \"" + (imagePath != null ? imagePath : "") + "\" ");
			out.write(", \"label\" : \"" + label + "\" ");

			if (eObject == null) {
				// Case NEW: TODO refactor and avoid repetition of this
				// block in JsonSaveServlet!
				eObject = EcoreUtil.create(clazz);
				Resource resource = Application.getInstance(request).getResource(entity);
				resource.getContents().add(eObject);
				id = Application.getInstance(request).put(eObject);
			}

			final EObject eObject1 = eObject;
			// Application.getInstance(request).getDisplay().syncExec(new
			// Runnable() {
			// @Override
			// public void run() {
			// }
			// });
			new DefaultRealm();
			dialogControlFactory.init(null, eObject1, Application.getInstance(request).getShell());

			out.write(", \"" + OBJECT_ID_PARAMETER + "\" : \"" + id + "\" ");
			for (final EStructuralFeature eStructuralFeature : features) {
				out.write(",");
				String featureName = eStructuralFeature.getName(); // not used
																	// since
																	// FeatureCaptionProvider
																	// override
																	// it
				String featureCaption = formFeatureCaptionProvider.getText(clazz, eStructuralFeature);
				out.write("\"" + featureName + "\" : {" + "\"caption\": \"" + featureCaption + "\",");
				// final Wrapper<Control> wrapper =
				// Wrapper.forType(Control.class);

				final String value = labelProvider.getText(eObject.eGet(eStructuralFeature));
				// Application.getInstance(request).getDisplay().syncExec(new
				// Runnable() {
				// @Override
				// public void run() {}
				// });

				new DefaultRealm();
				Control control = dialogControlFactory.create(eStructuralFeature);
				// wrapper.set(control);
				// System.out.println(control);
				// Control control = wrapper.get();
				if (control instanceof Text) {
					Text text = (Text) control;
					// value = text.getText();
					boolean multiLine = (text.getStyle() & SWT.MULTI) > 0;
					String type = multiLine ? "textarea" : "text";
					out.write(" \"type\": \"" + type + "\",");
				} else if (control instanceof Combo) {
					String proposalsList = "";
					Combo combo = (Combo) control;
					String[] proposals = combo.getItems();
					// value = combo.getText();
					boolean first = true;
					for (Object proposal : proposals) {
						if (!first) {
							proposalsList += ",";
						}
						proposalsList += "\"" + proposal + "\"";
						first = false;
					}
					out.write(" \"type\": \"combo\",");
					out.write(" \"proposals\": [" + proposalsList + "],");
				} else if (control instanceof Button) {
					// Button button = (Button) control;
					// value = "" + button.getSelection();
					out.write(" \"type\": \"button\",");
				} else if (control instanceof DateTime) {
					out.write(" \"type\": \"datetime\",");
				}
				out.write(" \"value\": \"" + (value == null ? "" : value) + "\"" + "} ");

			}
			out.write("} ");
		}

		closeOutput(out);
	}

}
