
package de.ivu.elect.presentation.ergebnis.form;

import static de.ivu.elect.jee.entity.EntityUtil.castTo;
import static java.util.stream.Collectors.toList;

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.boundary.DHondtQuotientListenImGebietSearchParameters;
import de.ivu.elect.business.ergebnis.boundary.DHondtQuotientListenInGruppeSearchParameters;
import de.ivu.elect.business.ergebnis.boundary.DHondtQuotientPolitischeGruppeSearchParameters;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.EntityMitGruppe;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietExtendedDAO;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.ViewFormBuilder;
import de.ivu.elect.presentation.gruppe.form.GruppeSearchProperty;

public class DHondtQuotientSearchFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GruppeImGebietExtendedDAO gruppeImGebietExtendedDAO;

  public DHondtQuotientSearchFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Ergebnis ergebnis, Gebiet gebiet, DHondtQuotientListenImGebietSearchParameters searchParameters) {
    formBuilder.addProperty(createGruppeSearchProperty(ergebnis, gebiet, searchParameters));
  }

  public void addProperties(FormBuilder formBuilder, Ergebnis ergebnis, Gebiet gebiet, DHondtQuotientListenInGruppeSearchParameters searchParameters) {
    formBuilder.addProperty(createGruppeSearchProperty(ergebnis, gebiet, searchParameters));
  }

  public void addProperties(FormBuilder formBuilder, Ergebnis ergebnis, Gebiet gebiet, DHondtQuotientPolitischeGruppeSearchParameters searchParameters) {
    formBuilder.addProperty(createGruppeSearchProperty(ergebnis, gebiet, searchParameters));
  }

  private GruppeSearchProperty<PolitischeGruppe> createGruppeSearchProperty(Ergebnis ergebnis, Gebiet gebiet, EntityMitGruppe<PolitischeGruppe> searchParameters) {
    return new GruppeSearchProperty<>(searchParameters, getGruppen(ergebnis, gebiet), true);
  }

  private List<PolitischeGruppe> getGruppen(Ergebnis ergebnis, Gebiet gebiet) {
    return gruppeImGebietExtendedDAO.findByGebiet(gebiet).stream() //
        .filter(GruppeImGebiet::isPolitischeGruppe) //
        .filter(GruppeImGebiet::hatWahlvorschlagInGebietshierarchie) //
        .map(gruppeImGebiet -> castTo(gruppeImGebiet.getGruppe(), PolitischeGruppe.class)) //
        .distinct().collect(toList());
  }
}
