package de.ivu.elect.business.benutzerverwaltung.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.boundary.BenutzerParameterDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerParameter;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerParameterMeta;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerParameterTK;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerParameterWerte;
import de.ivu.elect.business.konfiguration.control.AbstractCustomParameterCreator;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

@Stateless
public class BenutzerParameterCreator extends AbstractCustomParameterCreator<BenutzerParameterWerte, BenutzerParameter, BenutzerParameterTK> {
  private static final Logger LOG = LoggerFactory.getLogger(BenutzerParameterCreator.class);
  @Inject
  private transient BenutzerParameterDAO dao;

  @Inject
  private transient BenutzerParameterMeta meta;

  @Inject
  private transient Instance<BenutzerParameterInit> parameterInits;

  public BenutzerParameterCreator() {
    super();
  }

  @Override
  protected void processParametersCreated(Collection<BenutzerParameter> parameters) {
    // nichts zu tun
  }

  public void initBenutzerParameters(Benutzer benutzer) {
    createOrUpdateDefaultParameters(null, null, benutzer.getMandant(), benutzer, dao.findByBenutzer(benutzer), parameterInits);
  }

  @Override
  protected BenutzerParameterMeta getEntityMeta() {
    return meta;
  }

  @Override
  protected Function<BenutzerParameter, BenutzerParameterTK> getEntityToTkFunktion() {
    return BenutzerParameter::getBenutzerParameterTK;
  }

  @Override
  protected void persistParameter(Wahltermin wahltermin, @Nullable Wahl wahl, Mandant mandant, Benutzer benutzer, BenutzerParameter benutzerParameter) {
    benutzerParameter.setBenutzer(benutzer);
    dao.persist(benutzerParameter);
  }

  @Override
  protected void deleteParameter(BenutzerParameter benutzerParameter) {
    dao.remove(benutzerParameter);
  }

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