package gtPlusPlus.xmod.thaumcraft.aspect;

import gregtech.api.enums.TC_Aspects;
import gregtech.common.GT_ThaumcraftCompat;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.util.Utils;
import gtPlusPlus.xmod.thaumcraft.objects.wrapper.aspect.TC_AspectList_Wrapper;
import gtPlusPlus.xmod.thaumcraft.objects.wrapper.aspect.TC_Aspect_Wrapper;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import net.minecraft.util.ResourceLocation;

public class GTPP_AspectCompat {

    public static volatile Method m = null;

    private static HashMap<String, TC_Aspect_Wrapper> mAspectCache = new LinkedHashMap<String, TC_Aspect_Wrapper>();

    public static TC_Aspect_Wrapper ASPECT_BALANCE;
    public static TC_Aspect_Wrapper ASPECT_LUST;
    public static TC_Aspect_Wrapper ASPECT_STARBOUND;
    public static TC_Aspect_Wrapper ASPECT_TOXIC;
    public static TC_Aspect_Wrapper ASPECT_HEAVEN;

    /*	TC_Aspects.AER.mAspect = Aspect.AIR;
    TC_Aspects.ALIENIS.mAspect = Aspect.ELDRITCH;
    TC_Aspects.AQUA.mAspect = Aspect.WATER;
    TC_Aspects.ARBOR.mAspect = Aspect.TREE;
    TC_Aspects.AURAM.mAspect = Aspect.AURA;
    TC_Aspects.BESTIA.mAspect = Aspect.BEAST;
    TC_Aspects.COGNITIO.mAspect = Aspect.MIND;
    TC_Aspects.CORPUS.mAspect = Aspect.FLESH;
    TC_Aspects.EXANIMIS.mAspect = Aspect.UNDEAD;
    TC_Aspects.FABRICO.mAspect = Aspect.CRAFT;
    TC_Aspects.FAMES.mAspect = Aspect.HUNGER;
    TC_Aspects.GELUM.mAspect = Aspect.COLD;
    TC_Aspects.GRANUM.mAspect = Aspect.PLANT;
    TC_Aspects.HERBA.mAspect = Aspect.PLANT;
    TC_Aspects.HUMANUS.mAspect = Aspect.MAN;
    TC_Aspects.IGNIS.mAspect = Aspect.FIRE;
    TC_Aspects.INSTRUMENTUM.mAspect = Aspect.TOOL;
    TC_Aspects.ITER.mAspect = Aspect.TRAVEL;
    TC_Aspects.LIMUS.mAspect = Aspect.SLIME;
    TC_Aspects.LUCRUM.mAspect = Aspect.GREED;
    TC_Aspects.LUX.mAspect = Aspect.LIGHT;
    TC_Aspects.MACHINA.mAspect = Aspect.MECHANISM;
    TC_Aspects.MESSIS.mAspect = Aspect.CROP;
    TC_Aspects.METALLUM.mAspect = Aspect.METAL;
    TC_Aspects.METO.mAspect = Aspect.HARVEST;
    TC_Aspects.MORTUUS.mAspect = Aspect.DEATH;
    TC_Aspects.MOTUS.mAspect = Aspect.MOTION;
    TC_Aspects.ORDO.mAspect = Aspect.ORDER;
    TC_Aspects.PANNUS.mAspect = Aspect.CLOTH;
    TC_Aspects.PERDITIO.mAspect = Aspect.ENTROPY;
    TC_Aspects.PERFODIO.mAspect = Aspect.MINE;
    TC_Aspects.PERMUTATIO.mAspect = Aspect.EXCHANGE;
    TC_Aspects.POTENTIA.mAspect = Aspect.ENERGY;
    TC_Aspects.PRAECANTATIO.mAspect = Aspect.MAGIC;
    TC_Aspects.SANO.mAspect = Aspect.HEAL;
    TC_Aspects.SENSUS.mAspect = Aspect.SENSES;
    TC_Aspects.SPIRITUS.mAspect = Aspect.SOUL;
    TC_Aspects.TELUM.mAspect = Aspect.WEAPON;
    TC_Aspects.TERRA.mAspect = Aspect.EARTH;
    TC_Aspects.TEMPESTAS.mAspect = Aspect.WEATHER;
    TC_Aspects.TENEBRAE.mAspect = Aspect.DARKNESS;
    TC_Aspects.TUTAMEN.mAspect = Aspect.ARMOR;
    TC_Aspects.VACUOS.mAspect = Aspect.VOID;
    TC_Aspects.VENENUM.mAspect = Aspect.POISON;
    TC_Aspects.VICTUS.mAspect = Aspect.LIFE;
    TC_Aspects.VINCULUM.mAspect = Aspect.TRAP;
    TC_Aspects.VITIUM.mAspect = Aspect.TAINT;
    TC_Aspects.VITREUS.mAspect = Aspect.CRYSTAL;
    TC_Aspects.VOLATUS.mAspect = Aspect.FLIGHT;*/

