/**
 ********************************************************************************
 * Copyright (c) 2018-2021 Robert Bosch GmbH and others.
 * 
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Robert Bosch GmbH - initial API and implementation
 ********************************************************************************
 */

package app4mc.example.transform.m2m.loader;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.app4mc.amalthea.model.Amalthea;
import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
import org.eclipse.app4mc.amalthea.model.emf.AmaltheaResourceFactory;
import org.eclipse.app4mc.amalthea.model.emf.AmaltheaResourceSetImpl;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * AmaltheaMultiFileLoader
 * 
 * Should be replaced by standard AmaltheaLoader (APP4MC version > 1.0.0)
 *
 */
public class AmaltheaMultiFileLoader implements IMultiFileLoader {

	private static final Logger LOG = LoggerFactory.getLogger(AmaltheaMultiFileLoader.class);

	public ResourceSet loadMultipleFiles(String directoryPath) {

		File folder = new File(directoryPath);

		if (folder.isDirectory()) {
			File[] listFiles = folder.listFiles((file, name) -> name.endsWith(".amxmi"));

			ResourceSet resourceSet = initializeResourceSet();
			loadMultipleFiles(resourceSet, listFiles);
			return resourceSet;
		}

		return new ResourceSetImpl();

	}

	private List<Amalthea> loadMultipleFiles(ResourceSet resourceSet, File[] listFiles) {

		List<Amalthea> models = new ArrayList<>();

		for (File amxmiFile : listFiles) {

			final Resource res = resourceSet.createResource(URI.createURI("file:////" + amxmiFile.getAbsolutePath()));
			try {
				res.load(null);
				for (final EObject content : res.getContents()) {
					if (content instanceof Amalthea) {
						models.add((Amalthea) content);
					}
				}
			} catch (IOException e) {
				LOG.error(e.getMessage(),e);
			}
		}
		return models;
	}

	private static ResourceSet initializeResourceSet() {
		final AmaltheaResourceSetImpl resSet = new AmaltheaResourceSetImpl();
		resSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("amxmi", new AmaltheaResourceFactory());
		AmaltheaPackage.eINSTANCE.eClass(); // register the package

		return resSet;
	}

}
