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

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.gebietsbaum.boundary.GebietsarteigenschaftExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.GebietConstants;
import de.ivu.elect.business.gebietsbaum.entity.GebietProperties;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsarteigenschaft;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;

@Specializes
public class CoreGebietViewFormBuilder extends GebietViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlSessionSelect wahlSelect;

  @Inject
  private transient GebietsarteigenschaftExtendedDAO gebietsarteigenschaftDao;

  public CoreGebietViewFormBuilder() {
    super();
  }

  @Override
  protected void addGebietsinformationProperties(FormBuilder formBuilder, Gebiet gebiet, boolean readonly) {
    super.addGebietsinformationProperties(formBuilder, gebiet, readonly);

    GebietProperties gebietsinformationProperties = gebiet.getProperties();

    formBuilder.addProperty(gebietsinformationProperties.getExterneIdProperty()) //
        .withLabel(getMessageByGebietsart(gebiet, "gebiet.edit.externeId.label", getMessage(GebietConstants.MESSAGE_KEY_EXTERNE_ID_EINZAHL))) //
        .withTooltip(getMessageByGebietsart(gebiet, "gebiet.edit.externeId.tooltip")) //
        .withReadonly(readonly || isExterneIdReadOnly(gebiet.getExterneId())) //
        .withVisibleOnPageLoad(isExterneIdVisibleOnPageLoad(gebiet));
  }

  private boolean isExterneIdReadOnly(String externeId) {
    // ELECTKOM-776
    return StringUtils.isNotBlank(externeId) && !hasUseCasePermission(UseCasePermission.GEBIET_EXTERNE_ID_UEBERSCHREIBEN);

  }

  protected boolean isExterneIdVisibleOnPageLoad(Gebiet gebiet) {
    return false;
  }

  @Override
  protected boolean isGebietsartZurAuswahl(Gebiet gebiet, Gebietsart gebietsart) {
    if (isWahlSelected()) {
      for (Gebietsarteigenschaft gebietsarteigenschaft : gebietsarteigenschaftDao.findByWahlart(getSelectedWahl().getWahlart())) {
        if (gebietsarteigenschaft.getGebietsart().equals(gebietsart)) {
          if (gebiet.isPersistent() || hasGebietsartErfassungsgebiet(gebiet)) { // ELECT-4074, ELECTKOM-49
            return gebietsart.getBezirksart().isKeine();
          } else {
            return true;
          }
        }
      }
    }

    return false;
  }

  protected boolean isWahlSelected() {
    return wahlSelect.isSelected();
  }

  protected Wahl getSelectedWahl() {
    return wahlSelect.getEntity();
  }
}
