/*******************************************************************************
 * Copyright (c) 2011-2013 EclipseSource Muenchen GmbH and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Jonas - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.ecp.view.model.internal.fx;

import javafx.scene.Node;
import javafx.scene.control.Label;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecp.view.internal.context.ViewModelContextImpl;
import org.eclipse.emf.ecp.view.model.fx.ECPFXView;
import org.eclipse.emf.ecp.view.model.fx.ECPFXViewRenderer;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.context.ViewModelService;
import org.eclipse.emf.ecp.view.spi.model.VElement;
import org.eclipse.emf.ecp.view.spi.model.VView;
import org.eclipse.emf.ecp.view.spi.provider.ViewProviderHelper;
import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;

/**
 * @author Jonas
 *
 */
@SuppressWarnings("restriction")
// TODO no api
public class ECPFXViewRendererImpl implements ECPFXViewRenderer {

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.emf.ecp.ui.view.fx.ECPFXViewRenderer#render(org.eclipse.emf.ecp.view.model.VView,
	 *      org.eclipse.emf.ecore.EObject)
	 */
	@Override
	public ECPFXView render(VView view, EObject domainObject, ViewModelService... services) { // throws
		// ECPRendererException

		final ViewModelContext viewModelContext = new ViewModelContextImpl(view,
			domainObject, services);

		final RendererFX<VElement> viewRenderer = RendererFactory.INSTANCE.getRenderer(view, viewModelContext);
		if (viewRenderer != null) {
			Node result;
			try {
				// TODO: checkGrid
				result = viewRenderer.render(viewRenderer.getGridDescription().getGrid().get(0));
			} catch (final NoRendererFoundException e) {
				return new ECPFXViewImpl(new Label("Rendering went wrong: " + e.getMessage()));
			} catch (final NoPropertyDescriptorFoundExeption e) {
				return new ECPFXViewImpl(new Label("Rendering went wrong: " + e.getMessage()));
			}
			if (result != null) {
				return new ECPFXViewImpl(result);
			} else {
				return new ECPFXViewImpl(new Label("Rendering went wrong!"));
			}
		} else {
			return new ECPFXViewImpl(new Label("Rendering went wrong: Couldn't find a renderer for VView."));
		}
	}

	@Override
	public ECPFXView render(EObject domainObject, ViewModelService... services) {
		final VView view = ViewProviderHelper.getView(domainObject, null);
		return render(view, domainObject, services);
	}

	// private VView generate(EClass eClass) {
	// final VView view = VViewFactory.eINSTANCE.createView();
	// for (final EStructuralFeature feature : eClass
	// .getEAllStructuralFeatures()) {
	//
	// final VControl control = VViewFactory.eINSTANCE.createControl();
	// final VFeaturePathDomainModelReference modelReference =
	// VViewFactory.eINSTANCE
	// .createFeaturePathDomainModelReference();
	// modelReference.setDomainModelEFeature(feature);
	// control.setDomainModelReference(modelReference);
	//
	// view.getChildren().add(control);
	//
	// }
	//
	// return view;
	// }

	// private void init(VView view, EObject domainObject){
	// TreeIterator<EObject> eAllContents = view.eAllContents();
	// while (eAllContents.hasNext()) {
	// EObject next = eAllContents.next();
	// if (VDomainModelReference.class.isInstance(next)) {
	// ((VDomainModelReference) next).resolve(domainObject);
	// }
	// }
	// }
}
