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

import java.util.Collection;
import java.util.Locale;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.datei.boundary.DateiExportDAO;
import de.ivu.elect.business.datei.boundary.DateiExportEdit;
import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.entschaedigung.control.EntschaedigungAggregator;
import de.ivu.elect.business.entschaedigung.entity.Auszahlung;
import de.ivu.elect.business.entschaedigung.entity.AuszahlungConstants;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.protokollierung.entity.LoeschProtokollEvent;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.util.MoneyUtil;

@Stateless
public class AuszahlungEdit extends AbstractAuszahlungEdit {

  private static final Locale SYSTEM_LOCALE = Locale.getDefault(); // ELECT-12647, Locale/TimeZone der Anwendung...

  @Inject
  private transient Messages messages;

  @Inject
  private transient DateiExportDAO dateiExportDAO;

  @Inject
  private transient EntschaedigungDAO entschaedigungDAO;

  @Inject
  private transient LoeschProtokollEvent loeschProtokollEvent; // ELECT-9664

  @Inject
  private transient DateiExportEdit dateiExportEdit;

  public AuszahlungEdit() {
    super();
  }

  @Override
  public void delete(Auszahlung template) {
    Auszahlung auszahlung = getAttachedEntity(template);

    if (auszahlung != null) {
      Collection<Entschaedigung> entschaedigungen = auszahlung.getEntschaedigungen(entschaedigungDAO);

      EntschaedigungAggregator entschaedigungenAggregator = auszahlung.createEntschaedigungenAggregator(entschaedigungDAO);

      loeschProtokollEvent.sendeLoeschProtokollEvent(auszahlung.getWahltermin(), auszahlung.getWahl(), auszahlung, "loesch.protokoll.auszahlung", auszahlung.getBezeichnung(),
          UserLocale.formatDateTimeMedium(auszahlung.getErstelltAm(), SYSTEM_LOCALE), UserLocale.formatNumber((long) entschaedigungen.size(), SYSTEM_LOCALE),
          MoneyUtil.formatBetragMitWaehrungskuerzel(SYSTEM_LOCALE, entschaedigungenAggregator.calculateGesamtbetrag(), entschaedigungenAggregator.getWaehrungAlsIsoCode()));

      for (Entschaedigung entschaedigung : entschaedigungen) {
        entschaedigungDAO.remove(entschaedigung); // ELECT-11687
      }

      super.delete(auszahlung);
    }
  }

  // ELECT-6877
  public void removeAndDeleteDateiExport(DateiExport template) {
    DateiExport dateiExport = dateiExportDAO.attach(template);

    if (dateiExport != null) {
      Datei datei = dateiExport.getDatei();

      loeschProtokollEvent.sendeLoeschProtokollEvent(datei.getWahltermin(), datei.getWahl(), dateiExport.getId(), AuszahlungConstants.MESSAGE_KEY_ENTITY_EINZAHL, "loesch.protokoll.dateiexport",
          datei.getDateiname(), UserLocale.formatDateTimeMedium(datei.getErstellungszeitpunkt(), SYSTEM_LOCALE), messages.getMessageForMessageKey(datei.getFormat()));

      dao.updateDateiExportDeleted(dateiExport);

      dateiExportEdit.delete(dateiExport);
    }
  }
}
