
package de.ivu.elect.business.exchange.control;

import static org.apache.commons.lang3.StringUtils.isBlank;

import java.io.File;

import javax.annotation.Nullable;
import javax.inject.Inject;

import de.ivu.elect.business.system.boundary.SystemLogWriter;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.boundary.WahlterminDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;
import de.ivu.elect.business.wahl.entity.WahlPK;
import de.ivu.elect.business.wahl.entity.WahlParameterLoader;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.business.wahl.entity.WahlterminPK;
import de.ivu.elect.jee.faces.Messages;

public abstract class AbstractDateiExchangeBackgroundService {

  @Inject
  protected transient WahlterminDAO wahlterminDAO;

  @Inject
  protected transient WahlDAO wahlDAO;

  @Inject
  protected transient Messages messages;

  @Inject
  protected transient SystemLogWriter systemLogWriter;

  @Inject
  protected transient WahlParameterLoader wahlParameterLoader;

  public AbstractDateiExchangeBackgroundService() {
    super();
  }

  @Nullable
  protected Wahl findeWahl(WahlPK wahlPK) {
    Wahl wahl;

    try {
      wahl = wahlDAO.findByPrimaryKey(wahlPK);
      wahl.getName(); // test, ob vorhanden
    } catch (Exception e) {
      wahl = null;
    }

    return wahl;
  }

  @Nullable
  protected Wahltermin findeWahltermin(WahlterminPK wahlterminPK) {
    Wahltermin wahltermin;

    try {
      wahltermin = wahlterminDAO.findByPrimaryKey(wahlterminPK);
      wahltermin.getName(); // test, ob vorhanden
    } catch (Exception e) {
      wahltermin = null;
    }

    return wahltermin;
  }

  protected File pruefeVerzeichnis(WahlOderWahltermin wahlOderWahltermin, WahlParameterWerte template) {
    String pathname = wahlParameterLoader.resolveStringValue(wahlOderWahltermin, template);

    if (isBlank(pathname)) {
      throw new DateienExchangeBackgroundServiceException("wahl.parameter.wert.nicht.gesetzt", getMessage(template));
    }

    File file = new File(pathname);

    if (!file.exists()) {
      throw new DateienExchangeBackgroundServiceException("wahl.parameter.pfad.existiert.nicht", getMessage(template), pathname);
    }

    if (!file.isDirectory()) {
      throw new DateienExchangeBackgroundServiceException("wahl.parameter.pfad.kein.verzeichnis", getMessage(template), pathname);
    }

    return file;
  }

  protected String getMessage(String msgKey, Object... params) {
    return messages.getMessageForMessageKey(msgKey, params);
  }

  protected String getMessage(Enum< ? > enumValue) {
    return messages.lokalisiere(enumValue);
  }
}
