package gregtech.api.enums;

import java.util.Locale;

import net.minecraft.util.ResourceLocation;

import cpw.mods.fml.common.Loader;

public enum Mods {

    AE2FluidCraft(Names.A_E2_FLUID_CRAFT),
    AE2Stuff(Names.AE2STUFF),
    AE2WCT(Names.AE2WCT),
    AFSU(Names.A_F_S_U),
    AdvancedSolarPanel(Names.ADVANCED_SOLAR_PANEL),
    AdventureBackpack(Names.ADVENTURE_BACKPACK),
    AkashicTome(Names.AKASHIC_TOME),
    AppleCore(Names.APPLE_CORE),
    AppliedEnergistics2(Names.APPLIED_ENERGISTICS2),
    ArchitectureCraft(Names.ARCHITECTURE_CRAFT),
    Aroma1997Core(Names.AROMA1997_CORE),
    Automagy(Names.AUTOMAGY),
    Avaritia(Names.AVARITIA),
    AvaritiaAddons(Names.AVARITIA_ADDONS),
    Backpack(Names.BACKPACK),
    BartWorks(Names.BART_WORKS),
    Baubles(Names.BAUBLES),
    BetterBuildersWands(Names.BETTER_BUILDERS_WANDS),
    BetterLoadingScreen(Names.BETTER_LOADING_SCREEN),
    BetterQuesting(Names.BETTER_QUESTING),
    BiblioCraft(Names.BIBLIO_CRAFT),
    BiblioWoodsBoPEdition(Names.BIBLIO_WOODS_BO_P_EDITION),
    BiblioWoodsForestryEdition(Names.BIBLIO_WOODS_FORESTRY_EDITION),
    BiblioWoodsNaturaEdition(Names.BIBLIO_WOODS_NATURA_EDITION),
    BinnieCore(Names.BINNIE_CORE),
    BiomesOPlenty(Names.BIOMES_O_PLENTY),
    BlockRenderer6343(Names.BLOCK_RENDERER_6343),
    BloodArsenal(Names.BLOOD_ARSENAL),
    BloodMagic(Names.BLOOD_MAGIC),
    Botania(Names.BOTANIA),
    Botany(Names.BOTANY),
    BuildCraftBuilders(Names.BUILD_CRAFT_BUILDERS),
    BuildCraftCompat(Names.BUILD_CRAFT_COMPAT),
    BuildCraftCore(Names.BUILD_CRAFT_CORE),
    BuildCraftFactory(Names.BUILD_CRAFT_FACTORY),
    BuildCraftRobotics(Names.BUILD_CRAFT_ROBOTICS),
    BuildCraftSilicon(Names.BUILD_CRAFT_SILICON),
    BuildCraftTransport(Names.BUILD_CRAFT_TRANSPORT),
    COFHCore(Names.C_O_F_H_CORE),
    CarpentersBlocks(Names.CARPENTERS_BLOCKS),
    CatWalks(Names.CAT_WALKS),
    Chisel(Names.CHISEL),
    CompactKineticGenerators(Names.COMPACT_KINETIC_GENERATORS),
    Computronics(Names.COMPUTRONICS),
    CraftTweaker(Names.CRAFT_TWEAKER),
    CropLoadCore(Names.CROP_LOAD_CORE),
    CropsPlusPlus(Names.CROPS_PLUS_PLUS),
    DetravScannerMod(Names.DETRAV_SCANNER_MOD),
    DraconicEvolution(Names.DRACONIC_EVOLUTION),
    ElectroMagicTools(Names.ELECTRO_MAGIC_TOOLS),
    EnderIO(Names.ENDER_I_O),
    EnderStorage(Names.ENDER_STORAGE),
    EnderZoo(Names.ENDER_ZOO),
    EnhancedLootBags(Names.ENHANCED_LOOT_BAGS),
    EternalSingularity(Names.ETERNAL_SINGULARITY),
    EtFuturumRequiem(Names.ET_FUTURUM_REQUIEM),
    ExtraBees(Names.EXTRA_BEES),
    ExtraCells2(Names.EXTRA_CELLS2),
    ExtraTrees(Names.EXTRA_TREES),
    ExtraUtilities(Names.EXTRA_UTILITIES),
    FloodLights(Names.FLOOD_LIGHTS),
    ForbiddenMagic(Names.FORBIDDEN_MAGIC),
    Forestry(Names.FORESTRY),
    ForgeMicroblocks(Names.FORGE_MICROBLOCKS),
    ForgeRelocation(Names.FORGE_RELOCATION),
    GGFab(Names.G_G_FAB),
    GTNHIntergalactic(Names.G_T_N_H_INTERGALACTIC),
    GTNHLanthanides(Names.G_T_N_H_LANTHANIDES),
    GTPlusPlus(Names.G_T_PLUS_PLUS),
    GTPlusPlusEverglades(Names.G_T_PLUS_PLUS_EVERGLADES),
    Gadomancy(Names.GADOMANCY),
    GalactiGreg(Names.GALACTI_GREG),
    GalacticraftAmunRa(Names.GALACTICRAFT_AMUN_RA),
    GalacticraftCore(Names.GALACTICRAFT_CORE),
    GalacticraftMars(Names.GALACTICRAFT_MARS),
    GalaxySpace(Names.GALAXY_SPACE),
    Gendustry(Names.GENDUSTRY),
    Genetics(Names.GENETICS),
    GoodGenerator(Names.GOOD_GENERATOR),
    GraviSuite(Names.GRAVI_SUITE),
    GraviSuiteNEO(Names.GRAVI_SUITE_NEO),
    GregTech(Names.GREG_TECH),
    HardcoreEnderExpansion(Names.HARDCORE_ENDER_EXPANSION),
    HodgePodge(Names.HODGE_PODGE),
    HoloInventory(Names.HOLO_INVENTORY),
    IC2CropPlugin(Names.I_C2_CROP_PLUGIN),
    IC2NuclearControl(Names.I_C2_NUCLEAR_CONTROL),
    IguanaTweaksTinkerConstruct(Names.IGUANA_TWEAKS_TINKER_CONSTRUCT),
    IndustrialCraft2(Names.INDUSTRIAL_CRAFT2),
    InfernalMobs(Names.INFERNAL_MOBS),
    IronChests(Names.IRON_CHESTS),
    IronChestsMinecarts(Names.IRON_CHESTS_MINECARTS),
    IronTanks(Names.IRON_TANKS),
    JABBA(Names.J_A_B_B_A),
    KekzTech(Names.KEKZ_TECH),
    KubaTech(Names.KUBA_TECH),
    LogisticsPipes(Names.LOGISTICS_PIPES),
    MCFrames(Names.MC_FRAMES),
    MagicBees(Names.MAGIC_BEES),
    MalisisDoors(Names.MALISIS_DOORS),
    Mantle(Names.MANTLE),
    MineAndBladeBattleGear2(Names.MINE_AND_BLADE_BATTLE_GEAR2),
    Minecraft(Names.MINECRAFT),
    MineTweaker(Names.MINE_TWEAKER),
    MobsInfo(Names.MOBS_INFO),
    NEICustomDiagrams(Names.N_E_I_CUSTOM_DIAGRAMS),
    NEIOrePlugin(Names.N_E_I_ORE_PLUGIN),
    Natura(Names.NATURA),
    NaturesCompass(Names.NATURES_COMPASS),
    NewHorizonsCoreMod(Names.NEW_HORIZONS_CORE_MOD),
    NotEnoughItems(Names.NOT_ENOUGH_ITEMS),
    OpenBlocks(Names.OPEN_BLOCKS),
    OpenComputers(Names.OPEN_COMPUTERS),
    OpenGlasses(Names.OPEN_GLASSES),
    OpenModularTurrets(Names.OPEN_MODULAR_TURRETS),
    OpenPrinters(Names.OPEN_PRINTERS),
    OpenSecurity(Names.OPEN_SECURITY),
    PamsHarvestCraft(Names.PAMS_HARVEST_CRAFT),
    PamsHarvestTheNether(Names.PAMS_HARVEST_THE_NETHER),
    PlayerAPI(Names.PLAYER_API),
    ProjectBlue(Names.PROJECT_BLUE),
    ProjectRedCore(Names.PROJECT_RED_CORE),
    ProjectRedExpansion(Names.PROJECT_RED_EXPANSION),
    ProjectRedExploration(Names.PROJECT_RED_EXPLORATION),
    ProjectRedFabrication(Names.PROJECT_RED_FABRICATION),
    ProjectRedIllumination(Names.PROJECT_RED_ILLUMINATION),
    ProjectRedIntegration(Names.PROJECT_RED_INTEGRATION),
    ProjectRedTransmission(Names.PROJECT_RED_TRANSMISSION),
    ProjectRedTransportation(Names.PROJECT_RED_TRANSPORTATION),
    QuestBook(Names.QUEST_BOOK),
    RWG(Names.RWG),
    Railcraft(Names.RAILCRAFT),
    RandomThings(Names.RANDOM_THINGS),
    RemoteIO(Names.REMOTE_IO),
    SGCraft(Names.S_G_CRAFT),
    SleepingBags(Names.SLEEPING_BAGS),
    SpiceOfLife(Names.SPICE_OF_LIFE),
    StevesAddons(Names.STEVES_ADDONS),
    StevesCarts2(Names.STEVES_CARTS2),
    StevesFactoryManager(Names.STEVES_FACTORY_MANAGER),
    StorageDrawers(Names.STORAGE_DRAWERS),
    StructureLib(Names.STRUCTURE_LIB),
    SuperSolarPanels(Names.SUPER_SOLAR_PANELS),
    TaintedMagic(Names.TAINTED_MAGIC),
    TecTech(Names.TECTECH),
    Thaumcraft(Names.THAUMCRAFT),
    ThaumicBases(Names.THAUMIC_BASES),
    ThaumicBoots(Names.THAUMIC_BOOTS),
    ThaumicEnergistics(Names.THAUMIC_ENERGISTICS),
    ThaumicExploration(Names.THAUMIC_EXPLORATION),
    ThaumicHorizons(Names.THAUMIC_HORIZONS),
    ThaumicMachina(Names.THAUMIC_MACHINA),
    ThaumicTinkerer(Names.THAUMIC_TINKERER),
    TinkerConstruct(Names.TINKER_CONSTRUCT),
    TinkersDefence(Names.TINKERS_DEFENCE),
    TinkersGregworks(Names.TINKERS_GREGWORKS),
    TinkersMechworks(Names.TINKERS_MECHWORKS),
    Translocator(Names.TRANSLOCATOR),
    TravellersGear(Names.TRAVELLERS_GEAR),
    TwilightForest(Names.TWILIGHT_FOREST),
    UniversalSingularities(Names.UNIVERSAL_SINGULARITIES),
    VisualProspecting(Names.VISUAL_PROSPECTING),
    Waila(Names.WAILA),
    WarpTheory(Names.WARP_THEORY),
    WirelessRedstoneCBEAddons(Names.WIRELESS_REDSTONE_CBE_ADDONS),
    WirelessRedstoneCBECore(Names.WIRELESS_REDSTONE_CBE_CORE),
    WirelessRedstoneCBELogic(Names.WIRELESS_REDSTONE_CBE_LOGIC),
    Witchery(Names.WITCHERY),
    WitchingGadgets(Names.WITCHING_GADGETS),
    ZTones(Names.Z_TONES),

