
package de.ivu.elect.presentation.entschaedigung.form;

import java.util.Comparator;
import java.util.Optional;

import de.ivu.elect.business.datei.entity.DateiProperties;
import de.ivu.elect.business.entschaedigung.entity.Auszahlung;
import de.ivu.elect.business.entschaedigung.entity.AuszahlungConstants;
import de.ivu.elect.business.entschaedigung.entity.AuszahlungProperties;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.entschaedigung.entity.Entschaedigungsart;
import de.ivu.elect.jee.presentation.dynamicform.AbstractTimestampProperty;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.MoneyProperty;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyStringProperty;
import de.ivu.elect.presentation.ViewFormBuilder;

public class AuszahlungViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  public static final Comparator<Auszahlung> AUSZAHLUNG_DEFAULT_COMPARATOR = (one, another) -> one.getPk().compareTo(another.getPk());

  public static final String MSG_KEY_AUSZAHLUNG_DATEI_EXPORT_ZEITPUNKT_EINZAHL = "entity.einzahl.AUSZAHLUNG.DATEI_EXPORT_ZEITPUNKT";

  public static final String MSG_KEY_AUSZAHLUNG_DATEI_EXPORT_STATUS_EINZAHL = "entity.einzahl.AUSZAHLUNG.DATEI_EXPORT_STATUS";

  public AuszahlungViewFormBuilder() {
    super();
  }

  public boolean isBearbeitbar(Auszahlung auszahlung) {
    return auszahlung.isBearbeitbar();
  }

  public void addProperties(FormBuilder formBuilder, Auszahlung auszahlung, boolean readonly) {
    boolean readonlyOrDefault = readonly || !isBearbeitbar(auszahlung);

    addBasicAuszahlungProperties(formBuilder, auszahlung, readonlyOrDefault);

    if (auszahlung.hasDateiExport()) {
      formBuilder.addSeparator(AuszahlungConstants.MESSAGE_KEY_DATEI_EXPORT_ID_EINZAHL);

      addDateiExportProperties(formBuilder, auszahlung, true);
    }
  }

  protected void addBasicAuszahlungProperties(FormBuilder formBuilder, Auszahlung auszahlung, boolean readonly) {
    AuszahlungProperties auszahlungProperties = auszahlung.getProperties();

    if (auszahlung.isPersistent() && auszahlung.getErstelltAm() != null) {
      formBuilder.addProperty(auszahlungProperties.getErstelltAmProperty()).readonly();
    }

    formBuilder.addProperty(auszahlungProperties.getBezeichnungProperty()).required().withReadonly(readonly);
  }

  public void addAuszahlungProperties(FormBuilder formBuilder, Auszahlung auszahlung, Entschaedigung entschaedigungInAuszahlung) {
    MoneyProperty entschaedigungInAuszahlungGesamtbetragProperty = new MoneyProperty(entschaedigungInAuszahlung.getProperties().getGesamtbetragProperty(),
        entschaedigungInAuszahlung.getWaehrungAlsIsoCode());

    addAuszahlungProperties(formBuilder, auszahlung, Optional.of(entschaedigungInAuszahlungGesamtbetragProperty));
  }

  public void addAuszahlungProperties(FormBuilder formBuilder, Auszahlung auszahlung, Entschaedigungsart entschaedigungsartInAuszahlung) {
    addAuszahlungProperties(formBuilder, auszahlung, Optional.empty());
  }

  private void addAuszahlungProperties(FormBuilder formBuilder, Auszahlung auszahlung, Optional<MoneyProperty> betragPropertyIfPresent) {
    AuszahlungProperties auszahlungProperties = auszahlung.getProperties();

    formBuilder.addProperty(auszahlungProperties.getBezeichnungProperty()).withLabel(getMessage(AuszahlungConstants.MESSAGE_KEY_ENTITY_EINZAHL)).readonly();
    betragPropertyIfPresent.ifPresent(betragProperty -> formBuilder.addProperty(betragProperty).readonly());

    AbstractTimestampProperty erstelltAmProperty = auszahlungProperties.getErstelltAmProperty();

    if (erstelltAmProperty.hasValue()) {
      formBuilder.addProperty(erstelltAmProperty).readonly();
    }

    if (auszahlung.hasDateiExport()) {
      addDateiExportProperties(formBuilder, auszahlung, true);
    } else {
      formBuilder.addProperty(new ReadOnlyStringProperty(getMessage(AuszahlungViewFormBuilder.MSG_KEY_AUSZAHLUNG_DATEI_EXPORT_STATUS_EINZAHL),
          getMessage(AuszahlungViewFormBuilder.MSG_KEY_AUSZAHLUNG_DATEI_EXPORT_STATUS_EINZAHL + ".VORGESEHEN")));
    }
  }

  public void addDateiExportProperties(FormBuilder formBuilder, Auszahlung auszahlung, boolean readonly) {
    if (auszahlung.hasDateiExport()) {
      DateiProperties dateiProperties = auszahlung.getDateiExport().getDatei().getProperties();

      formBuilder.addProperty(dateiProperties.getErstellungszeitpunktProperty()).withLabel(getMessage(MSG_KEY_AUSZAHLUNG_DATEI_EXPORT_ZEITPUNKT_EINZAHL)).withReadonly(readonly);
      formBuilder.addProperty(dateiProperties.getDateinameProperty()).withReadonly(readonly);
    }
  }
}
