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

import static de.ivu.elect.business.ergebnis.entity.Stimmenart.DIREKTSTIMME;
import static de.ivu.elect.business.ergebnis.entity.Stimmenart.GESAMT;
import static de.ivu.elect.business.ergebnis.entity.Stimmenart.LISTENSTIMME;
import static de.ivu.elect.business.ergebnis.entity.Stimmenart.MIT_WAHLSCHEIN;
import static de.ivu.elect.business.ergebnis.entity.Stimmenart.NICHT_IM_WAEHLERVERZEICHNIS;
import static de.ivu.elect.business.ergebnis.entity.Stimmenart.OHNE_WAHLSCHEIN;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;

public enum SystemGruppe {

  WAHLBERECHTIGTE(GESAMT, MIT_WAHLSCHEIN, OHNE_WAHLSCHEIN, NICHT_IM_WAEHLERVERZEICHNIS),
  WAEHLER(GESAMT, MIT_WAHLSCHEIN, OHNE_WAHLSCHEIN), // wer NICHT_IM_WAEHLERVERZEICHNIS steht, kann nicht waehlen

  UNGUELTIGE(DIREKTSTIMME, LISTENSTIMME),
  GUELTIGE(DIREKTSTIMME, LISTENSTIMME),

  @Deprecated
  // Übrige nicht zum Speichern von Stimmen verwenden! Ergibt sich aus GÜLTIGE und Listen/Direktstimmen
  UEBRIGE(); // TODO, falls benoetigt: welche Stimmenarten fuer UEBRIGE?

  private final Set<Stimmenart> zulaessigeStimmenarten;

  SystemGruppe(Stimmenart... zulaessigeStimmenarten) {
    this.zulaessigeStimmenarten = new HashSet<>(Arrays.asList(zulaessigeStimmenarten));
  }

  /**
   * Stimmarten, die für die jeweilige Systemgruppe verwendet werden.
   */
  public Set<Stimmenart> getZulaessigeStimmenarten() {
    return zulaessigeStimmenarten;
  }

  public static SystemGruppe getSystemGruppeFromGruppe(Gruppe gruppe, SystemGruppeEigenschaften systemGruppeEigenschaften) {
    String schluesselGruppe = gruppe.getSchluessel();

    for (SystemGruppe systemGruppe : values()) {
      String schluessel = systemGruppeEigenschaften.getSchluessel(systemGruppe);

      if (schluessel.equals(schluesselGruppe)) {
        return systemGruppe;
      }
    }

    throw new IllegalStateException("Die SystemGruppe [Schlüssel der Gruppe=" + schluesselGruppe + "] existiert nicht!");
  }

  /**
   * Entspricht die übergebene Gruppe dieser SystemGruppe?
   */
  public boolean equalsGruppe(Gruppe gruppe, SystemGruppeEigenschaften systemGruppeEigenschaften) {
    return gruppe != null && gruppe.isSystemGruppe() && isSchluesselGleich(gruppe.getSchluessel(), systemGruppeEigenschaften);
  }

  /* ELECT-4284 */
  public boolean equalsGruppeOhneSystemgruppenPruefung(Gruppe gruppe, SystemGruppeEigenschaften systemGruppeEigenschaften) {
    return isSchluesselGleich(gruppe.getSchluessel(), systemGruppeEigenschaften);
  }

  protected boolean isSchluesselGleich(String gruppeSchluessel, SystemGruppeEigenschaften systemGruppeEigenschaften) {
    return systemGruppeEigenschaften.getSchluessel(this).equals(gruppeSchluessel);
  }
}
