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

import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.entity.*;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.ViewFormBuilder;
import de.ivu.elect.presentation.benutzerverwaltung.PermissionServiceHelper;

/**
 *  on 08.02.2017.
 */
public abstract class AbstractEntityMitRollenViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  private final Map<RolleArt, RollePickListProperty> rollenPropertiesNachArt = new EnumMap<>(RolleArt.class);

  @Inject
  private transient PermissionServiceHelper permissionServiceHelper;

  @Inject
  private transient RolleMeta rolleMeta;


  protected void addRolleProperties(FormBuilder formBuilder, Set<Rolle> rolles, Mandant mandant) {
    rollenPropertiesNachArt.clear();

    Map<RolleArt, List<Rolle>> zugeordneteRollenNachArt = new EnumMap<>(RolleArt.class);
    Map<RolleArt, List<Rolle>> verfuegbareRollenNachArt = new EnumMap<>(RolleArt.class);

    for (RolleArt rolleArt : RolleArt.values()) {
      zugeordneteRollenNachArt.put(rolleArt, new ArrayList<>());
      verfuegbareRollenNachArt.put(rolleArt, new ArrayList<>());
    }

    for (Rolle rolle : getPossibleRolles()) {
      verfuegbareRollenNachArt.get(rolle.getRolleArt()).add(rolle);
    }

    for (Rolle rolle : rolles) {
      zugeordneteRollenNachArt.get(rolle.getRolleArt()).add(rolle);
    }

    boolean gruppenUebernehmen = isGruppenUebernehmen(mandant);
    for (RolleArt rolleArt : RolleArt.values()) {
      if (!verfuegbareRollenNachArt.get(rolleArt).isEmpty()) {
        RollePickListProperty property = new RollePickListProperty(rolleMeta, verfuegbareRollenNachArt.get(rolleArt), zugeordneteRollenNachArt.get(rolleArt), rolleArt);
        formBuilder.addProperty(property).withReadonly(gruppenUebernehmen); // Wenn der LoginService die Rollen liefert, dann keine Auswahl von Rollen anbieten => deaktivieren
        if (!gruppenUebernehmen) {
          rollenPropertiesNachArt.put(rolleArt, property);
        }
      }
    }
  }

  protected abstract boolean isGruppenUebernehmen(Mandant mandant);

  protected Set<Rolle> getPossibleRolles() {
    // ELECT-580
    return permissionServiceHelper.getAlleRollenDieVomPrincipalZugewiesenWerdenKoennen();
  }

  public Map<RolleArt, RollePickListProperty> getRollenPropertiesNachArt() {
    return rollenPropertiesNachArt;
  }

}
