
package de.ivu.elect.exchange.entschaedigung.csv;

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

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Locale;

import org.jsefa.csv.annotation.CsvDataType;
import org.jsefa.csv.annotation.CsvField;

import de.ivu.elect.business.entschaedigung.entity.Auszahlung;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigungsart;
import de.ivu.elect.business.person.entity.Kontoverbindung;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.exchange.BaseDTO;
import de.ivu.elect.exchange.entschaedigung.AuszahlungDTO;
import de.ivu.jsefa.CsvHeader;

@CsvDataType
public class DefaultAuszahlungEntschaedigungPerPersonendatenCsvExportDTO extends BaseDTO implements AuszahlungDTO {

  @CsvField(pos = 1)
  @CsvHeader("Auszahlung")
  public String bezeichnung;

  @CsvField(pos = 10)
  @CsvHeader("Finanz ID")
  public String personendatenFinanzId;

  @CsvField(pos = 11)
  @CsvHeader("Familienname")
  public String personendatenFamilienname;

  @CsvField(pos = 12)
  @CsvHeader("Vornamen")
  public String personendatenVornamen;

  @CsvField(pos = 20)
  @CsvHeader("Kontoinhaber")
  private String kontoverbindungKontoinhaber;

  @CsvField(pos = 21)
  @CsvHeader("Kreditinstitut")
  private String kontoverbindungKreditinstitut;

  @CsvField(pos = 22)
  @CsvHeader("Bankleitzahl")
  private String kontoverbindungBankleitzahl;

  @CsvField(pos = 23)
  @CsvHeader("Kontonummer")
  private String kontoverbindungKontonummer;

  @CsvField(pos = 24)
  @CsvHeader("IBAN")
  private String kontoverbindungIban;

  @CsvField(pos = 25)
  @CsvHeader("BIC")
  private String kontoverbindungBic;

  @CsvField(pos = 30)
  @CsvHeader("Entschädigungen")
  public String entschaedigungBezeichnung;

  @CsvField(pos = 31)
  @CsvHeader("Betrag")
  public String entschaedigungGesamtbetrag;

  @CsvField(pos = 32)
  @CsvHeader("Währung")
  public String entschaedigungWaehrung;

  public DefaultAuszahlungEntschaedigungPerPersonendatenCsvExportDTO() {
    super();
  }

  public DefaultAuszahlungEntschaedigungPerPersonendatenCsvExportDTO(Auszahlung auszahlung, Personendaten personendaten, Entschaedigung entschaedigung, Locale locale) {
    super();

    NumberFormat numberFormat = NumberFormat.getInstance(locale);
    numberFormat.setGroupingUsed(false); // !!!
    numberFormat.setMaximumFractionDigits(2);
    numberFormat.setMinimumFractionDigits(2);

    this.bezeichnung = auszahlung.getBezeichnung();

    this.personendatenFinanzId = defaultIfBlank(personendaten.getFinanzId(), personendaten.getExterneId());
    this.personendatenFamilienname = personendaten.getFamilienname();
    this.personendatenVornamen = defaultIfBlank(personendaten.getVornamen(), personendaten.getRufname());

    Kontoverbindung kontoverbindung = entschaedigung.hasKontoverbindung() ? entschaedigung.getKontoverbindung() : personendaten.getKontoverbindung();

    this.kontoverbindungKontoinhaber = kontoverbindung.getKontoinhaber();
    this.kontoverbindungKreditinstitut = kontoverbindung.getKreditinstitut();
    this.kontoverbindungBankleitzahl = kontoverbindung.getBankleitzahl();
    this.kontoverbindungKontonummer = kontoverbindung.getKontonummer();
    this.kontoverbindungIban = kontoverbindung.getIban();
    this.kontoverbindungBic = kontoverbindung.getBic();

    Entschaedigungsart entschaedigungsart = entschaedigung.getEntschaedigungsart();

    this.entschaedigungBezeichnung = defaultIfBlank(entschaedigung.getBezeichnung(), entschaedigungsart == null ? "" : entschaedigungsart.getBezeichnung());
    this.entschaedigungGesamtbetrag = numberFormat.format(entschaedigung.hasGesamtbetrag() ? entschaedigung.getGesamtbetrag() : BigDecimal.ZERO);
    this.entschaedigungWaehrung = entschaedigung.getWaehrungAlsIsoCode();
  }
}
