/*******************************************************************************
 * Copyright (c) 2004, 2005 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl;

/**
 * Drives the model. Acts as the model entry point, including create, load, save
 * operations.
 * 
 * @author Xiao-guang Zhang
 */
public class PageflowModelManager {
	/**
	 * In EMF, a resource provides the way to have access to the model content.
	 */
	private Resource resourcePageflow = null;

	/**
	 * the path of current pageflow model resource provides the way to have
	 * access to the model content.
	 */
	private IPath pathPageflow = null;

	/**
	 * Contains the factory associated with the model.
	 */
	private static PageflowFactory pageflowFactory = null;

	/**
	 * Gives access to the top level pageflow contained in the resource.
	 */
	private Pageflow pageflow = null;

	/**
	 * resource set
	 */
	private ResourceSet resourceSet = null;

	/** unicode encoding UTF-8 support */
	private static HashMap defaultSaveOptions = new HashMap();

	static {
		defaultSaveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
	}

	/**
	 * Uses lazy initialization.
	 * 
	 * @param path -
	 *            pageflow file name
	 * @return the resource containing the pageflow
	 */
	public Resource getResource(IPath path) {
		if (resourcePageflow == null) {
			pathPageflow = path;
			ResourceSet resSet = getResourceSet();
			resourcePageflow = resSet.getResource(URI.createPlatformResourceURI(path
					.toString()), true);
		}

		return resourcePageflow;
	}

	/**
	 * 
	 * @return the top level pageflow model
	 */
	public Pageflow getModel() {
		if (null == pageflow) {
			EList l = resourcePageflow.getContents();
			Iterator i = l.iterator();
			while (i.hasNext()) {
				Object o = i.next();
				if (o instanceof Pageflow) {
					pageflow = (Pageflow) o;
				}
			}
		}
		return pageflow;
	}

	/**
	 * Creates a resource to contain the network. The resource file does not
	 * exist yet.
	 * 
	 * @param path
	 * @return
	 */
	private Resource createResource(IPath path) {
		if (resourcePageflow == null) {
			pathPageflow = path;
			ResourceSet resSet = getResourceSet();
			resourcePageflow = resSet.createResource(URI.createPlatformResourceURI(path
					.toString()));
		}
		return resourcePageflow;
	}

	/**
	 * Returns the resource set.
	 * 
	 * @param
	 * @return
	 */
	private ResourceSet getResourceSet() {
		if (null == resourceSet) {
			// Initialize the pageflow package, this line can not be removed.
			PageflowPackageImpl.init();
			// Register the XML resource factory for the .pageflow extension
			Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
			Map regMap = reg.getExtensionToFactoryMap();
			// m.put("pageflow", new XMIResourceFactoryImpl());
			regMap.put("pageflow", new PageflowResourceFactoryImpl());

			resourceSet = new ResourceSetImpl();
		}

		return resourceSet;
	}

	/**
	 * Returns the factory associated with the model. Object creation are made
	 * through that factory.
	 * 
	 * @return - pageflow factory
	 */
	static public PageflowFactory getFactory() {
		if (pageflowFactory == null) {
			// Access the factory (needed to create instances)
			Map registry = EPackage.Registry.INSTANCE;
			String pageflowURI = PageflowPackage.eNS_URI;
			PageflowPackage pageflowPackage = (PageflowPackage) registry
					.get(pageflowURI);
			pageflowFactory = pageflowPackage.getPageflowFactory();
		}
		return pageflowFactory;
	}

	/**
	 * Creates a new pageflow model with begin and end nodes.
	 * 
	 * @param path -
	 *            the new pageflow file name
	 * @return - new pageflow model
	 */
	public Pageflow createPageflow(IPath path) {
		createResource(path);
		// Create a new pageflow model
		Map registry = EPackage.Registry.INSTANCE;
		String pageflowURI = PageflowPackage.eNS_URI;
		PageflowPackage nPackage = (PageflowPackage) registry.get(pageflowURI);
		PageflowFactory nFactory = nPackage.getPageflowFactory();
		pageflow = nFactory.createPageflow();

		resourcePageflow.getContents().add(pageflow);
		return pageflow;
	}

	/**
	 * Loads the content of the model from the file.
	 * 
	 * @param path
	 */
	public void load(IPath path) {
		getResource(path);
	}

	/**
	 * reloads the content of the model from the file.
	 * 
	 * @param path
	 */
	public void reload(IPath path) {
		getResource(path).unload();
		load(path);
	}

	/**
	 * Saves the content of the model to the file.
	 * 
	 * @param path
	 */
	public void save(final IPath path) throws IOException {
		if (!pathPageflow.toString().equalsIgnoreCase(path.toString())) {
			pathPageflow = path;
			URI fileURI = URI.createPlatformResourceURI(path.toString());
			resourcePageflow.setURI(fileURI);
		}
		resourcePageflow.save(defaultSaveOptions);
	}

	/**
	 * get the file path of current pageflow resource
	 * 
	 * @return - the file path
	 */
	public IPath getPath() {
		return pathPageflow;
	}

	/**
	 * @param webPath
	 * @return found page node according the web path.
	 */
	public PageflowPage foundPage(String webPath) {
		PageflowPage page = null;

		if (getModel() != null) {
			Iterator iterNodes = getModel().getNodes().iterator();
			while (iterNodes.hasNext()) {
				PageflowNode node = (PageflowNode) iterNodes.next();
				if (node instanceof PageflowPage) {
					if (((PageflowPage) node).getPath().equalsIgnoreCase(webPath)) {
						page = (PageflowPage) node;
						break;
					}
				}
			}
		}

		return page;
	}

	/**
	 * 
	 * Build a path for the resource in the .metadata directory given the path
	 * of the model resource. For example, given a model resource path of
	 * \test\folder\filename.ext the resulting Pageflow path name will be
	 * \test\.metadata\folder\filename.pageflow
	 * 
	 * @param pathFacesConfig -
	 *            faces-config file path.
	 * 
	 * @return the ipath
	 */
	public static IPath makePageflowPath(IPath pathFacesConfig) {
		IPath pageflowPath;
		String[] segs = pathFacesConfig.removeFileExtension().segments();
		pageflowPath = new Path(segs[0]).makeAbsolute();
		pageflowPath = pageflowPath.append(".metadata");
		for (int i = 1; i < segs.length; i++) {
			pageflowPath = pageflowPath.append(segs[i]);
		}
		// pageflowPath.removeFileExtension();
		pageflowPath = pageflowPath.addFileExtension("pageflow");
		return pageflowPath;
	}
}
