// PopulationModelSpecification.java
package org.eclipse.stem.internal.data.geography.population.human.models;

/*******************************************************************************
 * Copyright (c) 2009 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.Map;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.stem.core.Utility;
import org.eclipse.stem.core.graph.Graph;
import org.eclipse.stem.core.model.Model;
import org.eclipse.stem.core.model.ModelPackage;
import org.eclipse.stem.definitions.labels.LabelsPackage;
import org.eclipse.stem.geography.names.ISOKey;
import org.eclipse.stem.internal.data.generatedplugin.DublinCore;
import org.eclipse.stem.internal.data.geography.specifications.AdminLevelSet;
import org.eclipse.stem.internal.data.geography.specifications.CountryGraphPropertyFileSpecification;
import org.eclipse.stem.internal.data.specifications.GraphPropertyFileSpecification;
import org.eclipse.stem.internal.data.specifications.ModelSpecification;

/**
 * This class represents a {@link ModelSpecification} for a Population model.
 */
public class PopulationModelSpecification extends ModelSpecification implements
		Comparable<PopulationModelSpecification> {

	/**
	 * This is referenced to cause the {@link ModelPackage} to register itself
	 * as a package.
	 */
	@SuppressWarnings("unused")
	private final ModelPackage modelPackage = ModelPackage.eINSTANCE;
	@SuppressWarnings("unused")
	private final LabelsPackage labelsPackage = LabelsPackage.eINSTANCE;

	private final ISOKey isoKey;
	private final AdminLevelSet adminLevelSet;
	private final DublinCore countryGeographicModelDC;
	private final DublinCore populationGraphDC;

	static {
		// This sets up the mapping between the "platform" URI's and the
		// projects in the file system.

		// CWD is the current working directory
		final String CWD = System.getProperty("user.dir"); //$NON-NLS-1$
		// WORKSPACE is the directory of the parent workspace
		final String WORKSPACE = CWD.substring(0, CWD
				.lastIndexOf(File.separator));

		// The path to the generated geography data project
		final String GEOGRAPHY_MODELS_PROJECT_ROOT = WORKSPACE
				+ File.separator
				+ org.eclipse.stem.data.geography.models.Activator.PLUGIN_ID
				+ File.separator;

		// The path to the generated population data project
		final String HUMAN_POPULATION_GRAPHS_PROJECT_ROOT = WORKSPACE
				+ File.separator
				+ org.eclipse.stem.data.geography.population.human.Activator.PLUGIN_ID
				+ File.separator;

		final Map<String, URI> platformResourceMap = EcorePlugin
				.getPlatformResourceMap();

		// Register the mapping between the project id and the absolute path to
		// the project in the file system. This will be found later when
		// deserializing when the platform URI is mapped.
		platformResourceMap.put(
				org.eclipse.stem.data.geography.models.Activator.PLUGIN_ID,
				URI.createFileURI(GEOGRAPHY_MODELS_PROJECT_ROOT));

		platformResourceMap
				.put(
						org.eclipse.stem.data.geography.population.human.Activator.PLUGIN_ID,
						URI.createFileURI(HUMAN_POPULATION_GRAPHS_PROJECT_ROOT));
	} // static

	/**
	 * @param isoKey
	 *            the {@link ISOKey} of the country the population model is for.
	 * @param adminLevelSet
	 *            the administration levels covered in the model
	 * @param countryGeographicModelDC
	 * @param populationGraphDC
	 */
	public PopulationModelSpecification(ISOKey isoKey,
			AdminLevelSet adminLevelSet, DublinCore countryGeographicModelDC,
			DublinCore populationGraphDC) {
		this.isoKey = isoKey;
		this.adminLevelSet = adminLevelSet;
		this.countryGeographicModelDC = countryGeographicModelDC;
		this.populationGraphDC = populationGraphDC;
	} // PopulationModelSpecification

	/**
	 * @see org.eclipse.stem.internal.data.specifications.ModelSpecification#createIdentifiableInstance()
	 */
	@Override
	protected Model createIdentifiableInstance() {
		final Model retValue = super.createIdentifiableInstance();
		// The generated Graphs etc., all have dublin core that references
		// them as plugins. This is as it should be when STEM is running,
		// but right now we're running stand-alone and want to access the
		// plugins as projects (they aren't plugged into our running version
		// of Eclipse). Substitute "resource" for "plugin" in the URI's we
		// use and all will be well.
		
		try {
			
			File geoModelFile = new File(getIdentifiableProjectURI(countryGeographicModelDC).path().replace("/resource/", "../../geography/"));
			
			retValue
					.getModels()
					.add(
							(Model) Utility
									.getIdentifiableFromStream(getIdentifiableProjectURI(countryGeographicModelDC), 
											new FileInputStream(geoModelFile), Collections
													.<String, Object> emptyMap(),false));
	
			File popGraphFile = new File(getIdentifiableProjectURI(populationGraphDC).path().replace("/resource/", "../../population/"));
			
			retValue
					.getGraphs()
					.add(
							(Graph) Utility.getIdentifiableFromStream(getIdentifiableProjectURI(populationGraphDC), 
									new FileInputStream(popGraphFile), Collections.<String, Object>emptyMap(), false));
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}

		return retValue;
	} // createIdentifiableInstance

	/**
	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getRelativeSerializationPath()
	 */
	@Override
	protected String getRelativeSerializationPath() {
		final StringBuilder sb = new StringBuilder();
		sb.append(CountryGraphPropertyFileSpecification.COUNTRY_DIR);
		sb.append(File.separatorChar);
		sb.append(getISOKey().toString());
		return sb.toString();
	}

	/**
	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getSerializationFileNameRoot()
	 */
	@Override
	protected String getSerializationFileNameRoot() {
		final StringBuilder sb = new StringBuilder(getISOKey().toString());
		sb.append("_"); //$NON-NLS-1$
		sb.append(adminLevelSet.toString());
		sb.append("_population"); //$NON-NLS-1$
		return sb.toString();
	}

	/**
	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getTargetPluginId()
	 */
	@Override
	protected String getTargetPluginId() {
		return org.eclipse.stem.data.geography.population.human.models.Activator.PLUGIN_ID;
	}

	/**
	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#getTitleDescriptor()
	 */
	@Override
	protected String getTitleDescriptor() {
		final StringBuilder sb = new StringBuilder(isoKey.toString());
		sb.append(" Human Population"); //$NON-NLS-1$
		sb
				.append(adminLevelSet.getNumAdminLevels() > 1 ? " (Levels: " : " (Level: "); //$NON-NLS-1$ //$NON-NLS-2$
		sb.append(adminLevelSet.toString(",")); //$NON-NLS-1$
		sb.append(")"); //$NON-NLS-1$
		return sb.toString();
	} // getTitleDescriptor

	/**
	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#createDubinCoreCoverage()
	 */
	@Override
	protected String createDubinCoreCoverage() {
		return countryGeographicModelDC.getCoverage();
	} // createDubinCoreCoverage

	/**
	 * @see org.eclipse.stem.internal.data.specifications.IdentifiableSpecification#createDubinCoreSubject()
	 */
	@Override
	protected String createDubinCoreSubject() {
		return GraphPropertyFileSpecification.createDublinCoreSubjectString(
				ModelPackage.Literals.MODEL.getName(), "population"); //$NON-NLS-1$
	}

	/**
	 * @return the isoKey
	 */
	public ISOKey getISOKey() {
		return isoKey;
	}

	public int compareTo(PopulationModelSpecification pms) {
		return adminLevelSet.getNumAdminLevels() > pms.adminLevelSet
				.getNumAdminLevels() ? 1 : -1;

	} // compareTo

	/**
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		final StringBuilder sb = new StringBuilder();
		sb.append(isoKey);
		sb.append(":"); //$NON-NLS-1$
		sb.append(adminLevelSet.toString());
		return sb.toString();
	} // toString

} // PopulationModelSpecification