
package de.ivu.elect.business.security.entity;

import java.util.Collection;

import de.ivu.elect.business.benutzerverwaltung.boundary.PermissionService;
import de.ivu.elect.business.mandant.entity.MandantArt;
import de.ivu.elect.business.security.UseCasePermission;


import static de.ivu.elect.business.security.UseCasePermission.ANWENDUNG_BENUTZEN;
import static de.ivu.elect.business.security.UseCasePermission.BENUTZER_PARAMETER_EDIT;
import static de.ivu.elect.business.security.UseCasePermission.BENUTZER_PARAMETER_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.BRIEFWAHLTISCH_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.PERSONENREGISTER_PERSON_MIT_SPERRMERKMAL_LESEN;
import static de.ivu.elect.business.security.UseCasePermission.RESERVEPOOL_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.STANDORT_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.TFA_SECRET_VERWALTEN;
import static de.ivu.elect.business.security.UseCasePermission.WAHLHELFER_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.WAHLLOKAL_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.WAHLTERMIN_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.WAHLTERMIN_ZUR_BEARBEITUNG_AUSWAEHLEN;
import static de.ivu.elect.business.security.UseCasePermission.WAHL_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.WAHL_ZUR_BEARBEITUNG_AUSWAEHLEN;
import static java.util.Arrays.asList;

public interface RolleTemplate {

  String getRolleName();

  String getRolleBeschreibung();

  Collection<UseCasePermission> getRechte(PermissionService permissionService);

  // ELECTMUC-1493
  Collection<UseCasePermission> ROLLE_TEMPLATE_DEFAULT_EXCLUDES = asList( //
      PERSONENREGISTER_PERSON_MIT_SPERRMERKMAL_LESEN);

  // Die Rolle 'Anwender' ist nicht im Konzept enthalten. Sie enthält aber alle Rechte, die jede Rolle gemeinsam hat.
  Collection<UseCasePermission> ROLLE_TEMPLATE_DEFAULT_INCLUDES = asList( //
      ANWENDUNG_BENUTZEN, //
      TFA_SECRET_VERWALTEN, //
      BENUTZER_PARAMETER_EDIT,
      BENUTZER_PARAMETER_SEARCH, //
      WAHL_SEARCH, WAHL_ZUR_BEARBEITUNG_AUSWAEHLEN, //
      WAHLTERMIN_SEARCH, WAHLTERMIN_ZUR_BEARBEITUNG_AUSWAEHLEN, //
      GEBIET_SEARCH, //
      // NOTE, dass WOS spezifische Rechte beim Anlegen herausgefiltert werden!
      WAHLLOKAL_SEARCH, BRIEFWAHLTISCH_SEARCH, RESERVEPOOL_SEARCH, //
      STANDORT_SEARCH, //
      WAHLHELFER_SEARCH);

  RolleTemplate ADMIN = new RolleTemplate() { // COMMON

    @Override
    public String getRolleName() {
      return "Administrator";
    }

    @Override
    public String getRolleBeschreibung() {
      return "Administrator";
    }

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      return permissionService.getAvailablePermissionsForCurrentCustomer(MandantArt.OHNE_MANDANT);
    }
  };

  RolleTemplate ANWENDER = new RolleTemplate() { // COMMON

    @Override
    public String getRolleName() {
      return "Benutzer";
    }

    @Override
    public String getRolleBeschreibung() {
      return "Minimale Rechte zur Verwendung der Anwendung";
    }

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      return asList( //
          ANWENDUNG_BENUTZEN, //
          BENUTZER_PARAMETER_EDIT,
          BENUTZER_PARAMETER_SEARCH, //
          WAHL_SEARCH, WAHL_ZUR_BEARBEITUNG_AUSWAEHLEN, //
          WAHLTERMIN_SEARCH, WAHLTERMIN_ZUR_BEARBEITUNG_AUSWAEHLEN, //
          GEBIET_SEARCH);
    }
  };
}