    // Do we keep compat of those?
    Metallurgy(Names.METALLURGY),
    RotaryCraft(Names.ROTARY_CRAFT),
    UndergroundBiomes(Names.UNDERGROUND_BIOMES),

    ;

    public static class Names {

        public static final String A_E2_FLUID_CRAFT = "ae2fc";
        public static final String AE2STUFF = "ae2stuff";
        public static final String AE2WCT = "ae2wct";
        public static final String A_F_S_U = "AFSU";
        public static final String ADVANCED_SOLAR_PANEL = "AdvancedSolarPanel";
        public static final String ADVENTURE_BACKPACK = "adventurebackpack";
        public static final String AKASHIC_TOME = "akashictome";
        public static final String APPLE_CORE = "AppleCore";
        public static final String APPLIED_ENERGISTICS2 = "appliedenergistics2";
        public static final String ARCHITECTURE_CRAFT = "ArchitectureCraft";
        public static final String AROMA1997_CORE = "Aroma1997Core";
        public static final String AUTOMAGY = "Automagy";
        public static final String AVARITIA = "Avaritia";
        public static final String AVARITIA_ADDONS = "avaritiaddons";
        public static final String BACKPACK = "Backpack";
        public static final String BART_WORKS = "bartworks";
        public static final String BAUBLES = "Baubles";
        public static final String BETTER_BUILDERS_WANDS = "betterbuilderswands";
        public static final String BETTER_LOADING_SCREEN = "betterloadingscreen";
        public static final String BETTER_QUESTING = "betterquesting";
        public static final String BIBLIO_CRAFT = "BiblioCraft";
        public static final String BIBLIO_WOODS_BO_P_EDITION = "BiblioWoodsBoP";
        public static final String BIBLIO_WOODS_FORESTRY_EDITION = "BiblioWoodsForestry";
        public static final String BIBLIO_WOODS_NATURA_EDITION = "BiblioWoodsNatura";
        public static final String BINNIE_CORE = "BinnieCore";
        public static final String BIOMES_O_PLENTY = "BiomesOPlenty";
        public static final String BLOCK_RENDERER_6343 = "blockrenderer6343";
        public static final String BLOOD_ARSENAL = "BloodArsenal";
        public static final String BLOOD_MAGIC = "AWWayofTime";
        public static final String BOTANIA = "Botania";
        public static final String BOTANY = "Botany";
        public static final String BUILD_CRAFT_BUILDERS = "BuildCraft|Builders";
        public static final String BUILD_CRAFT_COMPAT = "BuildCraft|Compat";
        public static final String BUILD_CRAFT_CORE = "BuildCraft|Core";
        public static final String BUILD_CRAFT_FACTORY = "BuildCraft|Factory";
        public static final String BUILD_CRAFT_ROBOTICS = "BuildCraft|Robotics";
        public static final String BUILD_CRAFT_SILICON = "BuildCraft|Silicon";
        public static final String BUILD_CRAFT_TRANSPORT = "BuildCraft|Transport";
        public static final String C_O_F_H_CORE = "CoFHCore";
        public static final String CARPENTERS_BLOCKS = "CarpentersBlocks";
        public static final String CAT_WALKS = "catwalks";
        public static final String CHISEL = "chisel";
        public static final String COMPACT_KINETIC_GENERATORS = "compactkineticgenerators";
        public static final String COMPUTRONICS = "computronics";
        public static final String CRAFT_TWEAKER = "MineTweaker3";
        public static final String CROP_LOAD_CORE = "croploadcore";
        public static final String CROPS_PLUS_PLUS = "berriespp";
        public static final String DETRAV_SCANNER_MOD = "detravscannermod";
        public static final String DRACONIC_EVOLUTION = "DraconicEvolution";
        public static final String ELECTRO_MAGIC_TOOLS = "EMT";
        public static final String ENDER_I_O = "EnderIO";
        public static final String ENDER_STORAGE = "EnderStorage";
        public static final String ENDER_ZOO = "EnderZoo";
        public static final String ENHANCED_LOOT_BAGS = "enhancedlootbags";
        public static final String ETERNAL_SINGULARITY = "eternalsingularity";
        public static final String ET_FUTURUM_REQUIEM = "etfuturum";
        public static final String EXTRA_BEES = "ExtraBees";
        public static final String EXTRA_CELLS2 = "extracells";
        public static final String EXTRA_TREES = "ExtraTrees";
        public static final String EXTRA_UTILITIES = "ExtraUtilities";
        public static final String FLOOD_LIGHTS = "FloodLights";
        public static final String FORBIDDEN_MAGIC = "ForbiddenMagic";
        public static final String FORESTRY = "Forestry";
        public static final String FORGE_MICROBLOCKS = "ForgeMicroblock";
        public static final String FORGE_RELOCATION = "ForgeRelocation";
        public static final String G_G_FAB = "ggfab";
        public static final String G_T_N_H_INTERGALACTIC = "gtnhintergalactic";
        public static final String G_T_N_H_LANTHANIDES = "gtnhlanth";
        public static final String G_T_PLUS_PLUS = "miscutils";
        public static final String G_T_PLUS_PLUS_EVERGLADES = "ToxicEverglades";
        public static final String GADOMANCY = "gadomancy";
        public static final String GALACTI_GREG = "galacticgreg";
        public static final String GALACTICRAFT_AMUN_RA = "GalacticraftAmunRa";
        public static final String GALACTICRAFT_CORE = "GalacticraftCore";
        public static final String GALACTICRAFT_MARS = "GalacticraftMars";
        public static final String GALAXY_SPACE = "GalaxySpace";
        public static final String GENDUSTRY = "gendustry";
        public static final String GENETICS = "Genetics";
        public static final String GOOD_GENERATOR = "GoodGenerator";
        public static final String GRAVI_SUITE = "GraviSuite";
        public static final String GRAVI_SUITE_NEO = "gravisuiteneo";
        public static final String GREG_TECH = "gregtech";
        public static final String HARDCORE_ENDER_EXPANSION = "HardcoreEnderExpansion";
        public static final String HODGE_PODGE = "hodgepodge";
        public static final String HOLO_INVENTORY = "holoinventory";
        public static final String I_C2_CROP_PLUGIN = "Ic2Nei";
        public static final String I_C2_NUCLEAR_CONTROL = "IC2NuclearControl";
        public static final String IGUANA_TWEAKS_TINKER_CONSTRUCT = "IguanaTweaksTConstruct";
        public static final String INDUSTRIAL_CRAFT2 = "IC2";
        public static final String INFERNAL_MOBS = "InfernalMobs";
        public static final String IRON_CHESTS = "IronChest";
        public static final String IRON_CHESTS_MINECARTS = "ironchestminecarts";
        public static final String IRON_TANKS = "irontank";
        public static final String J_A_B_B_A = "JABBA";
        public static final String KEKZ_TECH = "kekztech";
        public static final String KUBA_TECH = "kubatech";
        public static final String LOGISTICS_PIPES = "LogisticsPipes";
        public static final String MC_FRAMES = "MCFrames";
        public static final String MAGIC_BEES = "MagicBees";
        public static final String MALISIS_DOORS = "malisisdoors";
        public static final String MANTLE = "Mantle";
        public static final String MINE_AND_BLADE_BATTLE_GEAR2 = "battlegear2";
        public static final String MINECRAFT = "minecraft";
        public static final String MINE_TWEAKER = "MineTweaker3";
        public static final String MOBS_INFO = "mobsinfo";
        public static final String N_E_I_CUSTOM_DIAGRAMS = "neicustomdiagram";
        public static final String N_E_I_ORE_PLUGIN = "gtneioreplugin";
        public static final String NATURA = "Natura";
        public static final String NATURES_COMPASS = "naturescompass";
        public static final String NEW_HORIZONS_CORE_MOD = "dreamcraft";
        public static final String NOT_ENOUGH_ITEMS = "NotEnoughItems";
        public static final String OPEN_BLOCKS = "OpenBlocks";
        public static final String OPEN_COMPUTERS = "OpenComputers";
        public static final String OPEN_GLASSES = "openglasses";
        public static final String OPEN_MODULAR_TURRETS = "openmodularturrets";
        public static final String OPEN_PRINTERS = "openprinter";
        public static final String OPEN_SECURITY = "opensecurity";
        public static final String PAMS_HARVEST_CRAFT = "harvestcraft";
        public static final String PAMS_HARVEST_THE_NETHER = "harvestthenether";
        public static final String PLAYER_API = "PlayerAPI";
        public static final String PROJECT_BLUE = "ProjectBlue";
        public static final String PROJECT_RED_CORE = "ProjRed|Core";
        public static final String PROJECT_RED_EXPANSION = "ProjRed|Expansion";
        public static final String PROJECT_RED_EXPLORATION = "ProjRed|Exploration";
        public static final String PROJECT_RED_FABRICATION = "ProjRed|Fabrication";
        public static final String PROJECT_RED_ILLUMINATION = "ProjRed|Illumination";
        public static final String PROJECT_RED_INTEGRATION = "ProjRed|Integration";
        public static final String PROJECT_RED_TRANSMISSION = "ProjRed|Transmission";
        public static final String PROJECT_RED_TRANSPORTATION = "ProjRed|Transportation";
        public static final String QUEST_BOOK = "questbook";
        public static final String RWG = "RWG";
        public static final String RAILCRAFT = "Railcraft";
        public static final String RANDOM_THINGS = "RandomThings";
        public static final String REMOTE_IO = "RIO";
        public static final String S_G_CRAFT = "SGCraft";
        public static final String SLEEPING_BAGS = "sleepingbag";
        public static final String SPICE_OF_LIFE = "SpiceOfLife";
        public static final String STEVES_ADDONS = "StevesAddons";
        public static final String STEVES_CARTS2 = "StevesCarts";
        public static final String STEVES_FACTORY_MANAGER = "StevesFactoryManager";
        public static final String STRUCTURE_LIB = "structurelib";
        public static final String STORAGE_DRAWERS = "StorageDrawers";
        public static final String SUPER_SOLAR_PANELS = "supersolarpanel";
        public static final String TAINTED_MAGIC = "TaintedMagic";
        public static final String TECTECH = "tectech";
        public static final String THAUMCRAFT = "Thaumcraft";
        public static final String THAUMIC_BASES = "thaumicbases";
        public static final String THAUMIC_ENERGISTICS = "thaumicenergistics";
        public static final String THAUMIC_EXPLORATION = "ThaumicExploration";
        public static final String THAUMIC_HORIZONS = "ThaumicHorizons";
        public static final String THAUMIC_BOOTS = "thaumicboots";
        public static final String THAUMIC_MACHINA = "ThaumicMachina";
        public static final String THAUMIC_TINKERER = "ThaumicTinkerer";
        public static final String TINKER_CONSTRUCT = "TConstruct";
        public static final String TINKERS_DEFENCE = "tinkersdefense";
        public static final String TINKERS_GREGWORKS = "TGregworks";
        public static final String TINKERS_MECHWORKS = "TMechworks";
        public static final String TRANSLOCATOR = "Translocator";
        public static final String TRAVELLERS_GEAR = "TravellersGear";
        public static final String TWILIGHT_FOREST = "TwilightForest";
        public static final String UNIVERSAL_SINGULARITIES = "universalsingularities";
        public static final String VISUAL_PROSPECTING = "visualprospecting";
        public static final String WAILA = "Waila";
        public static final String WARP_THEORY = "WarpTheory";
        public static final String WIRELESS_REDSTONE_CBE_ADDONS = "WR-CBE|Addons";
        public static final String WIRELESS_REDSTONE_CBE_CORE = "WR-CBE|Core";
        public static final String WIRELESS_REDSTONE_CBE_LOGIC = "WR-CBE|Logic";
        public static final String WITCHERY = "witchery";
        public static final String WITCHING_GADGETS = "WitchingGadgets";
        public static final String Z_TONES = "Ztones";

        // Do we keep compat of those mods?
        public static final String METALLURGY = "Metallurgy";
        public static final String ROTARY_CRAFT = "RotaryCraft";
        public static final String UNDERGROUND_BIOMES = "UndergroundBiomes";

    }

    public final String ID;
    public final String resourceDomain;
    private Boolean modLoaded;

    Mods(String ID) {
        this.ID = ID;
        this.resourceDomain = ID.toLowerCase(Locale.ENGLISH);
    }

    public boolean isModLoaded() {
        if (this.modLoaded == null) {
            this.modLoaded = Loader.isModLoaded(ID);
        }
        return this.modLoaded;
    }

    public String getResourcePath(String... path) {
        return this.getResourceLocation(path)
            .toString();
    }

    public ResourceLocation getResourceLocation(String... path) {
        return new ResourceLocation(this.resourceDomain, String.join("/", path));
    }
}