package de.avatic.lcc.model.eutaxation;

import java.util.Optional;

public enum MeasureType {

    // Serie D - Anti-dumping or countervailing duties (Anti-Dumping/Ausgleichszölle)
    DUMPP("551", true, "D"),             // Provisional anti-dumping duty - Vorläufiger Anti-Dumping-Zoll
    DUMPD("552", true, "D"),             // Definitive anti-dumping duty - Endgültiger Anti-Dumping-Zoll
    COMPP("553", true, "D"),             // Provisional countervailing duty - Vorläufiger Ausgleichszoll
    COMPD("554", true, "D"),             // Definitive countervailing duty - Endgültiger Ausgleichszoll
    PCDUM("555", true, "D"),             // Anti-dumping/countervailing duty - Pending collection - Schwebende Erhebung
    NTDUM("561", false, "D"),            // Notice of initiation of anti-dumping proceeding - Verfahrenseröffnung
    SPDUM("562", true, "D"),             // Suspended anti-dumping/countervailing duty - Ausgesetzter Zoll
    RGDUM("564", false, "D"),            // Anti-dumping/countervailing registration - Registrierung
    REDUM("565", false, "D"),            // Anti-dumping/countervailing review - Überprüfung
    STDUM("566", false, "D"),            // Anti-dumping/countervailing statistic - Statistik
    CTDUM("570", false, "D"),            // Anti-dumping/countervailing duty - Control - Kontrolle

    // Serie C - Applicable duty (Anwendbare Zollsätze)
    APPL("103", true, "C"),              // Third country duty - Standard-Drittlandszollsatz
    APPEU("105", true, "C"),             // Non preferential duty under end-use - Zollsatz unter End-Use
    CUD("106", true, "C"),               // Customs Union Duty - Zollunionszollsatz
    S("112", true, "C"),                 // Autonomous tariff suspension - Autonome Zollaussetzung
    SUSEU("115", true, "C"),             // Autonomous suspension under end-use - Aussetzung unter End-Use
    SUSSH("117", false, "C"),            // Suspension - ships/boats/vessels - Aussetzung für Schiffe (nicht relevant)
    AIRWO("119", false, "C"),            // Airworthiness tariff suspension - Lufttüchtigkeits-Zollaussetzung (nicht relevant)
    K_122("122", true, "C"),             // Non preferential tariff quota - Nichtpräferenzielles Zollkontingent
    KEU("123", true, "C"),               // Non preferential tariff quota under end-use - Kontingent unter End-Use
    OPQ("140", true, "C"),               // Outward processing tariff preference - Passive Veredelung
    S_141("141", true, "C"),             // Preferential suspension - Präferenzielle Aussetzung
    PREF("142", true, "C"),              // Tariff preference - Zollpräferenz
    K_143("143", true, "C"),             // Preferential tariff quota - Präferenzielles Zollkontingent
    C("144", true, "C"),                 // Preferential ceiling - Präferenzplafond
    PRFEU("145", true, "C"),             // Preference under end-use - Präferenz unter End-Use
    PRKEU("146", true, "C"),             // Preferential tariff quota under end-use - Präferenzkontingent unter End-Use
    CUQ("147", true, "C"),               // Customs Union Quota - Zollunionskontingent

    // Serie A - Import/Export prohibited (Verbote)
    PRO("277", false, "A"),              // Import prohibition - Einfuhrverbot
    PRX("278", false, "A"),              // Export prohibition - Ausfuhrverbot
    RSUBH("481", false, "A"),            // Declaration of subheading submitted to restrictions (import) - Einfuhrbeschränkung
    RSHEX("485", false, "A"),            // Declaration of subheading submitted to restrictions (export) - Ausfuhrbeschränkung

    // Serie P - VAT (Mehrwertsteuer)
    TVA("305", false, "P"),              // Value added tax - Mehrwertsteuer

    // Serie Q - Excises (Verbrauchssteuern)
    ACC("306", false, "Q"),              // Excises - Verbrauchssteuern

    // Serie O - Supplementary unit (Besondere Maßeinheiten)
    SUPUN("109", false, "O"),            // Supplementary unit - Besondere Maßeinheit
    USIMP("110", false, "O"),            // Supplementary unit import - Besondere Maßeinheit Einfuhr
    USEXP("111", false, "O"),            // Supplementary unit export - Besondere Maßeinheit Ausfuhr

