
package de.ivu.elect.business.gebietsbaum.boundary;

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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
import de.ivu.elect.business.wahl.boundary.WahlterminSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.FacesMessageUtil;
import de.ivu.elect.presentation.mandant.MandantSessionSelect;
import de.ivu.elect.presentation.security.GebietSecurity;

@Specializes
public class SecurityGebietSessionSelect extends GebietSessionSelect {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlSessionSelector wahlSelect;

  @Inject
  private transient WahlterminSessionSelect wahlterminSelect;

  @Inject
  private transient GebietSecurity gebietSecurity;

  @Inject
  private transient MandantSessionSelect mandantSessionSelect;

  public SecurityGebietSessionSelect() {
    super();
  }

  protected boolean isWahlterminNotwendig() {
    return true;
  }

  protected boolean isWahlNotwendig() {
    return false;
  }

  @Override
  public boolean isSetzenErlaubt(Gebiet template) {
    Gebiet gebiet = attach(template);

    if (!super.isSetzenErlaubt(gebiet)) {
      return false;
    }

    if (isWahlSelected()) {
      if (!getSelectedWahl().equals(gebiet.getWahl())) {
        FacesMessageUtil.addErrorMessage("gebiet.auswaehlen.nicht.zur.wahl");

        return false;
      }
    }

    if (isWahlterminSelected()) {
      if (!getSelectedWahltermin().equals(gebiet.getWahltermin())) {
        FacesMessageUtil.addErrorMessage("gebiet.auswaehlen.nicht.zum.wahltermin");

        return false;
      }
    }

    if (isWahlNotwendig() && !isWahlSelected()) {
      FacesMessageUtil.addErrorMessage("gebiet.auswaehlen.nicht.moeglich.keine.wahl");

      return false;
    }

    if (isWahlterminNotwendig() && !isWahlterminSelected()) {
      FacesMessageUtil.addErrorMessage("gebiet.auswaehlen.nicht.moeglich.kein.wahlermin");

      return false;
    }

    if (mandantSessionSelect.getMandant() != null && !mandantSessionSelect.getMandant().equals(gebiet.getMandant())) {
      FacesMessageUtil.addErrorMessage("gebiet.auswaehlen.nicht.moeglich.mandant.falsch");

      return false;
    }

    boolean rechtVorhanden = gebietSecurity.getEinsehenGebietSecurity().isRechtVorhanden(gebiet);

    if (!rechtVorhanden) {
      FacesMessageUtil.addErrorMessage("gebiet.auswaehlen.kein.recht", "gebiet.auswaehlen.kein.recht", gebiet.getName());
    }

    return rechtVorhanden;
  }

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

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

  private boolean isWahlterminSelected() {
    return wahlterminSelect.isSelected();
  }

  private Wahltermin getSelectedWahltermin() {
    return wahlterminSelect.getEntity();
  }
}
