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

import java.util.Collection;
import java.util.function.Function;

import javax.annotation.Nullable;
import javax.ejb.Stateless;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.konfiguration.control.AbstractCustomParameterCreator;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.wahl.boundary.WahlParameterDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlParameter;
import de.ivu.elect.business.wahl.entity.WahlParameterMeta;
import de.ivu.elect.business.wahl.entity.WahlParameterTK;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;
import de.ivu.elect.business.wahl.entity.Wahltermin;

@Stateless
public class WahlParameterCreator extends AbstractCustomParameterCreator<WahlParameterWerte, WahlParameter, WahlParameterTK> {
  private static final Logger LOG = LoggerFactory.getLogger(WahlParameterCreator.class);

  @Inject
  private transient WahlParameterDAO wahlParameterDao;

  @Inject
  private transient WahlParameterMeta wahlParameterMeta;

  @Inject
  private transient Instance<WahlParameterInit> wahlParameterInits;

  @Inject
  private transient WahlParameterGeaendertEvent wahlParameterGeaendertEvent;

  public WahlParameterCreator() {
    super();
  }

  public void initWahlParameters(Wahl wahl) {
    createOrUpdateDefaultParameters(wahl.getWahltermin(), wahl, wahl.getMandant(), null,  wahlParameterDao.findByWahl(wahl), wahlParameterInits);
  }

  public void initWahlterminParameters(Wahltermin wahltermin) {
    createOrUpdateDefaultParameters(wahltermin, null, wahltermin.getMandant(), null, wahlParameterDao.findByWahlterminNotWahl(wahltermin), wahlParameterInits);
  }

  @Override
  protected void processParametersCreated(Collection<WahlParameter> wahlParameters) {
    // Change Events für Cron-Timer...
    for (WahlParameter wahlParameter : wahlParameters) {
      wahlParameterGeaendertEvent.sendWertGeaendertEvent(WahlParameterWerte.valueOf(wahlParameter.getKey()), wahlParameter.getWert());
    }
  }

  @Override
  protected WahlParameterMeta getEntityMeta() {
    return wahlParameterMeta;
  }

  @Override
  protected Function<WahlParameter, WahlParameterTK> getEntityToTkFunktion() {
    return WahlParameter::getWahlParameterTK;
  }

  @Override
  protected void persistParameter(Wahltermin wahltermin, @Nullable Wahl wahl, Mandant mandant, Benutzer benutzer, WahlParameter wahlParameter) {
    wahlParameter.setWahltermin(wahltermin);
    wahlParameter.setWahl(wahl);

    wahlParameterDao.persist(wahlParameter);
  }

  @Override
  protected void deleteParameter(WahlParameter wahlParameter) {
    wahlParameterDao.remove(wahlParameter);
  }

  @Override
  protected Logger getLog() {
    return LOG;
  }
}
