package de.avatic.lcc.model.custom;

import java.util.Optional;

public enum MeasureType {

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

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

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

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

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

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

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

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

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

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

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

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

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


    private final String measureCode;
    private final boolean containsRelevantDuty;

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

    public String getMeasureCode() {
        return measureCode;
    }

    public boolean containsRelevantDuty() {
        return containsRelevantDuty;
    }

    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);
        }
    }
}