    public GTPP_AspectCompat() {

        // Generate all existing Aspects as TC_Aspects
        LinkedHashMap<String, Object> h = TC_Aspect_Wrapper.getVanillaAspectList();
        for (String g : h.keySet()) {
            Object aBaseAspect = h.get(g);
            if (aBaseAspect != null && TC_Aspect_Wrapper.isObjectAnAspect(aBaseAspect)) {
                TC_Aspect_Wrapper aS = TC_Aspect_Wrapper.getAspect(g);
                if (aS != null) {
                    mAspectCache.put(g, aS);
                    continue;
                }
            }
        }

        // Custom Aspects
        ASPECT_BALANCE = new TC_Aspect_Wrapper(
                "Sagrausten",
                Utils.rgbtoHexValue(125, 125, 125),
                new TC_Aspect_Wrapper[] {ASPECT_STARBOUND, get(TC_Aspects.RADIO)},
                new ResourceLocation(CORE.MODID + ":textures/aspects/" + "Sagrausten.png"),
                false,
                1,
                "Ancient Knowledge");

        ASPECT_LUST = new TC_Aspect_Wrapper(
                "Slusium",
                Utils.rgbtoHexValue(175, 125, 25),
                new TC_Aspect_Wrapper[] {ASPECT_BALANCE, get(TC_Aspects.NEBRISUM)},
                new ResourceLocation(CORE.MODID + ":textures/aspects/" + "Slusium.png"),
                false,
                1,
                "Warped Thoughts");

        ASPECT_STARBOUND = new TC_Aspect_Wrapper(
                "Xenil",
                Utils.rgbtoHexValue(25, 25, 25),
                new TC_Aspect_Wrapper[] {get(TC_Aspects.MAGNETO), get(TC_Aspects.RADIO)},
                new ResourceLocation(CORE.MODID + ":textures/aspects/" + "Xenil.png"),
                false,
                1,
                "A beginning to something new");

        ASPECT_TOXIC = new TC_Aspect_Wrapper(
                "Xablum",
                Utils.rgbtoHexValue(25, 185, 25),
                new TC_Aspect_Wrapper[] {ASPECT_STARBOUND, ASPECT_LUST},
                new ResourceLocation(CORE.MODID + ":textures/aspects/" + "Xablum.png"),
                false,
                1,
                "Insanity");

        ASPECT_HEAVEN = new TC_Aspect_Wrapper(
                "Zetralt",
                Utils.rgbtoHexValue(225, 225, 225),
                new TC_Aspect_Wrapper[] {get(TC_Aspects.AURAM), ASPECT_TOXIC},
                new ResourceLocation(CORE.MODID + ":textures/aspects/" + "Zetralt.png"),
                false,
                1,
                "Control, Respect, Glory");
    }

    private TC_Aspect_Wrapper get(TC_Aspects aGtObjects) {
        try {
            return TC_Aspect_Wrapper.generate(aGtObjects.mAspect);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static final synchronized TC_AspectList_Wrapper getTC_AspectList_Wrapper(
            final List<GTPP_AspectStack> aAspects) {
        TC_AspectList_Wrapper o = null;
        try {
            if (m == null || (m != null && !m.isAccessible())) {
                m = GT_ThaumcraftCompat.class.getDeclaredMethod("getTC_AspectList_Wrapper", List.class);
                m.setAccessible(true);
            }
            if (m != null) {
                o = (TC_AspectList_Wrapper) m.invoke(null, aAspects);
            }
        } catch (NoSuchMethodException
                | SecurityException
                | IllegalAccessException
                | IllegalArgumentException
                | InvocationTargetException e) {
            e.printStackTrace();
        }
        if (o == null) {
            Logger.REFLECTION("[Aspect] Did not retrieve valid aspect list from reflective invocation.");
        }
        return o;
    }
}