    // Serie B - Entry subject to conditions (Einfuhr unter Bedingungen)
    VETCTR("410", false, "B"),           // Veterinary control - Veterinärkontrolle (nicht relevant für Gabelstapler)
    PRIOR_SURV("420", true, "B"),        // Entry into free circulation (prior surveillance) - Vorherige Überwachung
    REU("464", true, "B"),               // Declaration of subheading submitted to end-use provisions - End-Use-Erklärung
    LPS("465", true, "B"),               // Restriction on entry into free circulation - Einfuhrbeschränkung
    SPX("467", false, "B"),              // Restriction on export - Ausfuhrbeschränkung
    QX("473", false, "B"),               // Export authorization - Ausfuhrgenehmigung
    LPQ("474", true, "B"),               // Entry into free circulation (quantitative limitation) - Mengenmäßige Beschränkung
    LPR("475", true, "B"),               // Restriction on entry into free circulation - Einfuhrbeschränkung
    RX("476", false, "B"),               // Restriction on export - Ausfuhrbeschränkung
    OPT("477", true, "B"),               // Entry into free circulation (outward processing traffic) - Passive Veredelung
    DURX("478", false, "B"),             // Export authorization (Dual use) - Ausfuhrgenehmigung Dual-Use
    CHMEX("479", false, "B"),            // Export control on dangerous chemicals - Exportkontrolle gefährliche Chemikalien
    LCRED_M1("482", false, "B"),         // Declaration submitted to legal restrictions (net weight/supplementary unit) - Rechtliche Beschränkungen
    LCRED_V1("483", false, "B"),         // Declaration submitted to legal restrictions (unit price) - Rechtliche Beschränkungen
    PCRED_M1("484", false, "B"),         // Declaration submitted to physical restrictions (net weight/supplementary unit) - Physische Beschränkungen
    PCRED_V("491", false, "B"),          // Declaration submitted to physical restrictions (declared statistical value) - Physische Beschränkungen
    PCRED_M("492", false, "B"),          // Declaration submitted to physical restrictions (declared net mass) - Physische Beschränkungen
    PCRED_S("493", false, "B"),          // Declaration submitted to physical restrictions (declared supplementary unit) - Physische Beschränkungen
    LCRED_V("494", false, "B"),          // Declaration submitted to legal restrictions (declared statistical value) - Rechtliche Beschränkungen
    LCRED_M("495", false, "B"),          // Declaration submitted to legal restrictions (declared net mass) - Rechtliche Beschränkungen
    LCRED_S("496", false, "B"),          // Declaration submitted to legal restrictions (declared supplementary unit) - Rechtliche Beschränkungen
    TRIMP("705", false, "B"),            // Import prohibition on goods for torture and repression - Folter-/Repressionsgüter
    TREXP("706", false, "B"),            // Export prohibition - torture/repression goods - Ausfuhrverbot Folter-/Repressionsgüter
    IMPORT_CTRL("707", true, "B"),       // Import control - Einfuhrkontrolle (potentiell relevant für Bauteile)
    TRRX("708", false, "B"),             // Export restriction - torture/repression goods - Ausfuhrbeschränkung
    EXPCTRL("709", false, "B"),          // Export control - Ausfuhrkontrolle
    CITESIMP("710", false, "B"),         // Import control - CITES - CITES-Kontrolle (nicht relevant)
    MILIM("711", false, "B"),            // Import control on restricted goods and technologies - Militärgüter (nicht relevant)
    IAS("712", false, "B"),              // Import control - IAS - Invasive Arten (nicht relevant)
    IMPORT_CTRL_GMO("713", false, "B"),  // Import control on GMOs - GMO-Kontrolle (nicht relevant)
    IMPCTRL("714", true, "B"),           // Import control - Einfuhrkontrolle (potentiell relevant)
    CITESEX("715", false, "B"),          // Export control - CITES - CITES-Ausfuhrkontrolle
    CFISH("716", false, "B"),            // Export control - Fish - Fischereikontrolle (nicht relevant)
    MILEX("717", false, "B"),            // Export control on restricted goods and technologies - Militärgüter
    LUXEX("718", false, "B"),            // Export control on luxury goods - Luxusgüter (nicht relevant)
    CIUUF("719", false, "B"),            // Control on illegal fishing - Illegale Fischerei (nicht relevant)
    FFIM("722", false, "B"),             // Entry restriction - feed and food - Futter-/Lebensmittel (nicht relevant)
    FGGIMP("724", false, "B"),           // Import control of fluorinated greenhouse gases - Treibhausgase
    OZEXP("725", false, "B"),            // Export control on ozone-depleting substances - Ozonschicht
    OZIMP("726", false, "B"),            // Import control on ozone-depleting substances - Ozonschicht
    LUXIM("728", false, "B"),            // Import control on luxury goods - Luxusgüter (nicht relevant)
    EXPCHE("730", false, "B"),           // Compliance with pre-export checks requirements - Vorausfuhrkontrollen
    IMPORT_CTRL_731("731", true, "B"),   // Import control - Einfuhrkontrolle (potentiell relevant)
    IMPORT_CTRL_732("732", true, "B"),   // Import control - Einfuhrkontrolle (potentiell relevant)
    CGIMP("734", false, "B"),            // Import control on cultural goods - Kulturgüter (nicht relevant)
    CGEXP("735", false, "B"),            // Export control on cultural goods - Kulturgüter (nicht relevant)
    EXPORT_CTRL_736("736", false, "B"),  // Export control - Ausfuhrkontrolle
    EXPORT_CTRL_737("737", false, "B"),  // Export control - Ausfuhrkontrolle
    IMPORT_EXPORT_CML("738", false, "B"), // Import/export restriction - Common Military List goods - Militärgüter
    FUREX("740", false, "B"),            // Export control on cat and dog fur - Katzen-/Hundefell (nicht relevant)
    FURIM("745", false, "B"),            // Import control on cat and dog fur - Katzen-/Hundefell (nicht relevant)
    SEAL("746", false, "B"),             // Import control on seal products - Robbenprodukte (nicht relevant)
    FLEGT("747", false, "B"),            // Import control of timber - FLEGT licensing - Holzprodukte (nicht relevant)
    MERIM("748", false, "B"),            // Import control of mercury - Quecksilber
    MEREX("749", false, "B"),            // Export control of mercury - Quecksilber
    ORGANIC("750", false, "B"),          // Import control of organic products - Bio-Produkte (nicht relevant)
    WSTEX("751", false, "B"),            // Export control - Waste - Abfall
    WSTIM("755", false, "B"),            // Import control - Waste - Abfall
    IMPCTRL_760("760", true, "B"),       // Import control - Einfuhrkontrolle (potentiell relevant)
    CHMIM("761", false, "B"),            // Import control on REACH - Chemikalien
    IMPORT_CTRL_762("762", true, "B"),   // Import control - Einfuhrkontrolle (potentiell relevant)
    IMPORT_CTRL_763("763", true, "B"),   // Import control - Einfuhrkontrolle (potentiell relevant)
    FGEXP("765", false, "B"),            // Export control of fluorinated greenhouse gases - Treibhausgase
    EXPORT_CTRL_766("766", false, "B"),  // Export control - Ausfuhrkontrolle
    EXPORT_CTRL_767("767", false, "B"),  // Export control - Ausfuhrkontrolle
    EXPORT_CTRL_768("768", false, "B"),  // Export control - Ausfuhrkontrolle
    IMPOP("769", false, "B"),            // Import control on persistent organic pollutants - Organische Schadstoffe
    FLEGT_GHANA("770", false, "B"),      // Import control timber - FLEGT Ghana - Holzprodukte (nicht relevant)
    FLEGT_CAMEROON("771", false, "B"),   // Import control timber - FLEGT Cameroon - Holzprodukte (nicht relevant)
    FLEGT_CONGO("772", false, "B"),      // Import control timber - FLEGT Congo - Holzprodukte (nicht relevant)
    FLEGT_CAR("773", false, "B"),        // Import control timber - FLEGT Central Africa - Holzprodukte (nicht relevant)
    FLEGT_VIETNAM("774", false, "B"),    // Import control timber - FLEGT Vietnam - Holzprodukte (nicht relevant)
    CBAM("775", false, "B"),             // Carbon Border Adjustment Mechanism - CO2-Grenzausgleich
    DFRSTIM("776", false, "B"),          // Import control on deforestation - Entwaldung
    DFRSEXP("777", false, "B"),          // Export control on deforestation - Entwaldung
    EXPORT_CTRL_780("780", false, "B"),  // Export control - Ausfuhrkontrolle
    EXPORT_CTRL_781("781", false, "B"),  // Export control - Ausfuhrkontrolle

