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

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.datei.control.FileExchange;
import de.ivu.elect.business.email.boundary.EmailLayoutDAO;
import de.ivu.elect.business.email.boundary.EmailVorlageDAO;
import de.ivu.elect.business.email.entity.*;
import de.ivu.elect.business.wahl.boundary.WahlterminDAO;
import de.ivu.elect.business.wahl.control.WahlAttacher;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.background.NotifyOnSuccess;

import javax.inject.Inject;
import java.io.IOException;
import java.util.Date;
import java.util.List;

public class EmailVorgangCreate extends AbstractEmailVorgangCreate {

  @Inject
  private transient EmailLayoutDAO emailLayoutDao;

  @Inject
  private transient EmailVorlageDAO emailVorlageDao;

  @Inject
  private transient WahlAttacher wahlAttacher;

  @Inject
  private transient WahlterminDAO wahlterminDao;

  @Inject
  private transient EmailCreate emailCreate;

  public EmailVorgangCreate() {
    super();
  }

  @NotifyOnSuccess(EmailSendenEvent.class)
  public void save(EmailVorgang emailVorgang, Wahl wahl, Wahltermin wahltermin, Benutzer ersteller) throws IOException {
    emailVorgang.setErstellungszeitpunkt(new Date());
    emailVorgang.setBenutzerkennung(ersteller.getBenutzerkennung());
    emailVorgang.setEmailVorlage(emailVorlageDao.attach(emailVorgang.getEmailVorlage()));
    emailVorgang.setEmailLayout(emailLayoutDao.attach(bestimmeEmailLayout(emailVorgang)));
    emailVorgang.setWahl(wahlAttacher.attach(wahl));
    if (wahltermin == null && wahl != null) {
      wahltermin = wahl.getWahltermin(); // in WAS ist nicht unbedingt ein Wahltermin ausgewählt
    }
    emailVorgang.setWahltermin(wahlterminDao.attach(wahltermin));

    super.save(emailVorgang);

    dao.flush();

    emailCreate.createEmailsZuEmailVorgang(emailVorgang);
  }

  private EmailLayout bestimmeEmailLayout(EmailVorgang emailVorgang) {
    List<EmailLayout> erzwungeneEmailLayouts = emailLayoutDao.findByVerwendungTyp(EmailLayoutVerwendungType.ERZWUNGEN);
    if (!erzwungeneEmailLayouts.isEmpty()) {
      return erzwungeneEmailLayouts.get(0);
    }
    EmailLayout emailLayout = emailVorgang.getEmailLayout();
    if (emailLayout == null && emailVorgang.getEmailVorlage() != null) {
      emailLayout = emailVorgang.getEmailVorlage().getEmailLayout();
    }
    return emailLayout;
  }
}
