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

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.boundary.RolleExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleByNameComparator;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;
import de.ivu.elect.business.wahl.entity.WahlOderWahlterminEinsehenRolleProperty;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.mandant.MandantSessionSelect;


import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

public class WahlOderWahlterminSecurityViewFormBuilder implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient RolleExtendedDAO rolleDao;

  @Inject
  private transient Messages messages;

  @Inject
  private transient MandantSessionSelect mandantSessionSelect;

  public WahlOderWahlterminSecurityViewFormBuilder() {
    super();
  }

  public void addSecurityProperties(FormBuilder formBuilder, WahlOderWahltermin wahlOderWahltermin, boolean readonly) {
    // ELECT-4228 Rolle zum Einsehen einer Wahl
    List<Rolle> alleRollenInDb = rolleDao.findByAll(wahlOderWahltermin.getMandant());

    // Nur Rollen, die bereits Wahlen zugeordnet sind, oder keine Rechte haben
    List<Rolle> alleRollen = alleRollenInDb.stream()
        .filter(r -> r.isWahlRolle() || r.isFachlicheRolle() && r.getRecht().isEmpty())
        .sorted(new RolleByNameComparator())
        .collect(Collectors.toList());

    String noSelectionLabelKey = "wahl.edit.rolle.keine";

    List<Rolle> einsehenRollen = new ArrayList<>(alleRollen);

    if (wahlOderWahltermin.isPersistent()) {
      String rollenNameEinsehen = "";

      if (isNotBlank(wahlOderWahltermin.getName())) {
        rollenNameEinsehen = wahlOderWahltermin.getName() + " " + messages.getMessageForMessageKey("wahl.einsehen.recht.suffix");
      }

      if (wahlOderWahltermin.getEinsehenRolle() == null) {
        addRolleWennNichtVorhanden(einsehenRollen, rollenNameEinsehen);
      }

      if (isNotBlank(rollenNameEinsehen)) {
        final String rollenName = rollenNameEinsehen;
        einsehenRollen.sort((u, v) -> {
          if (rollenName.equalsIgnoreCase(u.getName())) {
            return -1;
          }
          if (rollenName.equalsIgnoreCase(v.getName())) {
            return 1;
          }
          return 0;
        });
      }

    }
    formBuilder.addProperty(new WahlOderWahlterminEinsehenRolleProperty(wahlOderWahltermin, einsehenRollen,
        messages.getMessageForMessageKey(noSelectionLabelKey))).withReadonly(readonly);
  }

  private void addRolleWennNichtVorhanden(List<Rolle> rollen, String rollenName) {
    if (isBlank(rollenName)) {
      return;
    }

    for (Rolle rolle : rollen) {
      if (rolle.getName().equalsIgnoreCase(rollenName)) {
        return; // Rolle vorhanden
      }
    }

    Rolle rolle = new Rolle();
    rolle.setName(rollenName);
    rolle.setBeschreibung(messages.getMessageForMessageKey("wahl.recht.automatisch.erstellt"));
    rollen.add(0, rolle);
  }
}
