package eu.dnetlib.data.espas.dataprovider;

import eu.dnetlib.api.data.espas.DataProviderServiceException;
import eu.dnetlib.domain.data.espas.HarvestSchedule;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.sql.SQLException;
import java.text.ParseException;
import java.util.Date;

/**
 * Created by antleb on 6/25/14.
 */
public class HarvestJob implements Job {
	private static Logger logger = Logger.getLogger(HarvestJob.class);

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		String scheduleId = (String) context.getJobDetail().getJobDataMap().get("scheduleId");
		HarvestManager manager = (HarvestManager) context.getMergedJobDataMap().get("harvestManager");
		ScheduleDao scheduleDao = (ScheduleDao) context.getMergedJobDataMap().get("scheduleDao");

		try {
			HarvestSchedule schedule = scheduleDao.getSchedule(scheduleId);
			Date dateFrom = getDateFrom(schedule);
			Date dateTo = new Date();

			schedule.setLastExecutionDate(dateTo);

			scheduleDao.saveSchedule(schedule);

			manager.harvest(schedule.getTypes(), dateFrom, dateTo, schedule.getDataProviderId());
		} catch (DataProviderServiceException e) {
			logger.error("Error executing job", e);
		} catch (ParseException e) {
			logger.error("Error executing job", e);
		} catch (SQLException e) {
			logger.error("Error executing job", e);
		}
	}

	private Date getDateFrom(HarvestSchedule schedule) throws ParseException {
		if (schedule.getLastExecutionDate() == null)
			return schedule.getInitialModificationDate();
		else
			return schedule.getLastExecutionDate();
	}
}
