/*******************************************************************************
 * Copyright (c) 2019 CEA LIST.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     	Shuai Li (CEA LIST) <shuai.li@cea.fr> - initial API and implementation
 *******************************************************************************/
package org.eclipse.papyrus.iotml.wot.td.codegen;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.papyrus.designer.languages.common.base.ModelElementsCreator;
import org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen2;
import org.eclipse.papyrus.designer.languages.common.extensionpoints.MethodInfo;
import org.eclipse.papyrus.designer.languages.common.extensionpoints.SyncInformation;
import org.eclipse.papyrus.iotml.wot.td.codegen.transformation.TDModelElementsCreator;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.PackageableElement;

/**
 * TD language support.
 *
 */
public class TDLangCodegen implements ILangCodegen2 {

	private static final String TD_GENERATOR_DESC = "A WoT TD generator."; //$NON-NLS-1$

	protected ModelElementsCreator creator = null;
	
	/**
	 * The translation of the Model to the TD code.
	 */
	protected PackageableElement pe;

	protected IProject lastProject = null;

	/**
	 * Constructor.
	 *
	 * @param modelToTDQueries
	 *            The translation of the Model to the TD code
	 */
	public TDLangCodegen(PackageableElement pe) {
		this.pe = pe;
	}

	/**
	 * @see org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen2#getDescription()
	 *
	 * @return
	 */
	@Override
	public String getDescription() {
		return TD_GENERATOR_DESC;
	}

	/**
	 * @see org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen2#isEligible(org.eclipse.uml2.uml.Element)
	 *
	 * @param modelElement
	 * @return
	 */
	@Override
	public boolean isEligible(Element modelElement) {
		if (modelElement instanceof PackageableElement) {
			return true;
		}
		return false;
	}

	/**
	 * @see org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen2#getSuffix(org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen.FILE_KIND)
	 *
	 * @param fileKind
	 * @return
	 */
	@Override
	public String getSuffix(FILE_KIND fileKind) {
		return "json";
	}

	/**
	 * @see org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen#generateCode(org.eclipse.core.resources.IProject, org.eclipse.uml2.uml.PackageableElement, org.eclipse.core.runtime.IProgressMonitor)
	 *
	 * @param project
	 * @param element
	 * @param monitor
	 */
	@Override
	public void generateCode(IProject project, PackageableElement element, IProgressMonitor monitor) {
		manageCreator(project, element);
		creator.createPackageableElement(element, monitor);
	}

	/**
	 * @see org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen#cleanCode(org.eclipse.core.resources.IProject, org.eclipse.uml2.uml.PackageableElement, org.eclipse.core.runtime.IProgressMonitor)
	 *
	 * @param project
	 * @param element
	 * @param monitor
	 */
	@Override
	public void cleanCode(IProject project, PackageableElement element, IProgressMonitor monitor) {
		manageCreator(project, element);
		creator.removePackageableElement(element, monitor);
	}

	/**
	 * @see org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen#getFileName(org.eclipse.core.resources.IProject, org.eclipse.uml2.uml.NamedElement)
	 *
	 * @param project
	 * @param element
	 * @return
	 */
	@Override
	public String getFileName(IProject project, NamedElement element) {
		manageCreator(project, element);
		return creator.getFileName(element);
	}

	/**
	 * @see org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen#getTargetProject(org.eclipse.uml2.uml.PackageableElement, boolean)
	 *
	 * @param pe
	 * @param createIfMissing
	 * @return
	 */
	@Override
	public IProject getTargetProject(PackageableElement pe, boolean createIfMissing) {
		return null;
	}

	/**
	 * Manage the TDModelElementsCreator.
	 * 
	 * @param project
	 *            The target project
	 * @param element
	 *            the selected element
	 */
	protected void manageCreator(IProject project, Element element) {
		if ((project == null) && (element instanceof PackageableElement)) {
			project = getTargetProject((PackageableElement) element, false);
		}

		if ((creator == null) || (project != lastProject)) {
			lastProject = project;
			creator = new TDModelElementsCreator(project, (PackageableElement) element);
		}
	}

	/**
	 * @see org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen2#getSyncInformation(java.lang.String, java.lang.String)
	 *
	 * @param methodName
	 * @param body
	 * @return
	 */
	@Override
	public SyncInformation getSyncInformation(String methodName, String body) {
		return null;
	}

	/**
	 * @see org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen2#getMethodInfo(org.eclipse.uml2.uml.NamedElement)
	 *
	 * @param operationOrBehavior
	 * @return
	 */
	@Override
	public MethodInfo getMethodInfo(NamedElement operationOrBehavior) {
		return null;
	}
}
