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.boundary.NlCoreBenutzerCreator;
import de.ivu.elect.business.security.entity.RolleTemplate;


import static de.ivu.elect.business.security.UseCasePermission.ANWENDUNG_BENUTZEN;
import static de.ivu.elect.business.security.UseCasePermission.BENUTZER_CREATE;
import static de.ivu.elect.business.security.UseCasePermission.BENUTZER_DELETE;
import static de.ivu.elect.business.security.UseCasePermission.BENUTZER_EDIT;
import static de.ivu.elect.business.security.UseCasePermission.BENUTZER_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.CUSTOMER_1;
import static de.ivu.elect.business.security.UseCasePermission.CUSTOMER_2;
import static de.ivu.elect.business.security.UseCasePermission.CUSTOMER_3;
import static de.ivu.elect.business.security.UseCasePermission.CUSTOMER_4;
import static de.ivu.elect.business.security.UseCasePermission.CUSTOMER_5;
import static de.ivu.elect.business.security.UseCasePermission.CUSTOMER_7;
import static de.ivu.elect.business.security.UseCasePermission.DOKUMENT_ERZEUGEN_GESAMT_ERGEBNIS;
import static de.ivu.elect.business.security.UseCasePermission.ERGEBNISEINGANG_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.ERGEBNIS_BERECHNUNG_AUSLOESEN;
import static de.ivu.elect.business.security.UseCasePermission.ERGEBNIS_EXPORTIEREN;
import static de.ivu.elect.business.security.UseCasePermission.ERGEBNIS_KONFLIKT_EDIT;
import static de.ivu.elect.business.security.UseCasePermission.ERGEBNIS_KONFLIKT_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.ERGEBNIS_KUMULIERTE_STIMMEN_ANZEIGEN;
import static de.ivu.elect.business.security.UseCasePermission.ERGEBNIS_STATUSUEBERSICHT_ANZEIGEN;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_BEVOELKERUNGSZAHLEN_EDIT;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_CREATE;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_DELETE;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_EDIT;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_ERGEBNISEINGABESTATUS_SETZEN_ABGESCHLOSSEN;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_ERGEBNISEINGABESTATUS_SETZEN_EINGABE_MOEGLICH;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_ERGEBNISEINGABESTATUS_SETZEN_FREIGEGEBEN;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_ERGEBNISEINGABESTATUS_SETZEN_FREIGEGEBEN_ZURUECKNEHMEN;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_EXPORTIEREN;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.GEBIET_STIMMBEZIRKE_IMPORTIEREN;
import static de.ivu.elect.business.security.UseCasePermission.GRUPPE_EDIT;
import static de.ivu.elect.business.security.UseCasePermission.GRUPPE_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.KANDIDATUR_GEWAEHLT_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.KANDIDATUR_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.LISTENKANDIDATUR_EDIT;
import static de.ivu.elect.business.security.UseCasePermission.LISTENKANDIDATUR_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.LISTE_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.ONLINE_HILFE_ANZEIGEN;
import static de.ivu.elect.business.security.UseCasePermission.STIMMEINGABE_ANZEIGEN;
import static de.ivu.elect.business.security.UseCasePermission.STIMMEINGABE_AUS_VORSTUFE_UEBERNEHMEN;
import static de.ivu.elect.business.security.UseCasePermission.STIMMEINGABE_CREATE;
import static de.ivu.elect.business.security.UseCasePermission.STIMMEINGABE_DELETE;
import static de.ivu.elect.business.security.UseCasePermission.STIMMEINGABE_DELETE_VORSTUFEN;
import static de.ivu.elect.business.security.UseCasePermission.STIMMEINGABE_FEHLER_BESTAETIGEN;
import static de.ivu.elect.business.security.UseCasePermission.STIMMEINGABE_FORTSCHRITT_GEBIETSBAUM_ANZEIGEN;
import static de.ivu.elect.business.security.UseCasePermission.STIMMEINGABE_IMPORTIEREN;
import static de.ivu.elect.business.security.UseCasePermission.STIMMEINGABE_IMPORTIEREN_CUSTOM;
import static de.ivu.elect.business.security.UseCasePermission.SYSTEM_LOG_DELETE;
import static de.ivu.elect.business.security.UseCasePermission.SYSTEM_LOG_EDIT;
import static de.ivu.elect.business.security.UseCasePermission.SYSTEM_LOG_SEARCH;
import static de.ivu.elect.business.security.UseCasePermission.WAHLVORSCHLAG_IMPORTIEREN;
import static de.ivu.elect.business.security.UseCasePermission.WAHLVORSCHLAG_QS;
import static de.ivu.elect.business.security.UseCasePermission.WAHLVORSCHLAG_QS_ZULASSUNG_AENDERN_NACHTRAEGLICH_KEINE_ZULASSUNGSFAEHIGKEIT_NACH_ZULASSUNGSAUSSCHUSS;
import static de.ivu.elect.business.security.UseCasePermission.WAHL_DELETE;
import static de.ivu.elect.business.security.UseCasePermission.WAHL_EDIT;
import static de.ivu.elect.business.security.UseCasePermission.WAHL_IMPORTIEREN;
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 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, /* ELECT-12805 SITZE_SEARCH, */ ERGEBNIS_BERECHNUNG_AUSLOESEN, LISTENKANDIDATUR_SEARCH,
                KANDIDATUR_SEARCH/*im WAS: verstorbene markieren*/, 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,
                GEBIET_BEVOELKERUNGSZAHLEN_EDIT,

                // # 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,
                /* ELECTVAPP-1324 Beginn Backup Restore einspielen*/
                    STIMMEINGABE_IMPORTIEREN, STIMMEINGABE_IMPORTIEREN_CUSTOM, /* ELECTVAPP-1324 ENDE */
                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, */ /* ELECT-12805 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 //
    );

}
