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

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;

import javax.ejb.Stateless;
import javax.enterprise.inject.Specializes;

import de.ivu.elect.business.ergebnis.control.StimmenPool;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.KopfzahlKumulierteStimmen;
import de.ivu.elect.business.gruppe.entity.NlSystemGruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeKopfzahlErfassenLabelGenerator;

@Stateless
@Specializes
public class NlKopfzahlKumulierteStimmenSearch extends KopfzahlKumulierteStimmenSearch {

  public NlKopfzahlKumulierteStimmenSearch() {
    super();
  }

  @Override
  protected Optional<KopfzahlKumulierteStimmen> createKopfzahlKumulierteStimmen(Gebiet gebietSelected, Ergebnis ergebnisSelected, StimmenPool stimmenPool, StimmenPool stimmenPoolFuerDifferenz,
      StimmeingabeKopfzahlErfassenLabelGenerator stimmeingabeKopfzahlLabelGenerator, GruppeImGebiet gruppeImGebiet, Stimmenart stimmenart, long position, Predicate<Gebiet> erfassungsgebietFilter) {
    long positionZurSortierung = position; // ELECT-11346

    List<Stimmenart> stimmenarten = new ArrayList<>();

    if (isSystemGruppeWahlberechtigte(gruppeImGebiet)) {
      stimmenarten.addAll(NlSystemGruppe.WAHLBERECHTIGTE.getStimmenarten());
    } else if (isSystemGruppeWaehler(gruppeImGebiet)) {
      stimmenarten.addAll(NlSystemGruppe.WAEHLER.getStimmenarten());
    }

    int indexOfStimmenart = stimmenarten.indexOf(stimmenart);

    if (indexOfStimmenart >= 0) {
      positionZurSortierung -= position % SYSTEM_GRUPPE_POSTION_OFFSET;
      positionZurSortierung += indexOfStimmenart;
    }

    return super.createKopfzahlKumulierteStimmen(gebietSelected, ergebnisSelected, stimmenPool, stimmenPoolFuerDifferenz, stimmeingabeKopfzahlLabelGenerator, gruppeImGebiet, stimmenart,
        positionZurSortierung, erfassungsgebietFilter);
  }
}
