
package de.ivu.elect.presentation.dokumente.exchange;

import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import java.util.List;
import java.util.Optional;

import javax.annotation.Nullable;

import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.datei.entity.DateiExportPK;
import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.jee.entity.AbstractNoPersistentEntity;
import de.ivu.elect.jee.entity.EntityLongPK;
import de.ivu.elect.jee.entity.tk.EntityUK;
import de.ivu.elect.jee.presentation.dynamicform.AdvancedDynaFormModel;

public class DokumentBulkExportSearchEntry extends AbstractNoPersistentEntity<EntityLongPK, EntityUK> {

  private static final long serialVersionUID = 1L;

  private final long id;

  private final AbstractDokumentBulkExportSubView< ? , ? , ? > dokumentBulkExportSubView;

  private final String dokumentBulkExportBeschreibung;

  private final AdvancedDynaFormModel dokumentBulkExportModel;

  private final String dokumentBezeichnung;

  private final String dokumentBeschreibung;

  private final FileFormat fileFormat;

  private final DokumentVorlageArt dokumentVorlagenArt;

  private final int dokumentVorlagenRequiredAnzahl;

  private final List<String> dokumentVorlagenRequiredBeschreibungen;

  private final List<DokumentVorlage> dokumentVorlagen;

  public DokumentBulkExportSearchEntry(AbstractDokumentBulkExportSubView< ? , ? , ? > dokumentBulkExportSubView, String dokumentBulkExportBeschreibung, AdvancedDynaFormModel dokumentBulkExportModel,
      String dokumentBezeichnung, String dokumentBeschreibung, @Nullable FileFormat fileFormat, @Nullable DokumentVorlageArt dokumentVorlagenArt, int dokumentVorlagenRequiredAnzahl,
      List<String> dokumentVorlagenRequiredBeschreibungen, List<DokumentVorlage> dokumentVorlagen) {
    super();

    this.id = System.nanoTime();

    this.dokumentBulkExportSubView = dokumentBulkExportSubView;
    this.dokumentBulkExportBeschreibung = trimToEmpty(dokumentBulkExportBeschreibung);
    this.dokumentBulkExportModel = dokumentBulkExportModel;

    this.dokumentBezeichnung = trimToEmpty(dokumentBezeichnung);
    this.dokumentBeschreibung = trimToEmpty(dokumentBeschreibung);

    this.fileFormat = fileFormat;

    this.dokumentVorlagenArt = dokumentVorlagenArt;
    this.dokumentVorlagenRequiredAnzahl = dokumentVorlagenRequiredAnzahl;
    this.dokumentVorlagenRequiredBeschreibungen = dokumentVorlagenRequiredBeschreibungen;
    this.dokumentVorlagen = dokumentVorlagen;
  }

  @Override
  public Long getId() {
    return id;
  }

  public boolean isExportConfigured() {
    return getDokumentBulkExportSubView() != null && hasFileFormat() && isDokumentVorlagenConfigured();
  }

  public boolean isExportConfirmed() {
    return isNotBlank(getDokumentBulkExportBeschreibung()) || getDokumentBulkExportModel() != null && getDokumentBulkExportModel().isAnyPropertyAdded();
  }

  public Optional<DateiExportPK> export(FileType finaleKonvertierung) {
    return getDokumentBulkExportSubView().export(this, finaleKonvertierung);
  }

  public boolean isSupportsFinaleKonvertierung(FileType fileType) {
    return getDokumentBulkExportSubView().isSupportsFinaleKonvertierung(fileType);
  }

  public String getDokumentBezeichnung() {
    return dokumentBezeichnung;
  }

  public String getDokumentBeschreibung() {
    return dokumentBeschreibung;
  }

  public boolean hasUseCasePermissions(ElectCommonPrincipal principal) {
    return dokumentBulkExportSubView.hasUseCasePermissions(principal);
  }

  public boolean hasFileFormat() {
    return getFileFormat() != null;
  }

  @Nullable
  public FileFormat getFileFormat() {
    return fileFormat;
  }

  @Nullable
  public FileType getFileType() {
    if (hasFileFormat()) {
      return getFileFormat().getFileType();
    }

    return null;
  }

  public boolean isDokumentVorlageRequired() {
    return getDokumentVorlagenArt() != null && getDokumentVorlagenRequiredAnzahl() > 0;
  }

  public boolean isDokumentVorlagenConfigured() {
    return !isDokumentVorlageRequired() || getDokumentVorlagen().size() >= getDokumentVorlagenRequiredAnzahl();
  }

  @Nullable
  public DokumentVorlageArt getDokumentVorlagenArt() {
    return dokumentVorlagenArt;
  }

  public int getDokumentVorlagenRequiredAnzahl() {
    return dokumentVorlagenRequiredAnzahl;
  }

  public List<String> getDokumentVorlagenRequiredBeschreibungen() {
    return dokumentVorlagenRequiredBeschreibungen;
  }

  public List<DokumentVorlage> getDokumentVorlagen() {
    return dokumentVorlagen;
  }

  private AbstractDokumentBulkExportSubView< ? , ? , ? > getDokumentBulkExportSubView() {
    return dokumentBulkExportSubView;
  }

  public String getDokumentBulkExportBeschreibung() {
    return dokumentBulkExportBeschreibung;
  }

  public AdvancedDynaFormModel getDokumentBulkExportModel() {
    return dokumentBulkExportModel;
  }
}
