package jesse.keeblarcraft.FactionMgr;

import com.google.common.collect.Range;
import com.google.common.collect.RangeMap;
import com.google.common.collect.TreeRangeMap;

public class FactionTier {
    public static enum FactionTierEnum {
        TIER_INVALID,
        TIER_I,
        TIER_II,
        TIER_III,
        TIER_IV,
        TIER_V,
        TIER_VI
    }

    private static RangeMap<Integer, FactionTierEnum> factionTiers = TreeRangeMap.create();

    public static void InitializeFactionTiers() {
        factionTiers.put(Range.closed(0, 29), FactionTierEnum.TIER_I);
        factionTiers.put(Range.closed(30, 74), FactionTierEnum.TIER_II);
        factionTiers.put(Range.closed(75, 99), FactionTierEnum.TIER_III);
        factionTiers.put(Range.closed(100, 149), FactionTierEnum.TIER_IV);
        factionTiers.put(Range.closed(150, 999), FactionTierEnum.TIER_V);
        factionTiers.put(Range.closed(1000, Integer.MAX_VALUE), FactionTierEnum.TIER_VI);
    }

    // Tier 1 can never be greater than anything (and not itself, obviously)
    public static Boolean IsGreaterThan(FactionTierEnum tierInQuestion, FactionTierEnum tierToCompareAgainst) {
        Boolean isGreater = false;

        if (tierInQuestion == FactionTierEnum.TIER_II && tierToCompareAgainst == FactionTierEnum.TIER_I) {
            isGreater = true;
        } else if (tierInQuestion == FactionTierEnum.TIER_III && (tierToCompareAgainst == FactionTierEnum.TIER_II || tierToCompareAgainst == FactionTierEnum.TIER_I)) {
            isGreater = true;
        } else if (tierInQuestion == FactionTierEnum.TIER_IV && (tierToCompareAgainst == FactionTierEnum.TIER_III || tierToCompareAgainst == FactionTierEnum.TIER_II || tierToCompareAgainst == FactionTierEnum.TIER_I)) {
            isGreater = true;
        } else if (tierInQuestion == FactionTierEnum.TIER_V && (tierToCompareAgainst == FactionTierEnum.TIER_IV || tierToCompareAgainst == FactionTierEnum.TIER_III || tierToCompareAgainst == FactionTierEnum.TIER_II || tierToCompareAgainst == FactionTierEnum.TIER_I)) {
            isGreater = true;
        } else if (tierInQuestion == FactionTierEnum.TIER_VI && (tierToCompareAgainst == FactionTierEnum.TIER_V || tierToCompareAgainst == FactionTierEnum.TIER_IV || tierToCompareAgainst == FactionTierEnum.TIER_III || tierToCompareAgainst == FactionTierEnum.TIER_II || tierToCompareAgainst == FactionTierEnum.TIER_I)) {
            isGreater = true;
        }
        return isGreater;
    }

    public static Boolean IsEqualTo(FactionTierEnum tierInQuestion, FactionTierEnum tierToCompareAgainst) {
        return tierInQuestion == tierToCompareAgainst;
    }

    public static Boolean IsGreaterOrEqualTo(FactionTierEnum tierInQuestion, FactionTierEnum tierToCompareAgainst) {
        return IsEqualTo(tierInQuestion, tierToCompareAgainst) || IsGreaterThan(tierInQuestion, tierToCompareAgainst);
    }

    // Make sure you initialize tiers by calling the above function first!
    public static FactionTierEnum GetFactionTier(Integer value) {
        FactionTierEnum tier = factionTiers.get(value);

        if (tier == null) {
            tier = FactionTierEnum.TIER_INVALID;
        }

        return tier;
    }
}
