/********************************************************************************
 * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/
package org.eclipse.mdm.apicopy.boundary;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.management.ServiceNotFoundException;
import javax.ws.rs.core.Response;

import org.eclipse.mdm.api.base.ConnectionException;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.eclipse.mdm.api.dflt.ApplicationContextFactory;
import org.eclipse.mdm.api.dflt.model.Project;
import org.eclipse.mdm.apicopy.ApiCopyException;
import org.eclipse.mdm.apicopy.ApiCopyService;
import org.eclipse.mdm.apicopy.ApiCopyServiceImpl;
import org.eclipse.mdm.apicopy.entity.CopyStatusResponse;
import org.eclipse.mdm.apicopy.entity.CopyStatusResponse.State;
import org.eclipse.mdm.connector.boundary.ConnectorService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Function;
import com.google.common.collect.ImmutableMap;

/**
 * Service for importing an ATFX file into a MDM datasource.
 *
 */
@Stateless
public class ImportService {

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

	// TODO make temp path configurable
	private static final Path TMP = Paths.get(System.getProperty("java.io.tmpdir"));

	@Inject
	private ConnectorService connectorService;

	private ApiCopyService apiCopyService = new ApiCopyServiceImpl();

	private final String atfxContextFactoryClassname = "org.eclipse.mdm.api.atfxadapter.ATFXContextFactory";

	/**
	 * Default public constructor
	 */
	public ImportService() {
	}

	/**
	 * Imports an ATFX file into the provided datasource.
	 *
	 * @param atfxFileSupplier returns a {@link Path} to an ATFX file. Accompanying
	 *                         binary files are expected to be on the same folder.
	 * @param dstContextName   target datasource of the import
	 * @return
	 */
	public Response importAtfx(Function<Path, Path> atfxFileSupplier, String dstContextName) {
		ApplicationContext contextDst = connectorService.getContextByName(dstContextName);

		Path tmpDir = null;
		try {
			tmpDir = Files.createTempDirectory(TMP, "atfximport");

			Path atfxFile = atfxFileSupplier.apply(tmpDir);

			Map<String, String> params = ImmutableMap.of("atfxfile", atfxFile.toFile().getAbsolutePath(),
					"freetext.active", "false");

			ApplicationContext contextSrc = connectContext(atfxContextFactoryClassname, params);
			List<Project> projects = contextSrc.getEntityManager()
					.orElseThrow(() -> new ServiceNotFoundException("EntityManager not found!")).loadAll(Project.class);

			apiCopyService.newApiCopyTask(contextSrc, contextDst).copy(projects);

			CopyStatusResponse response = new CopyStatusResponse();
			response.setState(State.OK);
			return Response.ok(response).build();
		} catch (ServiceNotFoundException e) {
			throw new ApiCopyException("Could not retrive all required services from ATFX application context!", e);
		} catch (ConnectionException e) {
			throw new ApiCopyException("Could not create ATFX application context!", e);
		} catch (IOException e) {
			throw new ApiCopyException("Cold not create temporary directory!", e);
		} finally {
			if (tmpDir != null) {
				try {
					deleteDirectory(tmpDir);
				} catch (IOException e) {
					LOG.warn("Could not delete temporary directory " + tmpDir.toFile().getAbsolutePath(), e);
				}
			}
		}
	}

	/**
	 * Deletes a directory.
	 * 
	 * @param pathToBeDeleted directory to delete
	 * @throws IOException
	 */
	private void deleteDirectory(java.nio.file.Path pathToBeDeleted) throws IOException {
		Files.walk(pathToBeDeleted).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
	}

	/**
	 * Connects to a {@link ApplicationContext}.
	 * 
	 * @param contextFactoryClassname classname of the
	 *                                {@link ApplicationContextFactory}
	 * @param parameters              connection parameters
	 * @return connected {@link ApplicationContext}
	 * @throws ConnectionException
	 */
	private ApplicationContext connectContext(String contextFactoryClassname, Map<String, String> parameters)
			throws ConnectionException {
		try {

			Class<? extends ApplicationContextFactory> contextFactoryClass = Thread.currentThread()
					.getContextClassLoader().loadClass(contextFactoryClassname)
					.asSubclass(ApplicationContextFactory.class);

			ApplicationContextFactory contextFactory = contextFactoryClass.newInstance();
			return contextFactory.connect(parameters);
		} catch (Exception e) {
			throw new ConnectionException(
					"failed to initialize entity manager using factory '" + contextFactoryClassname + "'", e);
		}
	}
}
