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

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.control.EntityMitWurzelgebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.GebietConstants;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahl.boundary.WahlterminSessionSelect;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;
import de.ivu.elect.presentation.gebietsbaum.GebietCreateView;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;

public abstract class AbstractGebietCreateMenuItemEntry extends AbstractGebietMenuItemEntry {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlterminSessionSelect wahlterminSelect;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  public AbstractGebietCreateMenuItemEntry() {
    super();
  }

  @Override
  protected UseCasePermission getUseCasePermission() {
    return UseCasePermission.GEBIET_CREATE;
  }

  @Override
  protected AbstractGebietSecurity getGebietSecurity() {
    return getBearbeitenGebietSecurity();
  }

  @Override
  public boolean isDisabledInternal() {
    // Cf. ReservepoolCreateMenuItemEntry#isDisabledInternal!
    return !isGebietCreatePossible();
  }

  @Override
  public String getTargetViewId() {
    return GebietCreateView.VIEW_ID;
  }

  @Override
  protected String getLabel() {
    return getMessage(getLabelKey(), getMessage(GebietConstants.MESSAGE_KEY_ENTITY_EINZAHL));
  }

  @Override
  public String getLabelKey() {
    return "entity.create.menu.item.label";
  }

  @Override
  public String getIcon() {
    return getIcons().getIconCreate();
  }

  protected boolean isGebietCreatePossible() {
    return isWahlOderWahlterminSelected() && !isBezirkSelected() && (isGebietSelected() || !isWurzelGebietVorhanden());
  }

  // ELECT-8130
  private boolean isWurzelGebietVorhanden() {
    WahlOderWahltermin wahlOderWahltermin = getWahlOderWahltermin();
    if (wahlOderWahltermin == null) {
      return false;
    }

    return wahlOderWahltermin.isWurzelgebietVorhanden(EntityMitWurzelgebietDAO.fromDao(gebietExtendedDAO));
  }

  protected WahlOderWahltermin getWahlOderWahltermin() {
    return wahlterminSelect.getEntity();
  }

  protected boolean isWahlOderWahlterminSelected() {
    return wahlterminSelect.isSelected();
  }

  protected boolean isBezirkSelected() {
    if (isGebietSelected()) {
      return !getSelectedGebiet().getGebietsart().getBezirksart().isKeine();
    }

    return false;
  }
}
