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

import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toSet;

import java.util.Collection;

import de.ivu.elect.presentation.stimmeingabe.status.GebietErfassungsstatus;

public enum Ergebniseingangsfehlerstatus {

  // ELECT-9287, zusätzlicher Wert, um (wie bisher) bei der Suche nach dem "letzten gültigen Ergebniseingang" nicht die aktuelle Ergebniseingabestufe auswerten zu müssen...
  HAT_KEINE_FEHLER_VORSTUFE(GebietErfassungsstatus.GUELTIG) {

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

    @Override
    public boolean isGueltigKeinFehler() {
      return true;
    }
  },

  // ELECT-9287, zusätzlicher Wert, um (wie bisher) bei der Suche nach dem "letzten gültigen Ergebniseingang" nicht die aktuelle Ergebniseingabestufe auswerten zu müssen...
  HAT_MANUELL_BESTAETIGTE_FEHLER_VORSTUFE(GebietErfassungsstatus.GUELTIG) {

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

    @Override
    public boolean isGueltigKannFehler() {
      return true;
    }
  },

  HAT_KEINE_FEHLER(GebietErfassungsstatus.GUELTIG) {

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

    @Override
    public boolean isGueltigKeinFehler() {
      return true;
    }
  },

  HAT_MANUELL_BESTAETIGTE_FEHLER(GebietErfassungsstatus.GUELTIG) {

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

    @Override
    public boolean isGueltigKannFehler() {
      return true;
    }
  },

  HAT_KANN_FEHLER(GebietErfassungsstatus.KANN_FEHLER_VORHANDEN),

  HAT_MUSS_FEHLER(GebietErfassungsstatus.MUSS_FEHLER_VORHANDEN),

  ;

  private static final Collection<Ergebniseingangsfehlerstatus> VALUES_UNGUELTIG = stream(Ergebniseingangsfehlerstatus.values()).filter(Ergebniseingangsfehlerstatus::isUngueltig).collect(toSet());

  private static final Collection<Ergebniseingangsfehlerstatus> VALUES_GUELTIG = stream(Ergebniseingangsfehlerstatus.values()).filter(Ergebniseingangsfehlerstatus::isGueltig).collect(toSet());

  private static final Collection<Ergebniseingangsfehlerstatus> VALUES_IN_ERGEBNIS_UEBERNEHMBAR = stream(Ergebniseingangsfehlerstatus.values())
      .filter(Ergebniseingangsfehlerstatus::isInErgebnisUebernehmbar).collect(toSet());

  private final GebietErfassungsstatus gebietErfassungsstatus;

  Ergebniseingangsfehlerstatus(GebietErfassungsstatus gebietErfassungsstatus) {
    this.gebietErfassungsstatus = gebietErfassungsstatus;
  }

  public boolean isInErgebnisUebernehmbar() {
    return false;
  }

  public boolean isGueltig() {
    return isGueltigKeinFehler() || isGueltigKannFehler();
  }

  public boolean isGueltigKeinFehler() {
    return false;
  }

  public boolean isGueltigKannFehler() {
    return false;
  }

  public boolean isUngueltig() {
    return isUngueltigKannFehler() || isUngueltigMussFehler();
  }

  public boolean isUngueltigKannFehler() {
    return HAT_KANN_FEHLER.equals(this);
  }

  public boolean isUngueltigMussFehler() {
    return HAT_MUSS_FEHLER.equals(this);
  }

  public GebietErfassungsstatus getGebietErfassungsstatus() {
    return gebietErfassungsstatus;
  }

  public static Collection<Ergebniseingangsfehlerstatus> valuesUngueltig() {
    return VALUES_UNGUELTIG;
  }

  public static Collection<Ergebniseingangsfehlerstatus> valuesGueltig() {
    return VALUES_GUELTIG;
  }

  public static Collection<Ergebniseingangsfehlerstatus> valuesInErgebnisUebernehmbar() {
    return VALUES_IN_ERGEBNIS_UEBERNEHMBAR;
  }
}
