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

import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.RolleExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.Nachricht;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtConstants;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtEmpfaengerGruppeArtAutoUpdateProperty;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtEmpfaengerRollePickListProperty;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtProperties;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtSenderProperty;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleMeta;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.jee.presentation.dynamicform.PropertyType;
import de.ivu.elect.presentation.ViewFormBuilder;
import de.ivu.elect.presentation.mandant.MandantSessionSelect;
import de.ivu.elect.presentation.person.PersonendatenFormatter;

public class NachrichtViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient BenutzerExtendedDAO benutzerDao;

  @Inject
  private transient RolleExtendedDAO rolleDao;

  @Inject
  private transient RolleMeta rolleMeta;

  @Inject
  private transient PersonendatenFormatter personendatenFormatter;

  @Inject
  private transient MandantSessionSelect mandantSessionSelect;

  public NachrichtViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Nachricht nachricht) {
    addProperties(formBuilder, nachricht, false);
  }

  public void addProperties(FormBuilder formBuilder, Nachricht nachricht, boolean readonly) {
    if (nachricht.hasUrspruenglicheNachricht()) {
      Nachricht urspruenglicheNachricht = nachricht.getUrspruenglicheNachricht();
      NachrichtProperties urspruenglicheNachrichtProperties = urspruenglicheNachricht.getProperties();

      formBuilder.addSeparator(NachrichtConstants.MESSAGE_KEY_URSPRUENGLICHE_NACHRICHT_ID_EINZAHL);
      formBuilder.addProperty(new NachrichtSenderProperty(urspruenglicheNachricht, benutzerDao, personendatenFormatter)).readonly();
      formBuilder.addProperty(urspruenglicheNachrichtProperties.getZeitpunktProperty()).readonly();
      formBuilder.addProperty(urspruenglicheNachrichtProperties.getTextProperty()).readonly();

      formBuilder.addSeparator("entity.einzahl.NACHRICHT.ANTWORT_NACHRICHT");
    }

    NachrichtProperties nachrichtProperties = nachricht.getProperties();

    if (nachricht.isPersistent()) {
      formBuilder.addProperty(new NachrichtSenderProperty(nachricht, benutzerDao, personendatenFormatter)).withReadonly(true);
      formBuilder.addProperty(nachrichtProperties.getZeitpunktProperty()).withReadonly(true);
    }

    formBuilder.addProperty(nachrichtProperties.getTextProperty()).withType(PropertyType.INPUT_TEXTAREA)
        .withStyleClass("ui-inputtextarea-large").withReadonly(readonly);

    if (!nachricht.hasUrspruenglicheNachricht()) {
      Property empfaengerGruppeArtProperty = new NachrichtEmpfaengerGruppeArtAutoUpdateProperty(nachricht);
      formBuilder.addProperty(empfaengerGruppeArtProperty).readonly();

      if (!nachricht.isPersistent() || nachricht.hasEmpfaengerRollen()) {
        formBuilder.addProperty(new NachrichtEmpfaengerRollePickListProperty(nachricht, rolleMeta, rolleDao.findByAll(mandantSessionSelect.getMandant()/*TODO ELECT-7923 durch Mandanten der Nachricht ersetzen */)))
            .withObservingProperty(empfaengerGruppeArtProperty).withReadonly(readonly);
      }
    }
  }
}
