/********************************************************************************
 * Copyright (c) 2015-2019 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.filerelease.control;

import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.eclipse.mdm.api.dflt.EntityManager;
import org.eclipse.mdm.filerelease.control.converter.FileConverterException;
import org.eclipse.mdm.filerelease.control.converter.IFileConverter;
import org.eclipse.mdm.filerelease.entity.FileRelease;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Job for converting files.
 * 
 * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
 *
 */
public class FileConvertJob implements Runnable {

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

	private final IFileConverter fileConverter;
	private final FileRelease fileRelease;
	private final TestStep testStep;
	private final ApplicationContext context;
	private final File targetDirectory;

	/**
	 * Constructor
	 * 
	 * @param fileRelease     The {@link FileRelease} that contains the link to the
	 *                        file to convert
	 * @param fileConverter   The {@link IFileConverter} to use for the conversion
	 * @param testStep        The {@link TestStep}
	 * @param em              The {@link EntityManager}
	 * @param targetDirectory target output directory for the generated files
	 */
	public FileConvertJob(FileRelease fileRelease, IFileConverter fileConverter, TestStep testStep,
			ApplicationContext context, File targetDirectory) {

		this.fileRelease = fileRelease;
		this.fileConverter = fileConverter;
		this.testStep = testStep;
		this.context = context;
		this.targetDirectory = targetDirectory;
	}

	/**
	 * Executes the file conversion.
	 */
	@Override
	public void run() {
		try {
			this.fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_PROGRESSING;

			this.fileConverter.execute(this.fileRelease, this.testStep, this.context, this.targetDirectory);

			this.fileRelease.expire = calculateExpireDate(this.fileRelease.validity);
			this.fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_RELEASED;

		} catch (FileConverterException e) {
			this.fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_PROGRESSING_ERROR;
			this.fileRelease.errorMessage = e.getMessage();
			LOG.error(e.getMessage(), e);
		} catch (Exception e) {
			this.fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_PROGRESSING_ERROR;
			this.fileRelease.errorMessage = e.getMessage();
			LOG.error(e.getMessage(), e);
		}
	}

	private long calculateExpireDate(int validity) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(new Date());
		calendar.add(Calendar.DAY_OF_MONTH, validity);
		return calendar.getTimeInMillis();
	}
}
