package de.ivu.elect.nl.eml.readable;

import java.util.Arrays;

import javax.annotation.Nullable;

public enum VoteType {

  /*extra*/
  WAHLBERECHTIGTE(""){
    @Override
    public boolean isRejectedVote() {
      return false;
    }

    @Override
    public boolean isUncountedVote() {
      return false;
    }
  },
  GUELTIGE_INSGESAMT("") {
    @Override
    public boolean isRejectedVote() {
      return false;
    }

    @Override
    public boolean isUncountedVote() {
      return false;
    }
  },

  /*rejected votes*/
  UNGUELTIGE("ongeldig"){
    @Override
    public boolean isRejectedVote() {
      return true;
    }

    @Override
    public boolean isUncountedVote() {
      return false;
    }
  },
  BLANCO("blanco"){
    @Override
    public boolean isRejectedVote() {
      return true;
    }

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

  },

  /*uncounted*/
  WAEHLER_OHNE_WAHLSCHEIN("geldige stempassen"),
  WAEHLER_MIT_VOLLMACHT("geldige volmachtbewijzen"),
  WAEHLER_MIT_WAHLSCHEIN("geldige kiezerspassen"),
  WAEHLER_GESAMT("toegelaten kiezers"),
  STIMMZETTEL_EINGENOMMEN_ZU_VIEL("meer getelde stembiljetten"),
  STIMMZETTEL_EINGENOMMEN_ZU_WENIG("minder getelde stembiljetten"),
  STIMMZETTEL_NICHT_ABGEGEBEN("meegenomen stembiljetten"),
  STIMMZETTEL_ZU_WENIG_AUSGEGEBEN("te weinig uitgereikte stembiljetten"),
  STIMMZETTEL_ZU_VIEL_AUSGEGEBEN("te veel uitgereikte stembiljetten"),
  STIMMZETTEL_ABWEICHEND_UNBEKANNTER_GRUND("geen verklaring"),
  STIMMZETTEL_ABWEICHEND_ANDERER_GRUND("andere verklaring"),

  BRIEFWAHL_STIMMZETTEL_VERLOREN("kwijtgeraakte stembiljetten"),
  BRIEFWAHL_STIMMZETTEL_EINGENOMMEN_ZU_VIEL("te veel briefstembiljetten"),
  BRIEFWAHL_STIMMZETTEL_EINGENOMMEN_ZU_WENIG("geen briefstembiljetten")




  ;

  private final String reasonCode;

  VoteType(String reasonCode) {
    this.reasonCode = reasonCode;
  }

  public String getReasonCode() {
    return reasonCode;
  }

  public boolean isRejectedVote() {
    return false;
  }

  public  boolean isUncountedVote() {
    return true;
  }

  @Nullable
  public static VoteType fromReason(String reason) {
    return Arrays.stream(values()).filter(value -> value.getReasonCode().equalsIgnoreCase(reason)).findFirst().orElse(null);
  }
}
