package de.ivu.elect.business.gruppeimgebiet.boundary;

import java.io.Serializable;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.ReihenfolgeBestaetigenOption;

@Stateless
public class ReihenfolgeBestaetigenOptionFuerGebiet implements Serializable {
  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietDAO gebietDAO;

  public ReihenfolgeBestaetigenOption createDefaultOptionFuerGebiet(Gebiet gebietNotAttached) {
    Gebiet gebiet = gebietDAO.attach(gebietNotAttached);

    boolean untergeordneteGebiete = true;
    boolean relativePositionenSetzen = true;
    boolean relativePositionenUntergeordneterGebietUeberschreiben = getDefaultRelativePositionenUntergeordneterGebietUeberschreiben();
    boolean vorgegebenePositionenSetzen = !isWahlvorschlaggebietUntergeordnet(gebiet); // ELECT-9383
    boolean vorgegebenePositionenAusRelativerPositionUebernehmen = false; // ELECT-11262
    boolean positionenVonAktuellemGebietAufUntergeordneteGebieteUebernehmen = false; // ELECT-16175

    return new ReihenfolgeBestaetigenOption(untergeordneteGebiete,
        relativePositionenSetzen,
        relativePositionenUntergeordneterGebietUeberschreiben,
        vorgegebenePositionenSetzen,
        vorgegebenePositionenAusRelativerPositionUebernehmen,
        positionenVonAktuellemGebietAufUntergeordneteGebieteUebernehmen);
  }

  protected boolean getDefaultRelativePositionenUntergeordneterGebietUeberschreiben() {
    return true;
  }

  private boolean isWahlvorschlaggebietUntergeordnet(Gebiet gebiet) {
    if (gebiet == null || gebiet.isErfassungsgebiet()) {
      return false;
    }

    return gebietDAO.findByWahl(gebiet.getWahl()).stream().filter(anderesGebiet -> !gebiet.equals(anderesGebiet))
        .anyMatch(anderesGebiet -> anderesGebiet.isWahlvorschlaggebiet() && anderesGebiet.isUntergebietVon(gebiet));
  }
}
