
package de.ivu.elect.presentation;

import java.util.Collection;

import javax.annotation.Nullable;
import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerEinsatzort;
import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.EntityMitGebiet;
import de.ivu.elect.business.gebietsbaum.entity.EntityMitGebieten;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
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.presentation.security.StartViewResolver;
import de.ivu.elect.jee.presentation.view.AbstractView;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.mandant.MandantSessionSelect;
import de.ivu.elect.presentation.security.GebietSecurity;

public abstract class AbstractElectView extends AbstractView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietSecurity gebietSecurity;

  @Inject
  private transient GebietSessionSelect gebietSelect;

  @Inject
  private transient StartViewResolver startViewResolver;

  @Inject
  private transient WahlterminSessionSelect wahlterminSessionSelect;

  @Inject
  private transient WahlSessionSelector wahlSessionSelector;

  @Inject
  private transient ElectCommonPrincipal principal;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  @Inject
  private transient MandantSessionSelect mandantSessionSelect;

  protected AbstractElectView() {
    super();
  }

  @Nullable
  protected Benutzer getSelectedBenutzer() {
    return getPrincipal().getLogin();
  }

  protected String getSelectedBenutzerKennung() {
    return getPrincipal().getBenutzerKennung();
  }

  @Nullable
  protected BenutzerEinsatzort getSelectedBenutzerEinsatzort() {
    return getPrincipal().getBenutzerEinsatzort();
  }

  protected String getSelectedBenutzerNameFormatted() {
    return getPrincipal().getFormattedName();
  }

  protected boolean hasPermission(UseCasePermission permission) {
    return getPrincipal().hasUseCasePermission(permission);
  }

  protected ElectCommonPrincipal getPrincipal() {
    return principal;
  }

  public boolean isBearbeitenRechtAufAktuellemGebietVorhanden() {
    return gebietSecurity.getBearbeitenGebietSecurity().isRechtVorhanden(gebietSelect.getEntity());
  }

  public boolean isBearbeitenRechtAufGebietVorhanden(Gebiet gebiet) {
    return gebietSecurity.getBearbeitenGebietSecurity().isRechtVorhanden(gebiet);
  }

  public boolean isBearbeitenRechtAufGebietenVorhanden(Collection<Gebiet> gebiete) {
    return gebietSecurity.getBearbeitenGebietSecurity().isRechtVorhanden(gebiete);
  }

  public boolean isBearbeitenRechtAufEntityMitGebietVorhanden(EntityMitGebiet entityMitGebiet) {
    return gebietSecurity.getBearbeitenGebietSecurity().isRechtVorhanden(entityMitGebiet);
  }

  public boolean isBearbeitenRechtAufEntityMitGebietenVorhanden(EntityMitGebieten entityMitGebieten) {
    return gebietSecurity.getBearbeitenGebietSecurity().isRechtVorhanden(entityMitGebieten);
  }

  protected String getStartViewId() {
    return startViewResolver.getStartViewId();
  }

  protected boolean isWahlterminSelected() {
    return wahlterminSessionSelect.isSelected();
  }

  protected Wahltermin getSelectedWahltermin() {
    return wahlterminSessionSelect.getEntity();
  }

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

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

  public boolean isGebietSelected() {
    return gebietSelect.isSelected();
  }

  protected Gebiet getSelectedGebiet() {
    return gebietSelect.getEntity();
  }

  protected String getSelectedGebietNameFormatted() {
    return formatGebietName(getSelectedGebiet());
  }

  protected String formatGebietName(Gebiet gebiet) {
    return gebietNummerFormatter.getDarstellung(gebiet);
  }

  protected Mandant getMandant() {
    return mandantSessionSelect.getMandant();
  }
}
