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

import de.ivu.elect.business.gruppe.control.GruppeBySchluesselComparator;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.GruppeArt;
import de.ivu.elect.business.gruppe.entity.GruppeTK;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.stimmeingabe.control.plausi.GruppeListenstimmenAnteilComparedToVorperiodeKleinerGleichSchwellwertCustomData;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfigurationPropertyContext;
import de.ivu.elect.jee.faces.EntityConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractSelectOneMenuProperty;

import javax.faces.convert.Converter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class GruppeListenstimmenAnteilComparedToVorperiodeKleinerGleichSchwellwertCustomDataGruppeProperty extends AbstractSelectOneMenuProperty<Gruppe> {

  private final GruppeListenstimmenAnteilComparedToVorperiodeKleinerGleichSchwellwertCustomData customData;

  private final Long schwellwertId;

  private final StimmeingabePlausiKonfigurationPropertyContext context;

  private List<Gruppe> values;

  public GruppeListenstimmenAnteilComparedToVorperiodeKleinerGleichSchwellwertCustomDataGruppeProperty(GruppeListenstimmenAnteilComparedToVorperiodeKleinerGleichSchwellwertCustomData customData, Long schwellwertId, StimmeingabePlausiKonfigurationPropertyContext context) {
    this.customData = customData;
    this.schwellwertId = schwellwertId;
    this.context = context;
  }

  @Override
  public String getDefaultLabel() {
    return getMessage("GruppeListenstimmenAnteilComparedToVorperiodeKleinerGleichSchwellwertCustomData.schwellwert.gruppe." + schwellwertId);
  }

  @Override
  public boolean getDefaultRequired() {
    return false;
  }

  @Override
  public Converter getDefaultConverter() {
    return new EntityConverter();
  }

  @Override
  public Gruppe getValue() {
    return findGruppeByGruppeTK(customData.getSchwellwert(schwellwertId).getGruppeTK());
  }

  private Gruppe findGruppeByGruppeTK(GruppeTK gruppeTK) {
    return getValues().stream().filter(gruppe -> gruppe.getGruppeTK().equals(gruppeTK)).findFirst().orElse(null);
  }

  @Override
  public void setValue(Gruppe gruppe) {
    GruppeTK gruppeTK = null;
    if (gruppe != null) {
      gruppeTK = gruppe.getGruppeTK();
    }
    customData.setGruppeTK(schwellwertId, gruppeTK);
  }

  @Override
  public List<Gruppe> getValues() {
    if (values == null) {
      List<PolitischeGruppe> politischeGruppen = context.getPolitischeGruppeDAO().findByWahlAndGruppeArten(
          context.getWahl(),
          Arrays.asList(GruppeArt.PARTEI, GruppeArt.VEREINIGUNG));
      Collections.sort(politischeGruppen, new GruppeBySchluesselComparator());
      values = new ArrayList<>(politischeGruppen.size());
      for (PolitischeGruppe politischeGruppe : politischeGruppen) {
        values.add(politischeGruppe);
      }
    }
    return values;
  }

  @Override
  public String getItemLabel(Gruppe gruppe) {
    return gruppe.getKurzname() + " (" + context.getGruppeSchluesselFormatter().formatSchluessel(gruppe.getSchluessel()) + ")";
  }

  @Override
  public boolean hasNoSelectionItem() {
    return true;
  }
}
