package de.ivu.elect.exchange.email;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.email.boundary.EmailLayoutDAO;
import de.ivu.elect.business.email.boundary.EmailVorlageDAO;
import de.ivu.elect.business.email.control.EmailLayoutCreate;
import de.ivu.elect.business.email.entity.EmailLayout;
import de.ivu.elect.business.email.entity.EmailLayoutVerwendungType;
import de.ivu.elect.business.email.entity.EmailVorlage;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import java.util.List;

public abstract class AbstractDefaultEmailVorlageMapper<T extends ExchangeEmailVorlageDTO> implements EmailVorlageMapper {

  public static final String FORMAT_NAME = "file.format.email.vorlage.default";

  private static final Logger LOG = LoggerFactory.getLogger(AbstractDefaultEmailVorlageMapper.class);

  @Inject
  private transient EmailVorlageDAO emailVorlageDAO;

  @Inject
  private transient EmailLayoutDAO emailLayoutDao;

  public AbstractDefaultEmailVorlageMapper() {
    super();
  }

  protected abstract T createEntity();

  protected T mappeEntity(EmailVorlage from) {
    T to = createEntity();
    to.setBezeichnung(from.getBezeichnung());
    to.setInhalt(from.getInhalt());
    setEmailLayout(from, to);
    return to;
  }

  private void setEmailLayout(EmailVorlage from, T to) {
    EmailLayout emailLayout = getEmailLayoutWithAttachedEmailVorlage(from);
    if (emailLayout != null) {
      to.setEmailLayoutBezeichnung(emailLayout.getBezeichnung());
      to.setEmailLayoutVerwendungTyp(emailLayout.getVerwendungTyp().name());
      to.setEmailLayoutInhalt(emailLayout.getInhalt());
    }
  }

  private EmailLayout getEmailLayoutWithAttachedEmailVorlage(EmailVorlage from) {
    List<EmailLayout> erzwungeneEmailLayouts = emailLayoutDao.findByVerwendungTyp(EmailLayoutVerwendungType.ERZWUNGEN);
    if (erzwungeneEmailLayouts.size() > 0) {
      // NOTE: Existiert ein erzwungenes E-Mail-Layout, so wird dieses antselle des tatsächlich zugewiesenen exportiert
      return erzwungeneEmailLayouts.get(0);
    }
    return emailVorlageDAO.findByPrimaryKey(from.getPk()).getEmailLayout();
  }

  protected EmailVorlage mappeEntity(T from) {
    EmailVorlage to = new EmailVorlage();
    to.setBezeichnung(from.getBezeichnung());
    to.setInhalt(from.getInhalt());
    setEmailLayout(from, to);
    return to;
  }

  private void setEmailLayout(T from, EmailVorlage to) {
    if (StringUtils.isBlank(from.getEmailLayoutBezeichnung())) {
      return;
    }
    to.setEmailLayout(mappeEmailLayout(from));
  }

  private EmailLayout mappeEmailLayout(T from) {
    EmailLayout emailLayout = new EmailLayout();
    emailLayout.setBezeichnung(from.getEmailLayoutBezeichnung());
    if (!StringUtils.isBlank(from.getEmailLayoutVerwendungTyp())) {
      emailLayout.setVerwendungTyp(EmailLayoutVerwendungType.valueOf(from.getEmailLayoutVerwendungTyp()));
    }
    emailLayout.setInhalt(from.getEmailLayoutInhalt());
    return emailLayout;
  }

  @Override
  public FileFormat getFileFormat() {
    return new FileFormat(FORMAT_NAME, getFileType());
  }

  protected abstract FileType getFileType();
}
