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

import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStatus;
import de.ivu.elect.jee.presentation.Icons;

public enum KandidaturStatus {

  OFFEN {

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

    @Override
    public boolean isKandidaturAufStimmzettel() {
      return true; // ELECT-11250 (!) wichtig, falls es hier eine Änderung geben muss, vorher im Team besprechen (!)
      // (Wichtig für NL damit Stels nicht auseinanderfallen, wenn Kandidaturen Ablehnungsgründe haben)
      // Wichtig, um Stimmzettel (und Bekanntmachungen) probeweise zu erstellen
    }
  },

  ZUGELASSEN {

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

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

  ZUGELASSEN_NACHTRAEGLICH_AMTSHINDERNIS_VORHANDEN { // ELECTKOM-1022

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

    @Override
    public boolean isZugelassen() {
      return true;
    }
  },
  ZUGELASSEN_NACHTRAEGLICH_AMTSANNAHME_VERWEIGERT { // ELECTKOM-1063

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

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

  NICHT_ZUGELASSEN {

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

  NICHT_MEHR_ZUGELASSEN_WEIL_ZULASSUNGSFAEHIGKEIT_NACH_ZULASSUNGSAUSSCHUSS_VERLOREN { // ELECTMUC-849

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

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

  NICHT_MEHR_ZUGELASSEN_WEIL_ZULASSUNGSFAEHIGKEIT_VOR_ZULASSUNGSAUSSCHUSS_NICHT_VORLAG { // ELECTMUC-844

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

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

  ;

  KandidaturStatus() {
  }

  public boolean isKandidaturAufStimmzettel() {
    return false;
  }

  public boolean isUngeprueft() {
    return false;
  }

  /**
   * siehe auch isKandidaturAufStimmzettel()
   */
  public boolean isZugelassen() {
    return false;
  }

  /**
   * Im Sinne von abgelehnt
   */
  public boolean isNichtZugelassenImSinneAbgelehnt() {
    return false;
  }

  @Deprecated // isNichtZugelassenImSinneAbgelehnt verwenden
  public boolean isNichtZugelassen() {
    return isNichtZugelassenImSinneAbgelehnt();
  }

  public boolean isNichtZugelassenOderNichtMehrZugelassen() {
    return isNichtZugelassenImSinneAbgelehnt() || isNichtZugelassenNachtraeglichKeineZulassungsfaehigkeit();
  }

  public boolean isNichtZugelassenNachtraeglichKeineZulassungsfaehigkeit() {
    return isNichtZugelassenNachtraeglichKeineZulassungsfaehigkeitBeimZulassungsausschuss() || isNichtZugelassenNachtraeglichKeineZulassungsfaehigkeitNachZulassungsausschuss();
  }

  public boolean isNichtZugelassenNachtraeglichKeineZulassungsfaehigkeitBeimZulassungsausschuss() {
    return false;
  }

  public boolean isNichtZugelassenNachtraeglichKeineZulassungsfaehigkeitNachZulassungsausschuss() {
    return false;
  }

  /**
   * @return Liefert true, falls das Setzen des Status Änderungen an der Stimmenverteilung impliziert. Das ist bspw. der Fall, falls eine Listenkandidatur NACHTRÄGLICH NICHT MEHR ZUGELASSEN ist und
   *         die zugehörige Liste dadurch ebenfalls Stimmen, die ursprünglich anhand der Stimmeingaben konvertiert wurden, verliert.
   *
   * @see ELECT-9527
   */
  public boolean isErneuteStimmenverteilungErforderlich() {
    return isNichtZugelassenNachtraeglichKeineZulassungsfaehigkeitBeimZulassungsausschuss();
  }

  public String getIcon(Icons icons) {
    return toWahlvorschlagStatus().getIcon(icons);
  }

  public WahlvorschlagStatus toWahlvorschlagStatus() {
    return WahlvorschlagStatus.valueOf(this);
  }

  public static KandidaturStatus valueOf(WahlvorschlagStatus wahlvorschlagStatus) {
    try {
      return KandidaturStatus.valueOf(wahlvorschlagStatus.name());
    } catch (Exception ignored) {
    }

    throw new IllegalArgumentException("Zu WahlvorschlagStatus [" + wahlvorschlagStatus + "] existiert kein äquivalenter KandidaturStatus!");
  }
}
