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

import java.math.BigDecimal;

import de.ivu.elect.business.entschaedigung.control.DefaultWahlausschussmitgliedEntschaedigungsartTemplate;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigungsart;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartTemplate;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.faces.Messages;

public abstract class AbstractWahlausschussEntschaedigung implements WahlausschussEntschaedigungBase {

  private static final long serialVersionUID = 1L;

  public AbstractWahlausschussEntschaedigung() {
    super();
  }

  public Entschaedigungsart toEntschaedigungsart(Messages messages) {
    EntschaedigungsartTemplate template = getEntschaedigungsartTemplate();

    Wahl wahl = getWahl();

    Entschaedigungsart entschaedigungsart = new Entschaedigungsart();
    entschaedigungsart.setWahl(wahl);
    entschaedigungsart.setWahltermin(wahl.getWahltermin());

    entschaedigungsart.setTemplate(template);

    entschaedigungsart.setBezeichnung(template.getBezeichnung(messages));
    entschaedigungsart.setBeschreibung(template.getBeschreibung(messages));

    BigDecimal betrag = getBetrag();

    entschaedigungsart.setEinzelbetragMinimal(betrag);
    entschaedigungsart.setEinzelbetragMaximal(betrag);
    entschaedigungsart.setEinzelbetragInitial(betrag);
    entschaedigungsart.setWaehrungAlsIsoCode(getWaehrungAlsIsoCode());

    entschaedigungsart.setBerechnungsart(template.getBerechnungsart());

    entschaedigungsart.setAnzahlMinimal(1L);
    entschaedigungsart.setAnzahlMaximal(1L);
    entschaedigungsart.setAnzahlInitial(1L);

    entschaedigungsart.setKriteriumPersonendatenArt(template.getKriteriumPersonendatenArt());
    entschaedigungsart.setKriteriumEinsatzfunktion(template.getKriteriumEinsatzfunktion());
    entschaedigungsart.setKriteriumEinsatzort(template.getKriteriumEinsatzort());

    return entschaedigungsart;
  }

  private EntschaedigungsartTemplate getEntschaedigungsartTemplate() {
    return DefaultWahlausschussmitgliedEntschaedigungsartTemplate.valuesWahlausschussmitgliedEntschaedigungsart().stream() //
        .filter(template -> template.matchesKriteriumEinsatzfunktion(getWahlausschussrolle())) //
        .findFirst().orElseThrow(() -> new IllegalArgumentException("FAILED to find EntschaedigungsartTemplate [wahlausschussrolle = " + getWahlausschussrolle() + "]"));
  }

  public Entschaedigung toEntschaedigung(Messages messages, Personendaten personendaten) {
    Entschaedigungsart entschaedigungsart = toEntschaedigungsart(messages);

    Entschaedigung entschaedigung = new Entschaedigung();
    entschaedigung.setEntschaedigungsart(entschaedigungsart);
    entschaedigung.setPersonendaten(personendaten);

    entschaedigung.setBezeichnung(entschaedigungsart.getBezeichnung());

    entschaedigung.setEinzelbetragDefault(entschaedigungsart.getEinzelbetragInitial());
    entschaedigung.setEinzelbetrag(entschaedigung.getEinzelbetragDefault());

    entschaedigung.setWaehrungAlsIsoCode(entschaedigungsart.getWaehrungAlsIsoCode());

    entschaedigung.setAnzahlDefault(entschaedigungsart.getAnzahlInitial());
    entschaedigung.setAnzahl(entschaedigung.getAnzahlDefault());

    return entschaedigung;
  }
}
