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

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

import java.util.Collection;
import java.util.Date;

import javax.annotation.Nullable;
import javax.enterprise.context.ContextNotActiveException;
import javax.inject.Inject;

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

import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerEinsatzortDAO;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.niederschrift.boundary.NiederschriftDAO;
import de.ivu.elect.business.niederschrift.entity.Niederschrift;
import de.ivu.elect.business.niederschrift.entity.NiederschriftArt;
import de.ivu.elect.business.niederschrift.entity.NiederschriftStatus;
import de.ivu.elect.business.niederschrift.entity.NiederschriftStatusAenderung;
import de.ivu.elect.business.niederschrift.entity.NiederschriftUK;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;

public class NiederschriftStatusAenderungCreate extends AbstractNiederschriftStatusAenderungCreate {

  private static final Logger LOG = LoggerFactory.getLogger(NiederschriftStatusAenderungCreate.class);

  @Inject
  private transient NiederschriftDAO niederschriftDAO;

  @Inject
  private transient BenutzerDAO benutzerDAO;

  @Inject
  private transient BenutzerEinsatzortDAO benutzerEinsatzortDAO;

  @Inject
  private transient ElectCommonPrincipal principal;

  public NiederschriftStatusAenderungCreate() {
    super();
  }

  public void save(Collection<NiederschriftStatusAenderung> niederschriftStatusAenderungen) {
    niederschriftStatusAenderungen.forEach(this::save);
  }

  @Override
  public void save(NiederschriftStatusAenderung niederschriftStatusAenderung) {
    niederschriftStatusAenderung.setNiederschriftOhneUpdateBeziehung(niederschriftDAO.attach(niederschriftStatusAenderung.getNiederschrift()));

    super.save(niederschriftStatusAenderung);
  }

  public void save(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, String raum, NiederschriftArt niederschriftArt, NiederschriftStatus niederschriftStatus) {
    save(findNiederschriftByUK(wahldurchfuehrungsgebiet, niederschriftArt), raum, niederschriftStatus);
  }

  public void save(Niederschrift niederschrift, String raum, NiederschriftStatus niederschriftStatus) {
    String besitzer = getBenutzerName();

    if (isNotBlank(besitzer)) {
      NiederschriftStatusAenderung niederschriftStatusAenderung = new NiederschriftStatusAenderung();

      niederschriftStatusAenderung.setNiederschriftOhneUpdateBeziehung(niederschrift);
      niederschriftStatusAenderung.setStatus(niederschriftStatus);
      niederschriftStatusAenderung.setRaum(raum);
      niederschriftStatusAenderung.setBesitzer(besitzer);
      niederschriftStatusAenderung.setZeitstempel(new Date());

      LOG.debug("Erstelle NiederschriftStatusAenderung für {}, Raum {} und Besitzer {}", niederschrift, raum, besitzer);

      save(niederschriftStatusAenderung);
    }
  }

  @Nullable
  private String getBenutzerName() {
    try {
      return principal.getFormattedName(benutzerDAO, benutzerEinsatzortDAO);
    } catch (ContextNotActiveException ignored) {
      // Principal ist @SessionScoped --> passiert wenn keine Session aktiv ist; derzeit insb. wenn durch Massenerzeugung
      // fiktiver Ergebniseingänge das Setzen des Status angestoßen wird.
      return null;
    }
  }

  private Niederschrift findNiederschriftByUK(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, NiederschriftArt niederschriftArt) {
    return niederschriftDAO.findByUK(new NiederschriftUK(niederschriftArt, wahldurchfuehrungsgebiet.getUk()));
  }
}
