package de.ivu.elect.presentation.email.form;

import de.ivu.elect.business.email.boundary.EmailVorlageExtendedDAO;
import de.ivu.elect.business.email.entity.*;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.EntityConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractSelectOneMenuProperty;
import de.ivu.elect.jee.presentation.dynamicform.AbstractStringProperty;
import de.ivu.elect.presentation.email.EmailLayoutUiVisibility;

import javax.faces.convert.Converter;
import javax.inject.Inject;
import java.io.Serializable;
import java.util.List;

public class EmailVorgangEmailVorlageZuordnenProperties implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient EmailVorlageExtendedDAO emailVorlageDao;

  @Inject
  private transient EmailLayoutUiVisibility emailLayoutUiVisibility;

  private Boolean emailLayoutsVisible = null;

  public EmailVorgangEmailVorlageProperty getEmailVorgangEmailVorlageProperty(EmailVorgang entity, Wahl wahl, Wahltermin wahltermin) {
    List<EmailVorlage> verfuegbareEmailVorlagen;
    if (wahl == null) {
      verfuegbareEmailVorlagen = emailVorlageDao.findByWahlterminOrderByBezeichnung(wahltermin);
    } else {
      verfuegbareEmailVorlagen = emailVorlageDao.findByWahlOrderByBezeichnung(wahl);
    }
    return new EmailVorgangEmailVorlageProperty(entity, verfuegbareEmailVorlagen, null);
  }

  public EmailVorgangEmailVorlageEmailLayoutReadonlyProperty getEmailVorgangEmailVorlageEmailLayoutBezeichnungProperty(EmailVorgang entity) {
    return new EmailVorgangEmailVorlageEmailLayoutReadonlyProperty(entity);
  }

  public class EmailVorgangEmailVorlageProperty extends AbstractSelectOneMenuProperty<EmailVorlage> {

    private final EmailVorgang entity;

    private final List<EmailVorlage> emailVorlagen;

    private final EmailVorlage defaultEmailVorlage;

    public EmailVorgangEmailVorlageProperty(EmailVorgang entity, List<EmailVorlage> emailVorlagen, EmailVorlage defaultEmailVorlage) {
      super();
      this.entity = entity;
      this.emailVorlagen = emailVorlagen;
      this.defaultEmailVorlage = defaultEmailVorlage;
      if (hasDefaultValue()) {
        entity.setEmailVorlage(getDefaultValue());
      }
    }

    @Override
    public String getDefaultLabel() {
      return getMessage(EmailVorlageConstants.MESSAGE_KEY_ENTITY_EINZAHL);
    }

    @Override
    public boolean getDefaultRequired() {
      return false;
    }

    @Override
    public Converter getDefaultConverter() {
      return EntityConverter.getInstance();
    }

    @Override
    public EmailVorlage getValue() {
      return entity.getEmailVorlage();
    }

    @Override
    public void setValue(EmailVorlage value) {
      entity.setEmailVorlage(value);
    }

    @Override
    public List<EmailVorlage> getValues() {
      return emailVorlagen;
    }

    @Override
    public String getItemLabel(EmailVorlage item) {
      if (item == null) {
        return "";
      }
      return item.getBezeichnung();
    }

    @Override
    public boolean hasNoSelectionItem() {
      return true; // EmailVorlage ist optional
    }

    @Override
    public EmailVorlage getDefaultValue() {
      return defaultEmailVorlage;
    }
  }

  public class EmailVorgangEmailVorlageEmailLayoutReadonlyProperty extends AbstractStringProperty {

    private final EmailVorgang entity;

    public EmailVorgangEmailVorlageEmailLayoutReadonlyProperty(EmailVorgang entity) {
      super();
      this.entity = entity;
    }

    @Override
    public String getValue() {
      if (entity.getEmailVorlage() == null || entity.getEmailVorlage().getEmailLayout() == null) {
        return null;
      }
      return entity.getEmailVorlage().getEmailLayout().getBezeichnung();
    }

    @Override
    public void setValue(String s) {
      // Do nothing
    }

    @Override
    public int getDefaultMaxLength() {
      return 255;
    }

    @Override
    public String getDefaultLabel() {
      return getMessage(EmailLayoutConstants.MESSAGE_KEY_ENTITY_EINZAHL);
    }

    @Override
    public boolean getDefaultRequired() {
      return false;
    }

    @Override
    public boolean isReadonly() {
      return true;
    }

    @Override
    public boolean isVisible() {
      return super.isVisible() && isEmailLayoutsVisible();
    }

    private boolean isEmailLayoutsVisible() {
      if (emailLayoutsVisible == null) {
        emailLayoutsVisible = emailLayoutUiVisibility.isEmailLayoutAuswahlVisible();
      }
      return emailLayoutsVisible;
    }
  }
}