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

import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase;

import java.math.BigDecimal;
import java.util.Currency;
import java.util.Locale;

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

public interface EntschaedigungsartTemplate {

  // NOTE, dass momentan nur EURO unterstützt wird!
  Currency DEFAULT_WAEHRUNG = Currency.getInstance(Locale.GERMANY);

  String getTechnicalName();

  default String getBezeichnung(Messages messages) {
    return messages.getMessageForMessageKey("Entschaedigungsart." + getKriteriumPersonendatenArt().getTechnicalName());
  }

  EntschaedigungsartKriteriumPersonendatenArt getKriteriumPersonendatenArt();

  String getBeschreibung(Messages messages);

  BigDecimal getEinzelbetragMinimal();

  BigDecimal getEinzelbetragMaximal();

  BigDecimal getEinzelbetragInitial();

  default String getWaehrungAlsIsoCode() {
    return DEFAULT_WAEHRUNG.getCurrencyCode();
  }

  EntschaedigungsartBerechnungsart getBerechnungsart();

  Long getAnzahlMinimal();

  Long getAnzahlMaximal();

  Long getAnzahlInitial();

  EntschaedigungsartKriteriumEinsatzfunktion getKriteriumEinsatzfunktion();

  EntschaedigungsartKriteriumEinsatzort getKriteriumEinsatzort();

  default boolean matchesKriteriumEinsatz(EntschaedigungsartKriteriumEinsatzort kriteriumEinsatzort, EntschaedigungsartKriteriumEinsatzfunktion kriteriumEinsatzfunktion) {
    return matchesKriteriumEinsatzort(kriteriumEinsatzort) && matchesKriteriumEinsatzfunktion(kriteriumEinsatzfunktion);
  }

  default boolean matchesKriteriumEinsatzort(EntschaedigungsartKriteriumEinsatzort kriteriumEinsatzort) {
    return kriteriumEinsatzort != null && equalsIgnoreCase(kriteriumEinsatzort.getTechnicalName(), getKriteriumEinsatzort().getTechnicalName());
  }

  default boolean matchesKriteriumEinsatzfunktion(EntschaedigungsartKriteriumEinsatzfunktion kriteriumEinsatzfunktion) {
    return kriteriumEinsatzfunktion != null && equalsIgnoreCase(kriteriumEinsatzfunktion.getTechnicalName(), getKriteriumEinsatzfunktion().getTechnicalName());
  }

  EntschaedigungsartTemplate INDIVIDUELL = new EntschaedigungsartTemplate() {

    @Override
    public String getTechnicalName() {
      return "INDIVIDUELL";
    }

    @Override
    public EntschaedigungsartKriteriumPersonendatenArt getKriteriumPersonendatenArt() {
      return EntschaedigungsartKriteriumPersonendatenArt.IRRELEVANT;
    }

    @Override
    public String getBeschreibung(Messages messages) {
      return getBezeichnung(messages);
    }

    @Override
    public BigDecimal getEinzelbetragMinimal() {
      return BigDecimal.ZERO;
    }

    @Override
    public BigDecimal getEinzelbetragMaximal() {
      return BigDecimal.ZERO;
    }

    @Override
    public BigDecimal getEinzelbetragInitial() {
      return BigDecimal.ZERO;
    }

    @Override
    public EntschaedigungsartBerechnungsart getBerechnungsart() {
      return EntschaedigungsartBerechnungsart.PER_ANZAHL;
    }

    @Override
    public Long getAnzahlMinimal() {
      return 0L;
    }

    @Override
    public Long getAnzahlMaximal() {
      return 0L;
    }

    @Override
    public Long getAnzahlInitial() {
      return 0L;
    }

    @Override
    public EntschaedigungsartKriteriumEinsatzfunktion getKriteriumEinsatzfunktion() {
      return EntschaedigungsartKriteriumEinsatzfunktion.IRRELEVANT;
    }

    @Override
    public EntschaedigungsartKriteriumEinsatzort getKriteriumEinsatzort() {
      return EntschaedigungsartKriteriumEinsatzort.IRRELEVANT;
    }
  };
}
