/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2005, 2012 SAP AG.
 * 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:
 *    Stefan Dimov - initial API, implementation and documentation
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.jpt.jpadiagrameditor.ui.internal.modelintegration.ui;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.JPADiagramEditorPlugin;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.i18n.JPAEditorMessages;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.modelintegration.util.ModelIntegrationUtil;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.util.IJPADiagramEditorInput;


public class JPADiagramEditorInput extends DiagramEditorInput 
									implements IJPADiagramEditorInput {
	
	private Diagram diagram;
	private String projectName;

	public JPADiagramEditorInput(Diagram diagram,
								 URI diagramUri,
								 String providerId) {
		
		super(diagramUri, providerId);
		this.diagram = diagram;
		this.projectName = ModelIntegrationUtil.getProjectByDiagram(diagram.getName()).getName();
	}
	
	@Override
	@SuppressWarnings("rawtypes")
	public Object getAdapter(Class adapter) {
		if (adapter.equals(EObject.class)) {
			return getDiagram();
		} 
		if (adapter.equals(Diagram.class)) {
			return getDiagram();
		}
		if (adapter.equals(TransactionalEditingDomain.class))
			return ModelIntegrationUtil.getTransactionalEditingDomain(diagram);
		if (adapter.equals(IFile.class)) {
			Resource eResource = diagram.eResource();
			URI eUri = eResource.getURI();
			if (eUri.isPlatformResource()) {
				String platformString = eUri.toPlatformString(true);
				return ResourcesPlugin.getWorkspace().getRoot()
						.findMember(platformString);
			} else {
				IProject project = ModelIntegrationUtil.getProjectByDiagram(
						diagram.getName()).getProject();
				return findXMLFile(project);
			}
		}
		return null;
	}
	
	private IFile findXMLFile(IProject project){
		try {
			IResource[] resources = project.members();
			for (IResource res : resources) {
				if (res instanceof IFolder) {
					IFile existingXMLFile = ((IFolder) res)
							.getFile(diagram.getName()
									+ "." + ModelIntegrationUtil.DIAGRAM_XML_FILE_EXTENSION); //$NON-NLS-1$
					if (existingXMLFile != null && existingXMLFile.exists()) {
						return existingXMLFile;
					}
				}
			}
		} catch (CoreException e) {
			JPADiagramEditorPlugin
					.logError(
							JPAEditorMessages.EntitiesCoordinatesXML_CannotObtainProjectErrorMSG,
							e);
		}
		IFile existingXMLFile = project.getFile(ModelIntegrationUtil
				.getDiagramsXMLFolderPath(project)
				.append(diagram.getName())
				.addFileExtension(
						ModelIntegrationUtil.DIAGRAM_XML_FILE_EXTENSION));
		if (existingXMLFile != null && existingXMLFile.exists()) {
			return existingXMLFile;
		}
		return null;
	}
	
	public Diagram getDiagram() {
		return diagram;
	}	
	
	public static JPADiagramEditorInput createEditorInput(Diagram diagram, String providerId) {
		final Resource resource = diagram.eResource();
		if (resource == null) {
			throw new IllegalArgumentException();
		}
		final String fragment = resource.getURIFragment(diagram);
		final URI fragmentUri = resource.getURI().appendFragment(fragment);
		JPADiagramEditorInput diagramEditorInput;
		diagramEditorInput = new JPADiagramEditorInput(diagram, fragmentUri, providerId);
		return diagramEditorInput;
	}
	

	public String getProjectName() {
		return projectName;
	}

}
