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

import java.io.Serializable;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.GruppeArt;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagExtendedDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public class GruppeImGebietStimmzettelreihenfolgenBestaetigtPruefer implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlSessionSelect wahlSessionSelect;

  @Inject
  private transient WahlvorschlagExtendedDAO wahlvorschlagExtendedDao;

  @Inject
  private transient GruppeImGebietExtendedDAO gruppeImGebietExtendedDAO;

  public boolean isUnbestaetigteStimmzettelreihenfolgeVorhanden() {
    List<Wahlvorschlag> wahlvorschlaege = getWahlvorschlaege();

    for (GruppeImGebiet gruppeImGebiet : getGruppenImGebiet()) {
      if (isStimmzettelPositionUnbestaetigt(gruppeImGebiet, wahlvorschlaege)) {
        return true;
      }
    }

    return false;
  }

  private boolean isStimmzettelPositionUnbestaetigt(GruppeImGebiet gruppeImGebiet, List<Wahlvorschlag> wahlvorschlaege) {
    Gebiet gebiet = gruppeImGebiet.getGebiet();

    for (Wahlvorschlag wahlvorschlag : wahlvorschlaege) {
      Gebiet wahlvorschlagsgebiet = wahlvorschlag.getGebiet();

      if (wahlvorschlagsgebiet.isInGebietshierarchieUntergeordnetesGebietVon(gebiet)
          && gruppeImGebiet.getRelativePosition() == null && /* ELECTMUC-1016*/ wahlvorschlag.getGruppe().equals(gruppeImGebiet.getGruppe())) {

        return true;
      }
    }

    return false;
  }

  protected List<GruppeImGebiet> getGruppenImGebiet() {
    return gruppeImGebietExtendedDAO.findByWahlAndUngleichGruppeArtEager(getWahl(), GruppeArt.SYSTEM_GRUPPE);
  }

  protected List<Wahlvorschlag> getWahlvorschlaege() {
    return wahlvorschlagExtendedDao.findByWahl(getWahl());
  }

  protected Wahl getWahl() {
    return wahlSessionSelect.getEntity();
  }
}