    // Serie N - Posterior surveillance (Nachträgliche Überwachung)
    PIM("440", false, "N"),              // Public Import Monitoring - Öffentliche Einfuhrüberwachung
    PEM("445", false, "N"),              // Public Export Monitoring - Öffentliche Ausfuhrüberwachung
    SUB("450", false, "N"),              // Statistical surveillance - Statistische Überwachung
    SUA("460", false, "N"),              // Computer surveillance - Computerüberwachung
    SQR("461", false, "N"),              // Community surveillance - reference quantities - Referenzmengen
    SUR("462", false, "N"),              // Posterior import surveillance - Nachträgliche Einfuhrüberwachung
    SUX("463", false, "N"),              // Posterior export surveillance - Nachträgliche Ausfuhrüberwachung
    SUREX("470", false, "N"),            // Export surveillance - Ausfuhrüberwachung
    SUEX("471", false, "N"),             // Export surveillance (TQS) - Ausfuhrüberwachung
    IMPMNTR_702("702", false, "N"),      // Import Monitoring - Einfuhrüberwachung
    IMPMNTR_703("703", false, "N"),      // Import Monitoring - Einfuhrüberwachung
    IMPMNTR_704("704", false, "N"),      // Import Monitoring - Einfuhrüberwachung

    // Serie M - Unit price, standard import value (Preise und Werte)
    VU("488", false, "M"),               // Unit price - Stückpreis
    REPSU("489", false, "M"),            // Representative price - Repräsentativer Preis
    SIV("490", false, "M"),              // Standard import value - Standard-Einfuhrwert

