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

import static java.util.Arrays.asList;

import java.util.Comparator;
import java.util.List;

// ELECT-9287
public enum Ergebniseingabestufe {

  VORSTUFE_01 {

    @Override
    public Ergebniseingabestufe getVorgaenger() {
      return this;
    }

    @Override
    public Ergebniseingabestufe getNachfolger() {
      return VORSTUFE_02;
    }

    @Override
    public Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusGueltigKeinFehler() {
      return Ergebniseingangsfehlerstatus.HAT_KEINE_FEHLER_VORSTUFE;
    }

    @Override
    public Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusGueltigKannFehler() {
      return Ergebniseingangsfehlerstatus.HAT_MANUELL_BESTAETIGTE_FEHLER_VORSTUFE;
    }
  },

  VORSTUFE_02 {

    @Override
    public Ergebniseingabestufe getVorgaenger() {
      return VORSTUFE_01;
    }

    @Override
    public Ergebniseingabestufe getNachfolger() {
      return ENDSTUFE;
    }

    @Override
    public Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusGueltigKeinFehler() {
      return Ergebniseingangsfehlerstatus.HAT_KEINE_FEHLER_VORSTUFE;
    }

    @Override
    public Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusGueltigKannFehler() {
      return Ergebniseingangsfehlerstatus.HAT_MANUELL_BESTAETIGTE_FEHLER_VORSTUFE;
    }
  },

  ENDSTUFE {

    @Override
    public Ergebniseingabestufe getVorgaenger() {
      return VORSTUFE_02;
    }

    @Override
    public Ergebniseingabestufe getNachfolger() {
      return ENDSTUFE;
    }

    @Override
    public Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusGueltigKeinFehler() {
      return Ergebniseingangsfehlerstatus.HAT_KEINE_FEHLER;
    }

    @Override
    public Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusGueltigKannFehler() {
      return Ergebniseingangsfehlerstatus.HAT_MANUELL_BESTAETIGTE_FEHLER;
    }
  },

  ;

  public static final Comparator<Ergebniseingabestufe> REIHENFOLGE_ASC = Ergebniseingabestufe::compareTo;

  public static final Comparator<Ergebniseingabestufe> REIHENFOLGE_DESC = REIHENFOLGE_ASC.reversed();

  private Ergebniseingabestufe() {
  }

  public abstract Ergebniseingabestufe getVorgaenger();

  public abstract Ergebniseingabestufe getNachfolger();

  public boolean isInErgebnisUebernehmbar() {
    return ENDSTUFE.equals(this);
  }

  public List<Ergebniseingangsfehlerstatus> collectErgebniseingangsfehlerstatus() {
    return asList(getErgebniseingangsfehlerstatusGueltigKeinFehler(), getErgebniseingangsfehlerstatusGueltigKannFehler(), getErgebniseingangsfehlerstatusUngueltigKannFehler(),
        getErgebniseingangsfehlerstatusUngueltigMussFehler());
  }

  abstract Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusGueltigKeinFehler();

  abstract Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusGueltigKannFehler();

  Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusUngueltigKannFehler() {
    return Ergebniseingangsfehlerstatus.HAT_KANN_FEHLER;
  }

  Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatusUngueltigMussFehler() {
    return Ergebniseingangsfehlerstatus.HAT_MUSS_FEHLER;
  }
}
