
package de.ivu.elect.dokumente.ergebnis.zusammenstellung;

import java.util.Comparator;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;

import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformation;
import de.ivu.elect.business.gebietsbaum.entity.Verwaltungsart;

public interface ErgebnisTabellarischTabelleSortierung {

  BiFunction<WahlverwaltungGebietInformation, Stimmabgabeart, String> getLabelFctZwischensummenGruppierungGesamt();

  BiFunction<WahlverwaltungGebietInformation, Stimmabgabeart, String> getLabelFctZwischensummenGruppierungUntersteEbeneStimmabgabearten();

  BiFunction<WahlverwaltungGebietInformation, Stimmabgabeart, String> getLabelFctZwischensummenGruppierungUebergeordnetStimmabgabearten();

  List<ErgebnisTabellarischTabelleSortierungGruppierung> collectGruppierungshierarchieDesc();

  Comparator<ErgebnisTabellarischZeile> comparator();

  public static class ErgebnisTabellarischTabelleSortierungGruppierung {

    private final Verwaltungsart verwaltungsart;

    private final Function<ErgebnisTabellarischZeile, WahlverwaltungGebietInformation> accessor;

    private final ErgebnisTabellarischZwischensummen zwischensummenStimmabgabeart;

    private final ErgebnisTabellarischZwischensummen zwischensummenGesamt;

    public ErgebnisTabellarischTabelleSortierungGruppierung(Verwaltungsart verwaltungsart, Function<ErgebnisTabellarischZeile, WahlverwaltungGebietInformation> accessor,
        ErgebnisTabellarischZwischensummen zwischensummenStimmabgabeart, ErgebnisTabellarischZwischensummen zwischensummenGesamt) {
      super();

      this.verwaltungsart = verwaltungsart;

      this.accessor = accessor;

      this.zwischensummenStimmabgabeart = zwischensummenStimmabgabeart;
      this.zwischensummenGesamt = zwischensummenGesamt;
    }

    public Verwaltungsart getVerwaltungsart() {
      return verwaltungsart;
    }

    public Function<ErgebnisTabellarischZeile, WahlverwaltungGebietInformation> getAccessor() {
      return accessor;
    }

    public ErgebnisTabellarischZwischensummen getZwischensummenStimmabgabeart() {
      return zwischensummenStimmabgabeart;
    }

    public ErgebnisTabellarischZwischensummen getZwischensummenGesamt() {
      return zwischensummenGesamt;
    }
  }
}
