package gregtech.api.enums;

import java.util.Locale;

import net.minecraft.util.ResourceLocation;

import cpw.mods.fml.common.Loader;

public enum Mods {

    AdvancedSolarPanel(Names.ADVANCED_SOLAR_PANEL),
    AdventureBackpack(Names.ADVENTURE_BACKPACK),
    AE2FluidCraft(Names.A_E2_FLUID_CRAFT),
    AFSU(Names.A_F_S_U),
    AppleCore(Names.APPLE_CORE),
    AppliedEnergistics2(Names.APPLIED_ENERGISTICS2),
    ArchitectureCraft(Names.ARCHITECTURE_CRAFT),
    Aroma1997Core(Names.AROMA1997_CORE),
    Avaritia(Names.AVARITIA),
    AvaritiaAddons(Names.AVARITIA_ADDONS),
    Backpack(Names.BACKPACK),
    BartWorks(Names.BART_WORKS),
    Baubles(Names.BAUBLES),
    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),
    BiomesOPlenty(Names.BIOMES_O_PLENTY),
    BloodArsenal(Names.BLOOD_ARSENAL),
    BloodMagic(Names.BLOOD_MAGIC),
    Botania(Names.BOTANIA),
    Botany(Names.BOTANY),
    BuildCraftCore(Names.BUILD_CRAFT_CORE),
    BuildCraftFactory(Names.BUILD_CRAFT_FACTORY),
    BuildCraftSilicon(Names.BUILD_CRAFT_SILICON),
    BuildCraftTransport(Names.BUILD_CRAFT_TRANSPORT),
    Chisel(Names.CHISEL),
    COFHCore(Names.C_O_F_H_CORE),
    Computronics(Names.COMPUTRONICS),
    CraftTweaker(Names.CRAFT_TWEAKER),
    CropLoadCore(Names.CROP_LOAD_CORE),
    CropsPlusPlus(Names.CROPS_PLUS_PLUS),
    DraconicEvolution(Names.DRACONIC_EVOLUTION),
    ElectroMagicTools(Names.ELECTRO_MAGIC_TOOLS),
    EnderIO(Names.ENDER_I_O),
    EnderStorage(Names.ENDER_STORAGE),
    EnderZoo(Names.ENDER_ZOO),
    EternalSingularity(Names.ETERNAL_SINGULARITY),
    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),
    Gadomancy(Names.GADOMANCY),
    GalacticraftCore(Names.GALACTICRAFT_CORE),
    GalacticraftMars(Names.GALACTICRAFT_MARS),
    GalactiGreg(Names.GALACTI_GREG),
    GalaxySpace(Names.GALAXY_SPACE),
    Gendustry(Names.GENDUSTRY),
    Genetics(Names.GENETICS),
    GoodGenerator(Names.GOOD_GENERATOR),
    GraviSuite(Names.GRAVI_SUITE),
    GregTech(Names.GREG_TECH),
    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),
    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),
    IronChests(Names.IRON_CHESTS),
    IronTanks(Names.IRON_TANKS),
    JABBA(Names.J_A_B_B_A),
    KekzTech(Names.KEKZ_TECH),
    MagicBees(Names.MAGIC_BEES),
    MalisisDoors(Names.MALISIS_DOORS),
    Mantle(Names.MANTLE),
    MineAndBladeBattleGear2(Names.MINE_AND_BLADE_BATTLE_GEAR2),
    Minecraft(Names.MINECRAFT),
    Natura(Names.NATURA),
    NaturesCompass(Names.NATURES_COMPASS),
    NEICustomDiagrams(Names.N_E_I_CUSTOM_DIAGRAMS),
    NEIOrePlugin(Names.N_E_I_ORE_PLUGIN),
    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),
    ProjectRedCore(Names.PROJECT_RED_CORE),
    ProjectRedIllumination(Names.PROJECT_RED_ILLUMINATION),
    Railcraft(Names.RAILCRAFT),
    RandomThings(Names.RANDOM_THINGS),
    RemoteIO(Names.REMOTE_IO),
    RWG(Names.RWG),
    SGCraft(Names.S_G_CRAFT),
    SleepingBags(Names.SLEEPING_BAGS),
    SpiceOfLife(Names.SPICE_OF_LIFE),
    StevesCarts2(Names.STEVES_CARTS2),
    SuperSolarPanels(Names.SUPER_SOLAR_PANELS),
    TaintedMagic(Names.TAINTED_MAGIC),
    TecTech(Names.TECTECH),
    Thaumcraft(Names.THAUMCRAFT),
    ThaumicBases(Names.THAUMIC_BASES),
    ThaumicEnergistics(Names.THAUMIC_ENERGISTICS),
    ThaumicHorizons(Names.THAUMIC_HORIZONS),
    ThaumicMachina(Names.THAUMIC_MACHINA),
    ThaumicTinkerer(Names.THAUMIC_TINKERER),
    TinkerConstruct(Names.TINKER_CONSTRUCT),
    TinkersGregworks(Names.TINKERS_GREGWORKS),
    Translocator(Names.TRANSLOCATOR),
    TravellersGear(Names.TRAVELLERS_GEAR),
    TwilightForest(Names.TWILIGHT_FOREST),
    UniversalSingularities(Names.UNIVERSAL_SINGULARITIES),
    Waila(Names.WAILA),
    WarpTheory(Names.WARP_THEORY),
    Witchery(Names.WITCHERY),
    WitchingGadgets(Names.WITCHING_GADGETS),
    ZTones(Names.Z_TONES),

    // Do we keep compat of those?
    ArsMagica2(Names.ARS_MAGICA2),
    GanysSurface(Names.GANYS_SURFACE),
    IndustrialCraft2Classic(Names.INDUSTRIAL_CRAFT2_CLASSIC),
    MagicalCrops(Names.MAGICAL_CROPS),
    Metallurgy(Names.METALLURGY),
    RotaryCraft(Names.ROTARY_CRAFT),
    ThermalExpansion(Names.THERMAL_EXPANSION),
    ThermalFondation(Names.THERMAL_FONDATION),
    UndergroundBiomes(Names.UNDERGROUND_BIOMES);

    public static class Names {

        public static final String ADVANCED_SOLAR_PANEL = "AdvancedSolarPanel";
        public static final String ADVENTURE_BACKPACK = "adventurebackpack";
        public static final String A_E2_FLUID_CRAFT = "ae2fc";
        public static final String A_F_S_U = "AFSU";
        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 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_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 BIOMES_O_PLENTY = "BiomesOPlenty";
        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_CORE = "BuildCraft|Core";
        public static final String BUILD_CRAFT_FACTORY = "BuildCraft|Factory";
        public static final String BUILD_CRAFT_SILICON = "BuildCraft|Silicon";
        public static final String BUILD_CRAFT_TRANSPORT = "BuildCraft|Transport";
        public static final String CHISEL = "chisel";
        public static final String C_O_F_H_CORE = "CoFHCore";
        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 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 ETERNAL_SINGULARITY = "eternalsingularity";
        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 GADOMANCY = "gadomancy";
        public static final String GALACTICRAFT_CORE = "GalacticraftCore";
        public static final String GALACTICRAFT_MARS = "GalacticraftMars";
        public static final String GALACTI_GREG = "galacticgreg";
        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 GREG_TECH = "gregtech";
        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 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 IRON_CHESTS = "IronChest";
        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 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 NATURA = "Natura";
        public static final String NATURES_COMPASS = "naturescompass";
        public static final String N_E_I_CUSTOM_DIAGRAMS = "neicustomdiagram";
        public static final String N_E_I_ORE_PLUGIN = "gtneioreplugin";
        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_RED_CORE = "ProjRed|Core";
        public static final String PROJECT_RED_ILLUMINATION = "ProjRed|Illumination";
        public static final String RAILCRAFT = "Railcraft";
        public static final String RANDOM_THINGS = "RandomThings";
        public static final String REMOTE_IO = "RIO";
        public static final String RWG = "RWG";
        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_CARTS2 = "StevesCarts";
        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_HORIZONS = "ThaumicHorizons";
        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_GREGWORKS = "TGregworks";
        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 WAILA = "Waila";
        public static final String WARP_THEORY = "WarpTheory";
        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 ARS_MAGICA2 = "arsmagica2";
        public static final String GANYS_SURFACE = "ganyssurface";
        public static final String INDUSTRIAL_CRAFT2_CLASSIC = "IC2-Classic-Spmod";
        public static final String MAGICAL_CROPS = "magicalcrops";
        public static final String METALLURGY = "Metallurgy";
        public static final String ROTARY_CRAFT = "RotaryCraft";
        public static final String THERMAL_EXPANSION = "ThermalExpansion";
        public static final String THERMAL_FONDATION = "ThermalFoundation";
        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));
    }
}