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

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

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

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

public enum NlWasRollen implements RolleTemplate {

    INVOER /*Erfasser - erfassen*/ {
        @Override
        public String getRolleName() {
            return "Invoer";
        }

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

        @Override
        public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
            Set<UseCasePermission> result = new HashSet<>(asList(STIMMEINGABE_ANZEIGEN, STIMMEINGABE_CREATE, STIMMEINGABE_FEHLER_BESTAETIGEN, STIMMEINGABE_FORTSCHRITT_GEBIETSBAUM_ANZEIGEN));

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

            return result;
        }
    },
    VERKIEZINGSLEIDER /*Wahlleiter - Wahlrechtliches, 1/2. Eingabe *entscheiden*, Exporte, keine Importe */ {
        @Override
        public String getRolleName() {
            return "Verkiezingsleider";
        }

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

        @Override
        public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
            Set<UseCasePermission> result = new HashSet<>(asList(/*ELECTVAPP-313 STIMMEINGABE_PLAUSI_SEARCH, */BENUTZER_SEARCH, /*, ELECTVAPP-860 aber
            ELECT-11681*/ GEBIET_EDIT,
            ERGEBNIS_STATUSUEBERSICHT_ANZEIGEN,
                    DOKUMENT_ERZEUGEN_GESAMT_ERGEBNIS, SITZE_SEARCH, ERGEBNIS_BERECHNUNG_AUSLOESEN, LISTENKANDIDATUR_SEARCH,
                KANDIDATUR_SEARCH/*im WAS: verstorbene markieren*/, LISTENKANDIDATUR_EDIT, LISTE_SEARCH,
                    KANDIDATUR_GEWAEHLT_SEARCH, ERGEBNIS_KONFLIKT_EDIT, ERGEBNIS_KONFLIKT_SEARCH, ERGEBNISEINGANG_SEARCH, STIMMEINGABE_IMPORTIEREN,
                    ERGEBNIS_EXPORTIEREN, ERGEBNIS_KUMULIERTE_STIMMEN_ANZEIGEN, STIMMEINGABE_ANZEIGEN, STIMMEINGABE_FEHLER_BESTAETIGEN, STIMMEINGABE_DELETE, STIMMEINGABE_DELETE_VORSTUFEN, STIMMEINGABE_AUS_VORSTUFE_UEBERNEHMEN, GEBIET_SEARCH, WAHLVORSCHLAG_QS, WAHLVORSCHLAG_QS_ZULASSUNG_AENDERN_NACHTRAEGLICH_KEINE_ZULASSUNGSFAEHIGKEIT_NACH_ZULASSUNGSAUSSCHUSS,
                    GEBIET_ERGEBNISEINGABESTATUS_SETZEN_ABGESCHLOSSEN, GEBIET_ERGEBNISEINGABESTATUS_SETZEN_EINGABE_MOEGLICH, GEBIET_ERGEBNISEINGABESTATUS_SETZEN_FREIGEGEBEN,
                    GEBIET_ERGEBNISEINGABESTATUS_SETZEN_FREIGEGEBEN_ZURUECKNEHMEN, GRUPPE_SEARCH, GRUPPE_EDIT,BESONDERHEIT_SEARCH,

                    // # ELECTVAPP-312  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, PRAESENTATION_INTERNE_BETRACHTEN,
                    // PRAESENTATION_OEFFNEN,
                    // PRAESENTATION_PLATZHALTER_EDIT, PRAESENTATION_STATUSUEBERSICHT_ANZEIGEN, PRAESENTATION_EXPORTIEREN,
                    CUSTOMER_3, CUSTOMER_4, CUSTOMER_5,
                    WAHL_SEARCH, WAHL_ZUR_BEARBEITUNG_AUSWAEHLEN, STIMMEINGABE_FORTSCHRITT_GEBIETSBAUM_ANZEIGEN //
            ));

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

            return result;
        }
    },
    VAPP_ADMIN/*Admin - Anwender anlegen, (Importe) Wahldefinition importieren, Stimmbezirke importieren, Wahlvorschlag importieren*/ {
        @Override
        public String getRolleName() {
            return NlCoreBenutzerCreator.NL_ADMIN_ROLLEN_NAME;
        }

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

        @Override
        public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
            Set<UseCasePermission> result = new HashSet<>(asList(BENUTZER_EDIT,BENUTZER_CREATE, BENUTZER_DELETE, BENUTZER_SEARCH,WAHL_IMPORTIEREN/*ELECT-10459*/,
                    WAHL_SEARCH, WAHL_DELETE, WAHL_EDIT, GEBIET_EXPORTIEREN, GEBIET_CREATE,GEBIET_EDIT, GEBIET_DELETE,
                    GEBIET_SEARCH,//
                    WAHL_SEARCH, WAHL_ZUR_BEARBEITUNG_AUSWAEHLEN, GEBIET_STIMMBEZIRKE_IMPORTIEREN, WAHLVORSCHLAG_IMPORTIEREN,
                SYSTEM_LOG_SEARCH,
                SYSTEM_LOG_DELETE,
                SYSTEM_LOG_EDIT, CUSTOMER_1,
                CUSTOMER_2, // Backup Restore freischlaten // ELECTVAPP-97
                CUSTOMER_7 // Export importierter EML510b // ELECTVAPP-890
//                KONFIGURATION_EDIT,
//                KONFIGURATION_EDIT_SECRETS_CLEAR_TEXT,
//                KONFIGURATION_SEARCH


            ));

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

            return result;
        }
    },
    ALLEEN_LEZEN /*Beobachter, nur lesend */ {
        @Override
        public String getRolleName() {
            return "Alleen lezen";
        }

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

        @Override
        public Collection<UseCasePermission> getRechte(PermissionService permissionService) {
            Set<UseCasePermission> result = new HashSet<>(asList(/*ELECTVAPP-312 PRAESENTATION_OEFFNEN, */ SITZE_SEARCH, ERGEBNIS_KUMULIERTE_STIMMEN_ANZEIGEN,
                STIMMEINGABE_FORTSCHRITT_GEBIETSBAUM_ANZEIGEN, CUSTOMER_3));

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

            return result;
        }
     };

    private static final List<UseCasePermission> ALLE_ROLLEN = asList(
            ANWENDUNG_BENUTZEN, //
            WAHL_SEARCH, WAHL_ZUR_BEARBEITUNG_AUSWAEHLEN, ONLINE_HILFE_ANZEIGEN //
    );

}
