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

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

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


import static de.ivu.elect.business.security.UseCasePermission.*;
import static java.util.Arrays.asList;

public enum DefaultRollen implements RolleTemplate {

  AUSKUNFTBERECHTIGTER { // ELECT-7453

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

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

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      Set<UseCasePermission> result = new HashSet<>(asList( //
          UseCasePermission.WAEHLERVERZEICHNIS_EINTRAG_SEARCH, UseCasePermission.WAEHLERVERZEICHNIS_EINTRAG_SEARCH_ALL, UseCasePermission.WAEHLERVERZEICHNIS_EINTRAG_ANZEIGEN,
          UseCasePermission.WAHLHELFER_SEARCH, UseCasePermission.WAHLHELFER_ANZEIGEN //
      ));

      result.addAll(ROLLE_TEMPLATE_DEFAULT_INCLUDES);
      result.removeAll(ROLLE_TEMPLATE_DEFAULT_EXCLUDES);
      result.removeAll(asList(GEBIET_SEARCH, STANDORT_SEARCH, WAHLLOKAL_SEARCH, BRIEFWAHLTISCH_SEARCH, RESERVEPOOL_SEARCH, WAHL_SEARCH));

      return result;
    }
  },

  ERGEBNISERFASSER { // WAS - Erfassen von Stimmbezirksergebnissen

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

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

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      Set<UseCasePermission> result = new HashSet<>(asList( //
          STIMMEINGABE_ANZEIGEN, STIMMEINGABE_CREATE, STIMMEINGABE_ERGEBNISEINGANGSART_WECHSELN /* ELECTKOM-181 */, //
          WAHL_STATUSUEBERSICHT_ANZEIGEN, DASHBOARD_ANZEIGEN));

      result.addAll(ROLLE_TEMPLATE_DEFAULT_INCLUDES);
      result.removeAll(ROLLE_TEMPLATE_DEFAULT_EXCLUDES);
      result.remove(GEBIET_SEARCH); // ELECT-6843

      return result;
    }
  },

  ERGEBNISERMITTLER { // WAS - Berichtigen von Stimmbezirksergebnissen, Erstellen der Ergebnisdokumente

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

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

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      Set<UseCasePermission> result = new HashSet<>(asList( //
          STIMMEINGABE_CREATE_NACH_GUELTIGEM_ERGEBNISEINGANG, STIMMEINGABE_CREATE_EINGANGSHERKUNFT_IGNORIEREN,
          ERGEBNIS_EDIT, ERGEBNIS_CREATE, ERGEBNIS_DELETE, //
          ERGEBNIS_SEARCH, //
          ERGEBNIS_EXPORTIEREN, //
          ERGEBNISEINGANG_SEARCH, //
          STIMMEINGABE_FEHLER_BESTAETIGEN, //
          NIEDERSCHRIFT_SEARCH, NIEDERSCHRIFT_STATUS_AENDERUNG_CREATE, NIEDERSCHRIFT_STATUS_AENDERUNG_SEARCH, //
          NIEDERSCHRIFT_KORREKTUR_CREATE, NIEDERSCHRIFT_KORREKTUR_SEARCH, //
          ERGEBNIS_STATUSUEBERSICHT_ANZEIGEN, ERGEBNIS_SITZVERTEILUNG_ANZEIGEN, ERGEBNIS_KUMULIERTE_STIMMEN_ANZEIGEN, ERGEBNIS_GRUPPEN_NACH_GEBIETEN_ANZEIGEN, ERGEBNIS_GEWINNER_UNTERLEGENER_ANZEIGEN, //
          ERGEBNIS_KONFLIKT_EDIT, ERGEBNIS_KONFLIKT_CREATE, ERGEBNIS_KONFLIKT_DELETE, ERGEBNIS_KONFLIKT_SEARCH, //
          DOKUMENT_ERZEUGEN_KANDIDATUR_GEWAEHLT_BENACHRICHTIGEN, KANDIDATUR_GEWAEHLT_SEARCH, KANDIDATUR_GEWAEHLT_EXPORTIEREN, //
          DOKUMENT_ERZEUGEN_NIEDERSCHRIFT, DOKUMENT_ERZEUGEN_NIEDERSCHRIFT_WAHLAUSSCHUSS, //
          GRUPPE_EDIT, POLITISCHE_GRUPPE_CREATE, GRUPPE_DELETE, GRUPPE_SEARCH, DASHBOARD_ANZEIGEN, STIMMEINGABE_FORTSCHRITT_GEBIETSBAUM_ANZEIGEN));

      result.addAll(ROLLE_TEMPLATE_DEFAULT_INCLUDES);
      result.removeAll(ROLLE_TEMPLATE_DEFAULT_EXCLUDES);

      return result;
    }
  },

  PRAESENTATION { // WAS

    @Override
    public String getRolleName() {
      return "Präsentationsverwalter";
    }

    @Override
    public String getRolleBeschreibung() {
      return "Verwaltung der Präsentationen";
    }

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      Set<UseCasePermission> result = new HashSet<>(asList( //
          ONLINE_HILFE_ANZEIGEN, ERGEBNIS_KUMULIERTE_STIMMEN_ANZEIGEN, PRAESENTATION_EXPORTIEREN, PRAESENTATION_KONFIGURIEREN, PRAESENTATION_OEFFNEN, PRAESENTATION_INTERNE_BETRACHTEN, PRAESENTATION_STATUSUEBERSICHT_ANZEIGEN,
          INTERNET_KONFIGURATION_EXPORTIEREN, INTERNET_KONFIGURATION_IMPORTIEREN, INTERNET_SEITE_CREATE, INTERNET_SEITE_DELETE, INTERNET_SEITE_EDIT, INTERNET_SEITE_SEARCH, INTERNET_WIDGET_CREATE,
          INTERNET_WIDGET_DELETE, INTERNET_WIDGET_EDIT, INTERNET_WIDGET_SEARCH, DASHBOARD_ANZEIGEN));

      result.addAll(ROLLE_TEMPLATE_DEFAULT_INCLUDES);
      result.removeAll(ROLLE_TEMPLATE_DEFAULT_EXCLUDES);

      return result;
    }
  },

  WAHLHELFEREINTEILER { // WOS

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

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

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      Set<UseCasePermission> result = new HashSet<>(asList( //
          WAHLLOKAL_WAHLHELFER_EINTEILEN, BRIEFWAHLTISCH_WAHLHELFER_EINTEILEN, RESERVEPOOL_WAHLHELFER_EINTEILEN, //
          WAHLHELFEREINSATZ_BULK_CREATE, WAHLHELFER_AUTOMATISCH_ZUORDNEN, //
          WAHLHELFER_SEARCH_KOMPLEX, WAHLHELFER_EDIT, WAHLHELFER_EINSATZSTATUS_EDIT, DASHBOARD_ANZEIGEN));

      result.addAll(ROLLE_TEMPLATE_DEFAULT_INCLUDES);
      result.removeAll(ROLLE_TEMPLATE_DEFAULT_EXCLUDES);

      return result;
    }
  },

  TECHNISCHER_ADMINISTRATOR { // COMMON

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

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

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      Set<UseCasePermission> result = new HashSet<>(asList( //
          KONFIGURATION_SEARCH, KONFIGURATION_DELETE, KONFIGURATION_EDIT, //
          KONFIGURATION_EXPORTIEREN, KONFIGURATION_IMPORTIEREN, //
          BENUTZER_SEARCH, BENUTZER_CREATE, BENUTZER_DELETE, BENUTZER_EDIT, //
          BENUTZER_EXPORTIEREN, BENUTZER_IMPORTIEREN, //
          ROLLE_SEARCH, ROLLE_CREATE, ROLLE_DELETE, ROLLE_EDIT, //
          ROLLE_IMPORTIEREN, ROLLE_EXPORTIEREN, //
          MEMORY_MONITOR_SEARCH, MEMORY_MONITOR_EDIT, MEMORY_GC, MEMORY_HEAP_DUMP, PROTOKOLL_EINTRAG_SEARCH, //
          SYSTEM_LOG_SEARCH, SYSTEM_LOG_DELETE, SYSTEM_LOG_EDIT, DASHBOARD_ANZEIGEN, DASHBOARD_NEWS_ANZEIGEN));

      result.addAll(ROLLE_TEMPLATE_DEFAULT_INCLUDES);
      result.removeAll(ROLLE_TEMPLATE_DEFAULT_EXCLUDES);

      return result;
    }
  },

  WAHLADMINISTRATOR { // COMMON

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

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

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      Set<UseCasePermission> result = new HashSet<>(asList(UseCasePermission.values()));

      result.addAll(ROLLE_TEMPLATE_DEFAULT_INCLUDES);
      result.add(WAHL_FUER_SUBSYSTEME_KONFIGURIEREN);
      result.add(WAHL_FUER_SUBSYSTEME_LOESCHEN);
      result.add(TAG_SEARCH);
      result.add(TAG_CREATE);
      result.add(TAG_DELETE);
      result.add(TAG_EDIT);
      result.add(WAHLHELFER_ANMELDE_STATISTIK_SEARCH);
      result.removeAll(ROLLE_TEMPLATE_DEFAULT_EXCLUDES);

      return result;
    }
  },

  SPERRMERKMALBERECHTIGTER { // COMMON

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

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

    @Override
    public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
      Set<UseCasePermission> result = new HashSet<>();

      result.addAll(ROLLE_TEMPLATE_DEFAULT_INCLUDES);
      result.removeAll(ROLLE_TEMPLATE_DEFAULT_EXCLUDES);

      result.add(UseCasePermission.PERSONENREGISTER_PERSON_MIT_SPERRMERKMAL_LESEN);

      return result;
    }
  };

  private DefaultRollen() {
  }

  // Es ist noch nicht klar, wer dies wirklich darf - aktuell dürfen das nur Wahladministratoren
  private static final List<UseCasePermission> WAS_UNBESTIMMTE_ROLLEN = asList( //
      WAHL_ERGEBNISEINGANGSART_WECHSELN, //
      STIMMEINGABE_IMPORTIEREN, STIMMEINGABE_EXPORTIEREN, STIMMEINGABE_TESTWERTE_FUELLEN, //
      ERGEBNIS_BERECHNUNG_AUSLOESEN, //
      PRAESENTATION_STATUSUEBERSICHT_ANZEIGEN, PRAESENTATION_KONFIGURIEREN, PRAESENTATION_EXPORTIEREN, //
      ANZAHL_WAHLBERECHTIGTE_SEARCH, ANZAHL_WAHLBERECHTIGTE_EDIT, ANZAHL_WAHLBERECHTIGTE_IMPORTIEREN, ANZAHL_WAHLBERECHTIGTE_EXPORTIEREN);
}
