package de.ivu.elect.presentation.benutzerverwaltung;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import javax.annotation.Nullable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.benutzerverwaltung.boundary.AngemeldeteBenutzer;
import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerEinsatzortExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerEinsatzort;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerEinsatzortPK;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.AbstractElectView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.security.LoginGewuenschteSeite;

@Named
@RequestScoped
@View(viewId = BenutzereinsatzortFestlegenView.VIEW_ID, useCase = UseCasePermission.ANWENDUNG_BENUTZEN)
public class BenutzereinsatzortFestlegenView extends AbstractElectView {

  public static final String COMPONENT_NAME = "benutzereinsatzortFestlegenView";

  public static final String VIEW_ID = "/benutzerverwaltung/benutzereinsatzort-festlegen.xhtml";

  private static final long serialVersionUID = 1L;

  @Inject
  private transient BenutzerEinsatzortExtendedDAO benutzerEinsatzortExtendedDAO;

  @Nullable
  private BenutzerEinsatzortPK benutzerEinsatzortPK;

  @Inject
  private transient AngemeldeteBenutzer angemeldeteBenutzer;

  @Inject
  private transient LoginGewuenschteSeite loginGewuenschteSeite;

  @Redirect
  public String save() {
    BenutzerEinsatzort benutzerEinsatzort = getBenutzerEinsatzort();
    if (benutzerEinsatzort != null) {
      getPrincipal().setzeBenuterEinsatzort(benutzerEinsatzort.getPk());
      angemeldeteBenutzer.setzeBenutzereinsatzort(getPrincipal().getSessionId(), benutzerEinsatzort.getName());
      addInfoMessage("benutzer.einsatzort.gesetzt", benutzerEinsatzort.getName());
      return loginGewuenschteSeite.getStartViewId();
    }

    return getStartViewId();
  }

  @Nullable
  @PreConditionCheck
  public String checkPreCondition() {

    if (getBenutzerEinsatzorte().isEmpty()) {
      return getStartViewId();
    }
    return null;
  }

  @Nullable
  public BenutzerEinsatzort getBenutzerEinsatzort() {
    if (benutzerEinsatzortPK == null) {
      return null;
    }
    return benutzerEinsatzortExtendedDAO.findByPrimaryKey(benutzerEinsatzortPK);
  }

  public void setBenutzerEinsatzort(BenutzerEinsatzort benutzerEinsatzort) {
    if (benutzerEinsatzort == null) {
      this.benutzerEinsatzortPK = null;
    } else {
      this.benutzerEinsatzortPK = benutzerEinsatzort.getPk();
    }
  }

  public List<BenutzerEinsatzort> getBenutzerEinsatzorte() {
    Mandant mandant = getPrincipal().getMandant();
    if (mandant == null) {
      return Collections.emptyList();
    }
    return benutzerEinsatzortExtendedDAO.findByAll(mandant).stream().sorted(Comparator.comparing(BenutzerEinsatzort::getName)).collect(Collectors.toList());
  }
}
