/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 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:
 *         Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.ecview.xtext.builder.participant.impl;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.osbp.ecview.core.common.model.core.YView;
import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
import org.eclipse.osbp.ecview.semantic.uimodel.UiView;
import org.eclipse.osbp.ecview.xtext.builder.participant.IECViewAddonsMetadataService;
import org.eclipse.osbp.xtext.builder.metadata.services.AbstractBuilderParticipant;
import org.eclipse.osbp.xtext.builder.metadata.services.IBuilderParticipant;
import org.eclipse.osbp.xtext.builder.metadata.services.IMetadataBuilderService;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.wiring.BundleWiring;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Deactivate;

import com.google.inject.Inject;

/**
 * OSBP uses ECView files directly and does not derive them from the
 * UiDSL-Model. If you have interest using this feature, just provide that class
 * as an OSGi service.
 */
// @Component(service = { IBuilderParticipant.class })
@Deprecated
public class OSBPDslsBuilderParticipant extends AbstractBuilderParticipant {

	@Inject
	private IMetadataBuilderService metadataBuilderService;

	private ComponentContext context;
	private ServiceRegistration<IECViewAddonsMetadataService> datatypesServiceRegister;

	public OSBPDslsBuilderParticipant() {

	}

	@Activate
	protected void activate(ComponentContext context) {
		this.context = context;
	}

	@Deactivate
	protected void deactivate(ComponentContext context) {
		metadataBuilderService.removeFromBundleSpace(context.getBundleContext()
				.getBundle());

		this.context = null;
	}

	@Override
	public List<URL> getModels(Bundle suspect) {

		List<URL> results = new ArrayList<URL>();
		BundleWiring wiring = suspect.adapt(BundleWiring.class);
		suspect.getState();
		if (wiring == null) {
			System.out
					.println("---------------- wiring is null --------------------------");
		} else {
			results.addAll(wiring.findEntries("/", "*.uimodel",
					BundleWiring.LISTRESOURCES_RECURSE));
			results.addAll(wiring.findEntries("/", "*.uisemantics",
					BundleWiring.LISTRESOURCES_RECURSE));
		}

		Set<String> fragments = new HashSet<String>();
		for (Iterator<URL> iterator = results.iterator(); iterator.hasNext();) {
			URL url = iterator.next();
			URI uri = URI.createURI(url.toString());
			if (fragments.contains(uri.lastSegment())) {
				iterator.remove();
			}
			fragments.add(uri.lastSegment());
		}
		return results;
	}

	@Override
	public void notifyLifecyle(LifecycleEvent event) {
		if (event.getState() == IBuilderParticipant.LifecycleEvent.INITIALIZE) {
			initialize();
		} else if (event.getState() == IBuilderParticipant.LifecycleEvent.ACTIVATED) {
			ViewService datatypesService = new ViewService();
			datatypesServiceRegister = context.getBundleContext()
					.registerService(IECViewAddonsMetadataService.class,
							datatypesService, null);

		} else if (event.getState() == IBuilderParticipant.LifecycleEvent.DEACTIVATED) {
			if (datatypesServiceRegister != null) {
				datatypesServiceRegister.unregister();
				datatypesServiceRegister = null;
			}

			if (metadataBuilderService != null) {
				metadataBuilderService.removeFromBundleSpace(context
						.getBundleContext().getBundle());
			}
		}
	}

	private void initialize() {
		StandaloneGrammarsSetup.setup();
		metadataBuilderService.addToBundleSpace(context.getBundleContext()
				.getBundle());
	}

	/**
	 * Provided as an OSGi service to return ui models for the given qualified
	 * name.
	 */
	private class ViewService implements IECViewAddonsMetadataService {

		@Override
		public YView getViewMetadata(String modelName) {
			UiView uiView = (UiView) metadataBuilderService.getMetadata(
					modelName, UiModelPackage.Literals.UI_IDE_VIEW);
			if (uiView == null) {
				// also try mobile view
				uiView = (UiView) metadataBuilderService.getMetadata(modelName,
						UiModelPackage.Literals.UI_MOBILE_VIEW);
				if (uiView == null) {
					return null;
				}
			}

			return (YView) EcoreUtil.copy(uiView.eResource().getContents()
					.get(uiView.eResource().getContents().size() - 1));
		}

		@Override
		public List<String> getIDEViewNames(String packageName,
				boolean includeChildren) {
			List<String> viewNames = getViewNames(
					UiModelPackage.Literals.UI_IDE_VIEW, packageName,
					includeChildren);
			return viewNames;
		}

		@Override
		public List<String> getMobileViewNames(String packageName,
				boolean includeChildren) {
			List<String> viewNames = getViewNames(
					UiModelPackage.Literals.UI_MOBILE_VIEW, packageName,
					includeChildren);
			return viewNames;
		}

		private List<String> getViewNames(EClass type, String packageName,
				boolean includeChildren) {
			Set<String> processedPackages = new HashSet<String>();
			List<String> viewNames = new ArrayList<String>(5);
			for (IEObjectDescription desc : metadataBuilderService
					.getAllDescriptions(type)) {
				String pkg = desc.getQualifiedName().skipLast(1).toString();
				boolean match = false;
				if (packageName == null && includeChildren) {
					match = true;
				} else if (packageName == null && !includeChildren) {
					match = !isSuccessorPackage(pkg, processedPackages);
				} else if (includeChildren) {
					match = pkg.startsWith(packageName);
				} else {
					match = pkg.equals(packageName);
				}

				if (match) {
					viewNames.add(desc.getQualifiedName().toString());
				}
			}
			return viewNames;
		}

		private boolean isSuccessorPackage(String pkg,
				Set<String> processedPackages) {
			for (String processed : processedPackages) {
				if (pkg.startsWith(processed)) {
					return true;
				}
			}
			return false;
		}
	}
}
