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

import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.jee.presentation.Icons;

public enum WahlvorschlagStatus {

  OFFEN {

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

    @Override
    public String getIcon(Icons icons) {
      return icons.getIconUngeprueft();
    }


    @Override
    public boolean isWahlvorschlagAufStimmzettel() {
      return true; // ELECT-11250 analog zu de.ivu.elect.business.kandidatur.entity.KandidaturStatus.isKandidaturAufStimmzettel
    }
  },

  ZUGELASSEN {

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

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

    @Override
    public String getIcon(Icons icons) {
      return icons.getIconZugelassen();
    }
  },

  ZUGELASSEN_NACHTRAEGLICH_AMTSHINDERNIS_VORHANDEN { // ELECTKOM-1022

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

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

    @Override
    public String getIcon(Icons icons) {
      return icons.getIconNotice();
    }
  },
  ZUGELASSEN_NACHTRAEGLICH_AMTSANNAHME_VERWEIGERT { // ELECTKOM-1063

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

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

    @Override
    public String getIcon(Icons icons) {
      return icons.getIconNotice();
    }
  },

  NICHT_ZUGELASSEN {

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

    @Override
    public String getIcon(Icons icons) {
      return icons.getIconNichtZugelassen();
    }
  },

  NICHT_MEHR_ZUGELASSEN_WEIL_ZULASSUNGSFAEHIGKEIT_NACH_ZULASSUNGSAUSSCHUSS_VERLOREN {

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

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

    @Override
    public String getIcon(Icons icons) {
      return icons.getIconNotice();
    }
  },

  NICHT_MEHR_ZUGELASSEN_WEIL_ZULASSUNGSFAEHIGKEIT_VOR_ZULASSUNGSAUSSCHUSS_NICHT_VORLAG {

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

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

    @Override
    public String getIcon(Icons icons) {
      return icons.getIconNotice();
    }
  },

  ;

  private WahlvorschlagStatus() {
  }

  public boolean isWahlvorschlagAufStimmzettel() {
    return false;
  }

  public boolean isUngeprueft() {
    return false;
  }

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

  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;
  }

  public abstract String getIcon(Icons icons);

  public KandidaturStatus toKandidaturStatus() {
    return KandidaturStatus.valueOf(this);
  }

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

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