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

import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartBerechnungsart;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartKriteriumEinsatzfunktion;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartKriteriumEinsatzort;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartKriteriumPersonendatenArt;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartTemplate;
import de.ivu.elect.business.person.entity.CorePersonendatenArt;
import de.ivu.elect.business.wahlausschuss.entity.Wahlausschussrolle;
import de.ivu.elect.jee.faces.Messages;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.stream.Collectors;

import static java.util.Arrays.stream;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

public enum DefaultWahlausschussmitgliedEntschaedigungsartTemplate implements EntschaedigungsartTemplate {

  WAHLAUSSCHUSSMITGLIED_ENTSCHAEDIGUNG_VORSITZENDER(Wahlausschussrolle.VORSITZENDER),
  WAHLAUSSCHUSSMITGLIED_ENTSCHAEDIGUNG_VORSITZENDER_STELLVERTRETER(Wahlausschussrolle.VORSITZENDER_STELLVERTRETEND),
  WAHLAUSSCHUSSMITGLIED_ENTSCHAEDIGUNG_SCHRIFTFUEHRER(Wahlausschussrolle.SCHRIFTFUEHRER),
  WAHLAUSSCHUSSMITGLIED_ENTSCHAEDIGUNG_SCHRIFTFUEHRER_STELLVERTRETER(Wahlausschussrolle.SCHRIFTFUEHRER_STELLVERTRETEND),
  WAHLAUSSCHUSSMITGLIED_ENTSCHAEDIGUNG_BEISITZER(Wahlausschussrolle.BEISITZER),
  WAHLAUSSCHUSSMITGLIED_ENTSCHAEDIGUNG_BEISITZER_STELLVERTRETER(Wahlausschussrolle.BEISITZER_STELLVERTRETEND),
  WAHLAUSSCHUSSMITGLIED_ENTSCHAEDIGUNG_HILFSKRAFT(Wahlausschussrolle.HILFSKRAFT),

  ;

  private final EntschaedigungsartKriteriumPersonendatenArt kriteriumPersonendatenArt;

  private final BigDecimal einzelbetragMinimal;

  private final BigDecimal einzelbetragMaximal;

  private final BigDecimal einzelbetragInitial;

  private final EntschaedigungsartBerechnungsart berechnungsart;

  private final Long anzahlMinimal;

  private final Long anzahlMaximal;

  private final Long anzahlInitial;

  private final EntschaedigungsartKriteriumEinsatzfunktion kriteriumEinsatzfunktion;

  private final EntschaedigungsartKriteriumEinsatzort kriteriumEinsatzort;

  private DefaultWahlausschussmitgliedEntschaedigungsartTemplate(Wahlausschussrolle wahlausschussrolle) {
    this(CorePersonendatenArt.WAHLAUSSCHUSSMITGLIED, "0.00", null, "0.00", EntschaedigungsartBerechnungsart.PER_EINSATZ, 0L, 1L, 1L, EntschaedigungsartKriteriumEinsatzort.IRRELEVANT,
        wahlausschussrolle);
  }

  private DefaultWahlausschussmitgliedEntschaedigungsartTemplate(EntschaedigungsartKriteriumPersonendatenArt kriteriumPersonendatenArt, String einzelbetragMinimal, String einzelbetragMaximal,
      String einzelbetragInitial, EntschaedigungsartBerechnungsart berechnungsart, Long anzahlMinimal, Long anzahlMaximal, Long anzahlInitial,
      EntschaedigungsartKriteriumEinsatzort kriteriumEinsatzort, EntschaedigungsartKriteriumEinsatzfunktion kriteriumEinsatzfunktion) {
    this.kriteriumPersonendatenArt = kriteriumPersonendatenArt;

    this.einzelbetragMinimal = isNotBlank(einzelbetragMinimal) ? new BigDecimal(einzelbetragMinimal) : null;
    this.einzelbetragMaximal = isNotBlank(einzelbetragMaximal) ? new BigDecimal(einzelbetragMaximal) : null;
    this.einzelbetragInitial = isNotBlank(einzelbetragInitial) ? new BigDecimal(einzelbetragInitial) : null;

    this.berechnungsart = berechnungsart;

    this.anzahlMinimal = anzahlMinimal;
    this.anzahlMaximal = anzahlMaximal;
    this.anzahlInitial = anzahlInitial;

    this.kriteriumEinsatzfunktion = kriteriumEinsatzfunktion;
    this.kriteriumEinsatzort = kriteriumEinsatzort;
  }

  @Override
  public String getTechnicalName() {
    return name();
  }

  @Override
  public String getBezeichnung(Messages messages) {
    return formatWahlausschussmitgliedEntschaedigung(this, messages, createEntschaedigungBezeichnungMsgKey(this));
  }

  @Override
  public String getBeschreibung(Messages messages) {
    return formatWahlausschussmitgliedEntschaedigung(this, messages, createEntschaedigungBeschreibungMsgKey(this));
  }

  @Override
  public EntschaedigungsartKriteriumPersonendatenArt getKriteriumPersonendatenArt() {
    return kriteriumPersonendatenArt;
  }

  @Override
  public BigDecimal getEinzelbetragMinimal() {
    return einzelbetragMinimal;
  }

  @Override
  public BigDecimal getEinzelbetragMaximal() {
    return einzelbetragMaximal;
  }

  @Override
  public BigDecimal getEinzelbetragInitial() {
    return einzelbetragInitial;
  }

  @Override
  public EntschaedigungsartBerechnungsart getBerechnungsart() {
    return berechnungsart;
  }

  @Override
  public Long getAnzahlMinimal() {
    return anzahlMinimal;
  }

  @Override
  public Long getAnzahlMaximal() {
    return anzahlMaximal;
  }

  @Override
  public Long getAnzahlInitial() {
    return anzahlInitial;
  }

  @Override
  public EntschaedigungsartKriteriumEinsatzfunktion getKriteriumEinsatzfunktion() {
    return kriteriumEinsatzfunktion;
  }

  @Override
  public EntschaedigungsartKriteriumEinsatzort getKriteriumEinsatzort() {
    return kriteriumEinsatzort;
  }

  private static String formatWahlausschussmitgliedEntschaedigung(EntschaedigungsartTemplate template, Messages messages, String msgKey) {
    return messages.getMessageForMessageKey(msgKey, messages.getMessageForMessageKey("Entschaedigungsart." + template.getKriteriumPersonendatenArt().getTechnicalName()),
        template.getKriteriumEinsatzfunktion().getDisplayName(messages));
  }

  private static String createEntschaedigungBezeichnungMsgKey(EntschaedigungsartTemplate template) {
    return createEntschaedigungMsgKeyPrefix(template) + "bezeichnung";
  }

  private static String createEntschaedigungBeschreibungMsgKey(EntschaedigungsartTemplate template) {
    return createEntschaedigungMsgKeyPrefix(template) + "beschreibung";
  }

  private static String createEntschaedigungMsgKeyPrefix(EntschaedigungsartTemplate template) {
    return "CoreEntschaedigungsartTemplate." + template.getKriteriumPersonendatenArt().getTechnicalName() + ".";
  }

  public static Collection<EntschaedigungsartTemplate> valuesWahlausschussmitgliedEntschaedigungsart() {
    return stream(values()).filter(value -> value.getKriteriumPersonendatenArt().matchesPersonendatenArt(CorePersonendatenArt.WAHLAUSSCHUSSMITGLIED)).collect(Collectors.toSet());
  }
}
