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

import java.io.IOException;
import java.util.Arrays;
import java.util.Objects;

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;
import org.primefaces.model.file.UploadedFile;

import de.ivu.elect.business.datei.boundary.DateiDAO;
import de.ivu.elect.business.datei.control.FileExchange;
import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.datei.entity.DateiFileNames;
import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.datei.entity.ServerFileType;
import de.ivu.elect.business.email.boundary.EmailLayoutDAO;
import de.ivu.elect.business.email.entity.Email;
import de.ivu.elect.business.email.entity.EmailLayout;
import de.ivu.elect.business.email.entity.EmailVorgang;
import de.ivu.elect.business.email.entity.EmailVorgangAnhangFileNames;
import de.ivu.elect.business.email.entity.EmailVorgangPlatzhalter;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.person.boundary.PersonendatenDAO;
import de.ivu.elect.business.person.entity.Geschlecht;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.presentation.person.PersonendatenFormatter;
import de.ivu.elect.util.ElectRandom;

public class EmailCreate extends AbstractEmailCreate {

  @Inject
  transient EmailLayoutDAO emailLayoutDao;

  @Inject
  transient PersonendatenDAO personendatenDao;

  @Inject
  private transient Messages messages;

  @Inject
  private transient PersonendatenFormatter personendatenFormatter;

  @Inject
  private transient FileExchange fileExchange;

  @Inject
  private transient DateiDAO dateiDAO;

  public EmailCreate() {
    super();
  }

  public void createEmailsZuEmailVorgang(EmailVorgang emailVorgang) throws IOException {
    if (emailVorgang.getTyp().hasEmpfaengerAdresseManuell()) {
      if (StringUtils.isNotBlank(emailVorgang.getEmpfaengerAdresseManuell())) {
        Email email = createEmail(emailVorgang);
        email.setEmpfaenger(emailVorgang.getEmpfaengerAdresseManuell());
        email.setInhalt(konstruiereInhaltAusLayoutUndErsetztenPlatzhaltern(emailVorgang, createMusterPersonendaten()));

        save(email);

        createEmailAnhaenge(email, emailVorgang);
      }
    } else if (emailVorgang.hasEmpfaengerPersonendaten()) {
      for (Personendaten personendaten : emailVorgang.getEmpfaengerPersonendaten()) {
        Personendaten personendatenAttached = personendatenDao.attach(personendaten);

        if (!personendatenAttached.getEmailAdressenZumVersenden().isEmpty()) {
          Email email = createEmail(emailVorgang);
          email.setPersonendaten(personendatenAttached);
          email.setEmpfaengerAdressen(personendatenAttached.getEmailAdressenZumVersenden());
          email.setInhalt(konstruiereInhaltAusLayoutUndErsetztenPlatzhaltern(emailVorgang, personendaten));

          save(email);

          createEmailAnhaenge(email, emailVorgang);
        }
      }
    }
  }

  private Email createEmail(EmailVorgang emailVorgang) {
    Email email = new Email();
    email.setEmailVorgang(emailVorgang);

    return email;
  }

  private Personendaten createMusterPersonendaten() {
    Personendaten musterPerson = new Personendaten(EmptyCustomData.INSTANCE);
    musterPerson.setFamilienname("Mustermann");
    musterPerson.setAkademischerGradFromList(Arrays.asList("Dr."));
    musterPerson.setTitel("von");

    if (ElectRandom.getRandom().nextDouble() < 0.5) {
      musterPerson.setGeschlecht(Geschlecht.MAENNLICH);
      musterPerson.setRufname("Max");
      musterPerson.setVornamen("Max");
    } else {
      musterPerson.setGeschlecht(Geschlecht.WEIBLICH);
      musterPerson.setRufname("Erika");
      musterPerson.setVornamen("Erika");
    }

    return musterPerson;
  }

  String konstruiereInhaltAusLayoutUndErsetztenPlatzhaltern(EmailVorgang emailVorgang, Personendaten personendaten) {
    String inhaltMitErsetztenPlatzhaltern = ersetzePlatzhalterInEmailVorgang(emailVorgang.getInhalt(), personendaten, getPersonendatenFormatter());

    return ersetzePlatzhalterInEmailLayout(emailVorgang.getEmailLayout(), inhaltMitErsetztenPlatzhaltern);
  }

  public String ersetzePlatzhalterInEmailVorgang(String inhaltMitPlatzhaltern, Personendaten personendaten, PersonendatenFormatter personendatenFormatter) {
    return EmailVorgangPlatzhalter.ersetzeAllePlatzhalter(inhaltMitPlatzhaltern, personendaten, personendatenFormatter);
  }

  String ersetzePlatzhalterInEmailLayout(EmailLayout emailLayout, String ersetzung) {
    if (emailLayout == null) {
      return ersetzung;
    }

    String platzhalter = EmailVorgang.EMAIL_LAYOUT_INHALT_PLATZHALTER;

    return emailLayout.getInhalt().replace(platzhalter, Objects.toString(ersetzung, ""));
  }

  private void createEmailAnhaenge(Email email, EmailVorgang emailVorgang) throws IOException {
    FileFormat fileFormat = new FileFormat("file.format.email.anhang.default", FileType.ALL);

    for (UploadedFile uploadedFile : emailVorgang.getUploadedFiles()) {
      DateiFileNames emailVorgangAnhangFileNames = new EmailVorgangAnhangFileNames(messages, uploadedFile);

      Datei datei = fileExchange.speichereDateiAufServerUndCreateDatei(uploadedFile.getInputStream(), fileFormat, emailVorgangAnhangFileNames, emailVorgang.getMandant(), emailVorgang.getWahltermin(),
          emailVorgang.getWahl(), ServerFileType.EMAIL_ANHANG);
      datei.setMimeType(uploadedFile.getContentType());
      datei.addEmail(email);

      dateiDAO.persist(datei);
    }

    for (DateiExport dateiExport : emailVorgang.getAngehaengteDateiExporte()) {
      Datei dateiAttached = dateiDAO.attach(dateiExport.getDatei());
      dateiAttached.addEmail(email);
    }
  }

  protected Messages getMessages() {
    return messages;
  }

  protected PersonendatenFormatter getPersonendatenFormatter() {
    return personendatenFormatter;
  }
}
