/**
 * *******************************************************************************
 * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency 
 * 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:
 *      Regent L'Archeveque - initial API and implementation
 *         
 * SPDX-License-Identifier: EPL-1.0    
 * *******************************************************************************
 */
package org.eclipse.apogy.core.environment.earth.orbit.planner.impl;

import java.lang.reflect.InvocationTargetException;

import java.util.List;

import org.eclipse.apogy.common.emf.EObjectReferencesList;

import org.eclipse.apogy.core.environment.earth.orbit.VisibilityPass;

import org.eclipse.apogy.core.environment.earth.orbit.planner.ApogyCoreEnvironmentEarthOrbitPlannerFacade;
import org.eclipse.apogy.core.environment.earth.orbit.planner.ApogyCoreEnvironmentEarthOrbitPlannerPackage;
import org.eclipse.apogy.core.environment.earth.orbit.planner.ObservationAnalysisPlanner;
import org.eclipse.apogy.core.environment.earth.orbit.planner.ObservationAnalysisPlannerNode;
import org.eclipse.apogy.core.environment.earth.orbit.planner.ObservationAnalysisPlannerTool;

import org.eclipse.core.runtime.IProgressMonitor;

import org.eclipse.emf.common.util.EList;

import org.eclipse.emf.ecore.EClass;

import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Facade</b></em>'.
 * <!-- end-user-doc -->
 *
 * @generated
 */
public abstract class ApogyCoreEnvironmentEarthOrbitPlannerFacadeImpl extends MinimalEObjectImpl.Container implements ApogyCoreEnvironmentEarthOrbitPlannerFacade {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ApogyCoreEnvironmentEarthOrbitPlannerFacadeImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return ApogyCoreEnvironmentEarthOrbitPlannerPackage.Literals.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ObservationAnalysisPlannerNode generateObservationsPlanTree(List<VisibilityPass> passes, IProgressMonitor monitor) {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ObservationAnalysisPlanner computePlanCosts(ObservationAnalysisPlanner planner, IProgressMonitor monitor) {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ObservationAnalysisPlannerTool getObservationAnalysisPlannerTool() {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public List<ObservationAnalysisPlannerNode> getLeafs(ObservationAnalysisPlannerNode root) {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EObjectReferencesList<ObservationAnalysisPlannerNode> getPlannerSolution(ObservationAnalysisPlannerNode leaf) {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EObjectReferencesList<VisibilityPass> getVisibilityPasses(List<ObservationAnalysisPlannerNode> nodesList) {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public double getNodeStatelessTotalCost(ObservationAnalysisPlannerNode node) {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public double getNodeStatefulTotalCost(ObservationAnalysisPlannerNode node) {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public double getNodeTotalCost(ObservationAnalysisPlannerNode node) {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public double getSolutionTotalCost(EObjectReferencesList<ObservationAnalysisPlannerNode> plan) {
		// TODO: implement this method
		// Ensure that you remove @generated or mark it @generated NOT
		throw new UnsupportedOperationException();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	@SuppressWarnings("unchecked")
	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
		switch (operationID) {
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___GENERATE_OBSERVATIONS_PLAN_TREE__LIST_IPROGRESSMONITOR:
				return generateObservationsPlanTree((List<VisibilityPass>)arguments.get(0), (IProgressMonitor)arguments.get(1));
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___COMPUTE_PLAN_COSTS__OBSERVATIONANALYSISPLANNER_IPROGRESSMONITOR:
				return computePlanCosts((ObservationAnalysisPlanner)arguments.get(0), (IProgressMonitor)arguments.get(1));
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___GET_OBSERVATION_ANALYSIS_PLANNER_TOOL:
				return getObservationAnalysisPlannerTool();
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___GET_LEAFS__OBSERVATIONANALYSISPLANNERNODE:
				return getLeafs((ObservationAnalysisPlannerNode)arguments.get(0));
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___GET_PLANNER_SOLUTION__OBSERVATIONANALYSISPLANNERNODE:
				return getPlannerSolution((ObservationAnalysisPlannerNode)arguments.get(0));
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___GET_VISIBILITY_PASSES__LIST:
				return getVisibilityPasses((List<ObservationAnalysisPlannerNode>)arguments.get(0));
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___GET_NODE_STATELESS_TOTAL_COST__OBSERVATIONANALYSISPLANNERNODE:
				return getNodeStatelessTotalCost((ObservationAnalysisPlannerNode)arguments.get(0));
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___GET_NODE_STATEFUL_TOTAL_COST__OBSERVATIONANALYSISPLANNERNODE:
				return getNodeStatefulTotalCost((ObservationAnalysisPlannerNode)arguments.get(0));
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___GET_NODE_TOTAL_COST__OBSERVATIONANALYSISPLANNERNODE:
				return getNodeTotalCost((ObservationAnalysisPlannerNode)arguments.get(0));
			case ApogyCoreEnvironmentEarthOrbitPlannerPackage.APOGY_CORE_ENVIRONMENT_EARTH_ORBIT_PLANNER_FACADE___GET_SOLUTION_TOTAL_COST__EOBJECTREFERENCESLIST:
				return getSolutionTotalCost((EObjectReferencesList<ObservationAnalysisPlannerNode>)arguments.get(0));
		}
		return super.eInvoke(operationID, arguments);
	}

} //ApogyCoreEnvironmentEarthOrbitPlannerFacadeImpl
