
package de.ivu.elect.presentation.protokollierung;

import static java.util.Objects.nonNull;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.protokollierung.entity.EntityTechnicalNamePkNode;
import de.ivu.elect.business.protokollierung.entity.ProtokollEintrag;
import de.ivu.elect.jee.entity.Entity;
import de.ivu.elect.jee.entity.EntityFachlichAbhaengigNode;
import de.ivu.elect.jee.entity.EntityTechnicalNamePk;
import de.ivu.elect.jee.entity.ExtendedDAO;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@OnlineHilfeId("298")
@Named(AbstractProtokollEintragSearchView.COMPONENT_NAME)
public class ProtokollEintragSearchView extends AbstractProtokollEintragSearchView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ExtendedDAO extendedDAO;

  public ProtokollEintragSearchView() {
    super();
  }

  @PreConditionCheck
  public String checkPrecondition() {
    if (getSearchParameters().getEntityTechnicalNamePk() == null) {
      return getStartViewId();
    }

    return null;
  }

  @Override
  public void presetSearchParameters() {
    // nichts zu tun
  }

  @Redirect
  public String showWithEntity(Entity< ? , ? > unattachedEntity) {
    Entity< ? , ? > entity = attachEntity(unattachedEntity);

    if (entity == null) {
      return FacesContextUtil.getCurrentViewId();
    }

    presetSearchParameters();

    searchParameters.setEntityTechnicalNamePk(new EntityTechnicalNamePk(entity));

    List<EntityTechnicalNamePkNode> children = new ArrayList<>();

    for (EntityFachlichAbhaengigNode entityFachlichAbhaengigNode : entity.getFachlichAbhaengigeEntitaeten()) {
      children.add(new EntityTechnicalNamePkNode(entityFachlichAbhaengigNode));
    }

    searchParameters.setChildren(children);

    return VIEW_ID;
  }

  private Entity< ? , ? > attachEntity(Entity< ? , ? > unattachedEntity) {
    return (Entity< ? , ? >) extendedDAO.getEntityManager().find(unattachedEntity.getEntityClass(), unattachedEntity.getId());
  }

  public String getEntityNameLokalisiert() {
    return getMessage(getSearchParameters().getEntityTechnicalNamePk().getTechnicalName());
  }

  public Object getPk() {
    Long id = getSearchParameters().getEntityTechnicalNamePk().getId();

    if (nonNull(id)) {
      return id.toString();
    }

    return id;
  }

  @Override
  public boolean isBtnResetRendered() {
    // NOTE, dass momentan keine Suchparameter angezeigt werden, aber der 'Zurück'-Button benötigt wird, um auf die
    // vorherige Seite zurück zu kommen.
    return false;
  }

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

  @Override
  protected AbstractGebietSecurityFilter<ProtokollEintrag> getGebietSecurityFilter() {
    return KEIN_GEBIET_SECURITY_FILTER;
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    // nichts zu tun
  }
}
