package eu.dnetlib.server.adminpanel;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import eu.dnetlib.api.data.espas.DataProviderService;
import eu.dnetlib.api.data.espas.DataProviderServiceException;
import eu.dnetlib.client.adminpanel.HarvestInfoService;
import eu.dnetlib.domain.data.espas.HarvestHistory;
import eu.dnetlib.domain.data.espas.HarvestSchedule;
import eu.dnetlib.shared.HarvestHistoryInfo;
import eu.dnetlib.shared.HarvestScheduleInfo;
import gr.uoa.di.driver.util.ServiceLocator;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.util.*;

/**
 * Created by stefania on 6/17/14.
 */

@SuppressWarnings("serial")
public class HarvestInfoServiceImpl extends RemoteServiceServlet implements HarvestInfoService {

    private ServiceLocator<DataProviderService> dataProviderServiceLocator;

    public void init(ServletConfig config) throws ServletException {

        super.init(config);
        ApplicationContext context = WebApplicationContextUtils
                .getWebApplicationContext(getServletContext());

        dataProviderServiceLocator = (ServiceLocator<DataProviderService>) context.getBean("espasDataProviderServiceLocator");
    }

    @Override
    public void harvest(List<String> types, Date dateFrom, Date dateTo, String dataProviderId) throws DataProviderServiceException {
        dataProviderServiceLocator.getService().harvest(types, dateFrom, dateTo, dataProviderId);
    }

    @Override
    public String scheduleHarvest(List<String> types, Date initialDate, String dataProviderId, String cronExpression) throws DataProviderServiceException {
        return dataProviderServiceLocator.getService().scheduleHarvest(types, initialDate, dataProviderId, cronExpression);
    }

    @Override
    public void updateHarvestSchedule(String scheduleId, List<String> types, String dataProviderId, String cronExpression) throws DataProviderServiceException {
        dataProviderServiceLocator.getService().updateHarvestSchedule(scheduleId, types, dataProviderId, cronExpression);
    }

    @Override
    public void pauseHarvestSchedules(List<String> scheduleIds) throws Exception {

        for(String scheduleId : scheduleIds)
            dataProviderServiceLocator.getService().pauseHarvestSchedule(scheduleId);
    }

    @Override
    public void resumeHarvestSchedules(List<String> scheduleIds) throws Exception {

        for(String scheduleId : scheduleIds)
            dataProviderServiceLocator.getService().resumeHarvestScedule(scheduleId);
    }

    @Override
    public void cancelHarvestSchedules(List<String> scheduleIds) throws DataProviderServiceException {

        for(String scheduleId : scheduleIds)
          dataProviderServiceLocator.getService().cancelHarvestSchedule(scheduleId);
    }

    @Override
    public List<HarvestScheduleInfo> getHarvestSchedules(String dataProviderId) throws DataProviderServiceException {

        List<eu.dnetlib.domain.data.espas.HarvestSchedule> hsList = dataProviderServiceLocator.getService().getHarvestSchedules(dataProviderId);
        List<HarvestScheduleInfo> harvestSchedules = new ArrayList<HarvestScheduleInfo>();

        for(eu.dnetlib.domain.data.espas.HarvestSchedule hs : hsList) {

            if(hs.getScheduleStatus().equals(HarvestSchedule.ScheduleStatus.RUNNING)) {
                HarvestScheduleInfo harvestSchedule = new HarvestScheduleInfo(hs.getScheduleId(), hs.getTypes(), hs.getInitialModificationDate(), hs.getDataProviderId(), hs.getCronExpression(), HarvestScheduleInfo.ScheduleStatus.RUNNING);
                harvestSchedules.add(harvestSchedule);
            } else {
                HarvestScheduleInfo harvestSchedule = new HarvestScheduleInfo(hs.getScheduleId(), hs.getTypes(), hs.getInitialModificationDate(), hs.getDataProviderId(), hs.getCronExpression(), HarvestScheduleInfo.ScheduleStatus.PAUSED);
                harvestSchedules.add(harvestSchedule);
            }
        }

        return harvestSchedules;
    }

    @Override
    public List<HarvestHistoryInfo> getHarvestHistory(String dataProviderId) throws DataProviderServiceException {

        List<eu.dnetlib.domain.data.espas.HarvestHistory> hhList = dataProviderServiceLocator.getService().getHarvestHistory(dataProviderId);
        List<HarvestHistoryInfo> harvestHistories = new ArrayList<HarvestHistoryInfo>();

        for(eu.dnetlib.domain.data.espas.HarvestHistory hh : hhList) {
            HarvestHistoryInfo harvestHistory = new HarvestHistoryInfo(hh.getHarvestId(), hh.getStartDate(), hh.getFinishDate(),
                    hh.getTypes(), hh.getRecordCount(), hh.getErrors(), hh.getDataProviderId());
            harvestHistories.add(harvestHistory);
        }

        return harvestHistories;
    }

    @Override
    public void deleteHarvestHistory(List<String> harvestIds) throws DataProviderServiceException {
        dataProviderServiceLocator.getService().deleteHarvestHistory(harvestIds);
    }
}
