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

import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import de.ivu.elect.jee.faces.Messages;

public enum SchulungArtFilter {

  WAHLVORSTEHER_SCHULUNG {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.WAHLVORSTEHER_SCHULUNG;
    }
  },
  SCHRIFTFUEHRER_SCHULUNG {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.SCHRIFTFUEHRER_SCHULUNG;
    }
  },
  BEISITZER_SCHULUNG {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.BEISITZER_SCHULUNG;
    }
  },

  CUSTOM_1 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_1;
    }
  },
  CUSTOM_2 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_2;
    }
  },
  CUSTOM_3 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_3;
    }
  },
  CUSTOM_4 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_4;
    }
  },
  CUSTOM_5 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_5;
    }
  },

  SONSTIGE {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.SONSTIGE;
    }
  },

  KEINE_WAHLVORSTEHER_SCHULUNG {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.WAHLVORSTEHER_SCHULUNG;
    }
  },
  KEINE_SCHRIFTFUEHRER_SCHULUNG {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.SCHRIFTFUEHRER_SCHULUNG;
    }
  },
  KEINE_BEISITZER_SCHULUNG {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.BEISITZER_SCHULUNG;
    }
  },

  KEINE_CUSTOM_1 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_1;
    }
  },
  KEINE_CUSTOM_2 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_2;
    }
  },
  KEINE_CUSTOM_3 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_3;
    }
  },
  KEINE_CUSTOM_4 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_4;
    }
  },
  KEINE_CUSTOM_5 {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.CUSTOM_5;
    }
  },

  KEINE_SONSTIGE {

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

    @Override
    public SchulungArt getSchulungArt() {
      return SchulungArt.SONSTIGE;
    }
  },

  ;

  private SchulungArtFilter() {
  }

  public String lokalisiere(Messages messages) {
    String result = getMessage(messages, this);

    if (isNotBlank(result)) {
      return result;
    }

    result = getMessage(messages, getSchulungArt());

    if (isBlank(result)) {
      return "";
    }

    if (isNegation()) {
      return getMessage(messages, "SchulungArtFilter.negation", result);
    }

    return result;
  }

  public abstract boolean isNegation();

  public abstract SchulungArt getSchulungArt();

  public boolean isVorhanden(Messages messages) {
    return nurLokalisierteValues(getSchulungArt(), messages);
  }

  private boolean nurLokalisierteValues(SchulungArt schulungArt, Messages messages) {
    return isNotBlank(getMessage(messages, schulungArt));
  }

  private String getMessage(Messages messages, Enum< ? > enumValue) {
    return messages.lokalisiere(enumValue);
  }

  private String getMessage(Messages messages, String msgKey, Object... params) {
    return messages.getMessageForMessageKey(msgKey, params);
  }
}
