package de.ivu.elect.business.email.entity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.Transient;

import org.primefaces.model.file.UploadedFile;

import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.mandant.entity.EntityMitMandant;
import de.ivu.elect.business.person.entity.Personendaten;

public abstract class AbstractEmailVorgang implements EmailVorgangBase, EntityMitMandant {

  public static final String EMAIL_LAYOUT_INHALT_PLATZHALTER = "[[INHALT]]";

  private static final long serialVersionUID = 1L;

  @Transient
  private transient String empfaengerAdresseManuell = null;

  @Transient
  private transient List<Personendaten> empfaengerPersonendaten = null;

  @Transient
  private transient Map<String, UploadedFile> uploadedFiles = new HashMap<>();

  @Transient
  private transient Map<String, DateiExport> angehaengteDateiExporte = new HashMap<>();

  public static String getInhaltDefaultValue() {
    StringBuilder sb = new StringBuilder();
    sb.append("<p>");
    sb.append(EmailVorgangPlatzhalter.ANREDE_FORMEL.getPlatzhalter());
    sb.append(" ");
    sb.append(EmailVorgangPlatzhalter.TITEL_NACHNAME.getPlatzhalter());
    sb.append(",</p>");
    sb.append("<p>");
    sb.append("Guten Tag");
    sb.append(" ");
    sb.append(EmailVorgangPlatzhalter.TITEL_VORNAME_NACHNAME.getPlatzhalter());
    sb.append(",</p>\n\n<p>&nbsp;</p>");
    return sb.toString();
  }

  public String getEmpfaengerAdresseManuell() {
    return empfaengerAdresseManuell;
  }

  public void setEmpfaengerAdresseManuell(String empfaenger) {
    this.empfaengerAdresseManuell = empfaenger;
  }

  public List<Personendaten> getEmpfaengerPersonendaten() {
    return empfaengerPersonendaten;
  }

  public void setEmpfaengerPersonendaten(List<Personendaten> empfaenger) {
    this.empfaengerPersonendaten = empfaenger;
  }

  public boolean hasEmpfaengerPersonendaten() {
    return getEmpfaengerPersonendaten() != null && !getEmpfaengerPersonendaten().isEmpty();
  }

  public int getAnzahlEmpfaengerPersonendaten() {
    if (getEmpfaengerPersonendaten() == null) {
      return 0;
    }
    return getEmpfaengerPersonendaten().size();
  }

  public List<Personendaten> getEmpfaengerPersonendatenMitEmailAdresse() {
    List<Personendaten> result = new ArrayList<>();
    for (Personendaten personendaten : getEmpfaengerPersonendaten()) {
      if (!personendaten.getEmailAdressenZumVersenden().isEmpty()) {
        result.add(personendaten);
      }
    }
    return result;
  }

  public boolean hasEmpfaengerPersonendatenMitEmailAdresse() {
    for (Personendaten personendaten : getEmpfaengerPersonendaten()) {
      if (!personendaten.getEmailAdressenZumVersenden().isEmpty()) {
        return true;
      }
    }
    return false;
  }

  public Collection<UploadedFile> getUploadedFiles() {
    return uploadedFiles.values();
  }

  public void addUploadedFile(UploadedFile uploadedFile) {
    String dateiname = uploadedFile.getFileName();
    uploadedFiles.put(dateiname, uploadedFile);
    angehaengteDateiExporte.remove(dateiname); // stellt sicher, dass jeder Dateiname nur einmal als Anhang vorkommt
  }

  public Collection<DateiExport> getAngehaengteDateiExporte() {
    return angehaengteDateiExporte.values();
  }

  public void addDocument(DateiExport dateiExport) {
    if (dateiExport == null) {
      return;
    }
    String dateiname = dateiExport.getDatei().getOriginalDateiname();
    angehaengteDateiExporte.put(dateiname, dateiExport);
    uploadedFiles.remove(dateiname); // stellt sicher, dass jeder Dateiname nur einmal als Anhang vorkommt
  }

  public List<String> getAnhaengeDateinamen() {
    ArrayList<String> dateinamen = new ArrayList<>(uploadedFiles.keySet());
    dateinamen.addAll(angehaengteDateiExporte.keySet());
    return dateinamen;
  }

  public void removeAnhang(String dateiname) {
    uploadedFiles.remove(dateiname);
    angehaengteDateiExporte.remove(dateiname);
  }

  public UploadedFile getFileUploadByDateiname(String dateiname) {
    return uploadedFiles.get(dateiname);
  }

  public DateiExport getDateiExportByDateiname(String dateiname) {
    return angehaengteDateiExporte.get(dateiname);
  }

  public boolean hatAnhangMitGleichemDateiname(UploadedFile uploadedFile) {
    if (uploadedFile == null) {
      return false;
    }
    return hatAnhang(uploadedFile.getFileName());
  }

  public boolean hatAnhangMitGleichemDateiname(DateiExport dateiExport) {
    if (dateiExport == null) {
      return false;
    }
    return hatAnhang(dateiExport.getDatei().getOriginalDateiname());
  }

  private boolean hatAnhang(String dateiname) {
    if (uploadedFiles.containsKey(dateiname) || angehaengteDateiExporte.containsKey(dateiname)) {
      return true;
    }
    return false;
  }

  @Override
  public EntityMitMandant getParent() {
    return getWahltermin();
  }
}