    // Serie S - Supplementary amount (Zusätzliche Beträge)
    ASURE("651", false, "S"),            // Security based on representative price - Sicherheit basierend auf Preis
    ASUCI("652", false, "S"),            // Additional duty based on CIF price - Zusatzzoll basierend auf CIF-Preis
    SECQ("653", false, "S"),             // Security reduced under tariff quota - Reduzierte Sicherheit
    ADQ("654", false, "S"),              // Additional duty reduced under tariff quota - Reduzierter Zusatzzoll
    SECPO("655", false, "S"),            // Security (poultry) based on representative price - Sicherheit Geflügel
    ADPOC("656", false, "S"),            // Additional duty (poultry) based on CIF price - Zusatzzoll Geflügel
    RESEC("657", false, "S"),            // Reduced security based on representative price - Reduzierte Sicherheit
    READ("658", false, "S"),             // Reduced additional duty based on CIF price - Reduzierter Zusatzzoll

    // Serie F - Additional duty on sugar, flour (Zusatzzölle Zucker/Mehl)
    AD_SZ("672", false, "F"),            // Amount of additional duty on sugar - Zusatzzoll Zucker (nicht relevant)
    AD_FM("673", false, "F"),            // Amount of additional duty on flour - Zusatzzoll Mehl (nicht relevant)

    // Serie E - Levies, export refunds (Abgaben, Ausfuhrerstattungen)
    EA("674", false, "E"),               // Agricultural component - Landwirtschaftliche Komponente (nicht relevant)

    // Serie J - Countervailing charge (Ausgleichsabgaben)
    TC("690", false, "J"),               // Countervailing charge - Ausgleichsabgabe
    DR("695", true, "J"),                // Additional duties - Zusatzzölle
    SAFDU("696", true, "J");             // Additional duties (safeguard) - Schutzmaßnahmen-Zusatzzölle


    private final String measureCode;
    private final boolean containsRelevantDuty;
    private final String series;

    MeasureType(String measureCode, boolean containsRelevantDuty, String series) {
        this.measureCode = measureCode;
        this.containsRelevantDuty = containsRelevantDuty;
        this.series = series;
    }

    public String getMeasureCode() {
        return measureCode;
    }

    public boolean containsRelevantDuty() {
        return containsRelevantDuty;
    }

    public String getSeries() {
        return series;
    }

    public static Optional<MeasureType> fromMeasureCode(String measureCode) {
        for (MeasureType type : values()) {
            if (type.measureCode.equals(measureCode)) {
                return Optional.of(type);
            }
        }
        return Optional.empty();
    }

    public static MeasureType fromShortName(String shortName) {
        try {
            return valueOf(shortName.toUpperCase().replace(" ", "_"));
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("Unknown short name: " + shortName);
        }
    }
}