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

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.entschaedigung.entity.Entschaedigungsart;
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.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.Messages;

public abstract class AbstractEntschaedigungsartCreator {

  private static final Logger LOG = LoggerFactory.getLogger(AbstractEntschaedigungsartCreator.class);

  @Inject
  private transient EntschaedigungsartDAO entschaedigungsartDAO;

  @Inject
  private transient Messages messages;

  public AbstractEntschaedigungsartCreator() {
    super();
  }

  protected void initDefaultEntschaedigungsarten(Wahl wahl, Wahltermin wahltermin) {
    List<Entschaedigungsart> entschaedigungsarten = new ArrayList<>();

    String wahlOderWahltermin = "Wahltermin '" + wahltermin.getName() + "'";

    if (wahl != null) {
      wahlOderWahltermin = "Wahl '" + wahl.getName() + "'";

      entschaedigungsarten.addAll(entschaedigungsartDAO.findByWahl(wahl));
    } else {
      entschaedigungsarten.addAll(entschaedigungsartDAO.findByWahltermin(wahltermin));
    }

    if (entschaedigungsarten.isEmpty()) {
      LOG.info("Lege Entschädigungsarten für " + wahlOderWahltermin + " an");

      createDefaultEntschaedigungsarten(wahl, wahltermin);

      LOG.info("Entschädigungsarten angelegt");
    } else {
      LOG.info("Entschädigungsarten für " + wahlOderWahltermin + " bereits vorhanden");
    }
  }

  protected abstract void createDefaultEntschaedigungsarten(Wahl wahl, Wahltermin wahltermin);

  protected Entschaedigungsart persist(Wahl wahl, Wahltermin wahltermin, EntschaedigungsartTemplate template) {
    return persist(wahl, wahltermin, template, template.getKriteriumPersonendatenArt(), template.getBezeichnung(getMessages()), template.getBeschreibung(getMessages()),
        template.getEinzelbetragMinimal(), template.getEinzelbetragMaximal(), template.getEinzelbetragInitial(), template.getWaehrungAlsIsoCode(), template.getBerechnungsart(),
        template.getAnzahlMinimal(), template.getAnzahlMaximal(), template.getAnzahlInitial(), template.getKriteriumEinsatzfunktion(), template.getKriteriumEinsatzort());
  }

  protected Entschaedigungsart persist(Wahl wahl, Wahltermin wahltermin, EntschaedigungsartTemplate template, EntschaedigungsartKriteriumPersonendatenArt kriteriumPersonendatenArt, String bezeichnung,
      String beschreibung, BigDecimal einzelbetragMinimal, BigDecimal einzelbetragMaximal, BigDecimal einzelbetragInitial, String waehrungAlsIsoCode, EntschaedigungsartBerechnungsart berechnungsart,
      Long anzahlMinimal, Long anzahlMaximal, Long anzahlInitial, EntschaedigungsartKriteriumEinsatzfunktion kriteriumEinsatzfunktion, EntschaedigungsartKriteriumEinsatzort kriteriumEinsatzort) {
    Entschaedigungsart entschaedigungsart = new Entschaedigungsart();
    entschaedigungsart.setWahl(wahl);
    entschaedigungsart.setWahltermin(wahltermin);

    entschaedigungsart.setTemplate(template);

    entschaedigungsart.setBezeichnung(bezeichnung);
    entschaedigungsart.setBeschreibung(beschreibung);

    entschaedigungsart.setEinzelbetragMinimal(einzelbetragMinimal);
    entschaedigungsart.setEinzelbetragMaximal(einzelbetragMaximal);
    entschaedigungsart.setEinzelbetragInitial(einzelbetragInitial);
    entschaedigungsart.setWaehrungAlsIsoCode(waehrungAlsIsoCode);

    entschaedigungsart.setBerechnungsart(berechnungsart);

    entschaedigungsart.setAnzahlMinimal(anzahlMinimal);
    entschaedigungsart.setAnzahlMaximal(anzahlMaximal);
    entschaedigungsart.setAnzahlInitial(anzahlInitial);

    entschaedigungsart.setKriteriumPersonendatenArt(kriteriumPersonendatenArt);
    entschaedigungsart.setKriteriumEinsatzfunktion(kriteriumEinsatzfunktion);
    entschaedigungsart.setKriteriumEinsatzort(kriteriumEinsatzort);

    entschaedigungsartDAO.persist(entschaedigungsart);

    LOG.info("Entschädigungsart '" + entschaedigungsart.getBezeichnung() + "' für " + kriteriumPersonendatenArt.getDisplayName(getMessages()) + " mit Einsatzfunktion '"
        + kriteriumEinsatzfunktion.getDisplayName(getMessages()) + "' und Einsatzort '" + kriteriumEinsatzort.getDisplayName(getMessages()) + "' angelegt");

    return entschaedigungsart;
  }

  protected String getMessage(String msgKey, Object... params) {
    return getMessages().getMessageForMessageKey(msgKey, params);
  }

  protected String getMessage(Enum< ? > value) {
    return getMessages().lokalisiere(value);
  }

  protected Messages getMessages() {
    return messages;
  }
}
