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

import de.ivu.elect.business.security.Customer;
import de.ivu.elect.business.system.entity.SystemGebietsebene;

import static de.ivu.elect.business.security.Customer.*;

public enum WahlartDokumentvorlagen {

    /**
     * WERTE NICHT LÖSCHEN ODER UMBENNEN, WERDEN IN EXPORTEN VERWENDET(!)
     */

    KEINE(Customer.MINIMAL, SystemGebietsebene.OHNE) {
        @Override
        public boolean isVorlagenVorhanden() {
            return false;
        }

        @Override
        public String getResourceName() {
            return "";
        }

    },

    DD_BUNDESTAGSWAHL(DD_CORE),
    DD_EUROPAWAHL(DD_CORE),
    DD_AUSLAENDERBEIRATSWAHL(DD_CORE),
    DD_LANDTAGSWAHL(DD_CORE),
    DD_OBERBUERGERMEISTERWAHL(DD_CORE),
    DD_STADTRATSWAHL(DD_CORE),
    DD_STADTBEZIRKSBEIRATSWAHL(DD_CORE),
    DD_BUERGERENTSCHEID(DD_CORE),
    DD_ORTSCHAFTSRATSWAHL(DD_CORE),

    MUC_BUNDESTAGSWAHL(MUC_CORE),
    MUC_EUROPAWAHL(MUC_CORE),
    MUC_MIGRATIONSBEIRATSWAHL(MUC_CORE),
    MUC_LANDTAGSWAHL(MUC_CORE),
    MUC_BEZIRKSWAHL(MUC_CORE),
    MUC_OBERBUERGERMEISTERWAHL(MUC_CORE),
    MUC_STADTRATSWAHL(MUC_CORE),
    MUC_BUERGERENTSCHEID(MUC_WAS),
    MUC_VOLKSENTSCHEID(MUC_WAS), // Erstmal WAS, später CORE
    MUC_BEZIRKSAUSSCHUSSWAHL(MUC_CORE), // Erstmal WAS, später CORE

    KOM_BB_EUROPAWAHL(KOM_BB_WAS),
    KOM_BB_BUNDESTAGSWAHL(KOM_BB_WAS),

    KOM_BE_EUROPAWAHL(KOM_BE_WAS),
    KOM_BE_BUNDESTAGSWAHL(KOM_BE_WAS),
    KOM_BE_AGH(KOM_BE_WAS),
    KOM_BE_BVV(KOM_BE_WAS),
    KOM_BE_VE(KOM_BE_WAS),

    KOM_BY_EUROPAWAHL(KOM_BY_WAS),
    KOM_BY_BUNDESTAGSWAHL(KOM_BY_WAS),
    KOM_BY_BEZIRKSWAHL(KOM_BY_WAS),
    KOM_BY_BUERGERENTSCHEID(KOM_BY_WAS),
    KOM_BY_BUERGERMEISTERWAHL(KOM_BY_WAS),
    KOM_BY_LANDRATSWAHL(KOM_BY_WAS),
    KOM_BY_LANDTAGSWAHL(KOM_BY_WAS),
    KOM_BY_VOLKSENTSCHEID(KOM_BY_WAS),
    KOM_BY_GEMEINDERATSWAHL(KOM_BY_WAS),
    KOM_BY_KREISTAGSWAHL(KOM_BY_WAS),

    KOM_MV_EUROPAWAHL(KOM_MV_WAS),

    KOM_NI_BUNDESTAGSWAHL(KOM_NI_WAS),
    KOM_NI_EUROPAWAHL(KOM_NI_WAS),
    KOM_NI_BUERGERMEISTERWAHL(KOM_NI_WAS),
    KOM_NI_LANDRATSWAHL(KOM_NI_WAS),
    KOM_NI_GEMEINDERATSWAHL(KOM_NI_WAS),
    KOM_NI_KREISTAGSWAHL(KOM_NI_WAS),
    KOM_NI_ORTSRATSWAHL(KOM_NI_WAS),

    KOM_SH_EUROPAWAHL(KOM_SH_WAS),
    KOM_SH_BUERGERENTSCHEID(KOM_SH_WAS),
    KOM_SH_BUERGERMEISTERWAHL(KOM_SH_WAS),

    KOM_RP_LANDTAGSWAHL(KOM_RP_WAS),
    KOM_RP_EUROPAWAHL(KOM_RP_WAS),
    KOM_RP_BUNDESTAGSWAHL(KOM_RP_WAS),
    KOM_RP_DIREKTWAHL(KOM_RP_WAS),

    KOM_ST_LANDTAGSWAHL(KOM_ST_WAS),
    KOM_ST_EUROPAWAHL(KOM_ST_WAS),
    KOM_ST_BUNDESTAGSWAHL(KOM_ST_WAS),
    KOM_ST_DIREKTWAHL(KOM_ST_WAS),

    WOS_KOM_RP_LANDTAGSWAHL(KOM_RP_WOS),

    DESTATIS_WUS_BUNDESTAGSWAHL(DESTATIS_WUS) {
        @Override
        public boolean isGeignetFuerCustomer(Customer customer) {
            return DESTATIS_WUS.equals(customer); // ELECT-10683 nicht für extern
        }
    },
    DESTATIS_WUS_EXTERN_BUNDESTAGSWAHL(DESTATIS_WUS_EXTERN),
    DESTATIS_WUS_EUROPAWAHL(DESTATIS_WUS) {
        @Override
        public boolean isGeignetFuerCustomer(Customer customer) {
            return DESTATIS_WUS.equals(customer); // ELECT-10683 nicht für extern
        }
    },

    NL_GEMEENTERAAD(NL_COMMON) {
        @Override
        public String getResourceName() {
            // Dokumentenpakete heißen in NL-WUS und NL-WAS gleich (eine Wahlkonfiguration für beide Programme)
            return (name().toLowerCase() + ".zip").replaceAll("_", "-");
        }
    },
    NL_PROVINCIALESTATEN(NL_COMMON) {
        @Override
        public String getResourceName() {
            // Dokumentenpakete heißen in NL-WUS und NL-WAS gleich (eine Wahlkonfiguration für beide Programme)
            return (name().toLowerCase() + ".zip").replaceAll("_", "-");
        }
    },
    NL_EUROPEESPARLEMENT(NL_COMMON) {
        @Override
        public String getResourceName() {
            // Dokumentenpakete heißen in NL-WUS und NL-WAS gleich (eine Wahlkonfiguration für beide Programme)
            return (name().toLowerCase() + ".zip").replaceAll("_", "-");
        }
    },
    NL_WATERSCHAP(NL_COMMON) {
        @Override
        public String getResourceName() {
            // Dokumentenpakete heißen in NL-WUS und NL-WAS gleich (eine Wahlkonfiguration für beide Programme)
            return (name().toLowerCase() + ".zip").replaceAll("_", "-");
        }
    },
    NL_EILANDSRAAD(NL_COMMON) {
        @Override
        public String getResourceName() {
            // Dokumentenpakete heißen in NL-WUS und NL-WAS gleich (eine Wahlkonfiguration für beide Programme)
            return (name().toLowerCase() + ".zip").replaceAll("_", "-");
        }
    },
    NL_EERSTEKAMER(NL_COMMON) {
        @Override
        public String getResourceName() {
            // Dokumentenpakete heißen in NL-WUS und NL-WAS gleich (eine Wahlkonfiguration für beide Programme)
            return (name().toLowerCase() + ".zip").replaceAll("_", "-");
        }
    },
    NL_TWEEDEKAMER(NL_COMMON) {
        @Override
        public String getResourceName() {
            // Dokumentenpakete heißen in NL-WUS und NL-WAS gleich (eine Wahlkonfiguration für beide Programme)
            return (name().toLowerCase() + ".zip").replaceAll("_", "-");
        }
    };

    private final Customer customer;

    private final SystemGebietsebene systemGebietsebene;

    WahlartDokumentvorlagen(Customer customer) {
        this(customer, SystemGebietsebene.OHNE);
    }

    WahlartDokumentvorlagen(Customer customer, SystemGebietsebene systemGebietsebene) {
        this.customer = customer;
        this.systemGebietsebene = systemGebietsebene;
    }

    public Customer getCustomer() {
        return customer;
    }

    public SystemGebietsebene getSystemGebietsebene() {
        return systemGebietsebene;
    }

    public String getResourceName() {
        if (getSystemGebietsebene().isZuBeachten()) {
            return (getCustomer().name().toLowerCase() +
                "-" +
                getSystemGebietsebene().name().toLowerCase() +
                "-" +
                name().toLowerCase().substring(name().toLowerCase().lastIndexOf("_")) + ".zip")
                .replaceAll("_", "-");
        } else {
            return (getCustomer().name().toLowerCase() +
                name().toLowerCase().substring(name().toLowerCase().lastIndexOf("_")) + ".zip")
                .replaceAll("_", "-");
        }
    }

    public boolean isGeeignetFuer(Customer customer, SystemGebietsebene systemGebietsebene) {
        if (customer == null || systemGebietsebene == null) {
            return false;
        }
        return isGeeignetFuerSystemGebietsebene(systemGebietsebene) && isGeignetFuerCustomer(customer);
    }

    protected boolean isGeeignetFuerSystemGebietsebene(SystemGebietsebene systemGebietsebene) {
        return !systemGebietsebene.isZuBeachten() || !getSystemGebietsebene().isZuBeachten() || getSystemGebietsebene().equals(systemGebietsebene);
    }

    protected boolean isGeignetFuerCustomer(Customer customer) {
        return customer.contains(getCustomer());
    }

    public boolean isVorlagenVorhanden() {
        return true;
    }

}
