package emu.grasscutter.game.props;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;

public enum GrowCurve {
	GROW_CURVE_NONE(0),
	GROW_CURVE_HP(1),
	GROW_CURVE_ATTACK(2),
	GROW_CURVE_STAMINA(3),
	GROW_CURVE_STRIKE(4),
	GROW_CURVE_ANTI_STRIKE(5),
	GROW_CURVE_ANTI_STRIKE1(6),
	GROW_CURVE_ANTI_STRIKE2(7),
	GROW_CURVE_ANTI_STRIKE3(8),
	GROW_CURVE_STRIKE_HURT(9),
	GROW_CURVE_ELEMENT(10),
	GROW_CURVE_KILL_EXP(11),
	GROW_CURVE_DEFENSE(12),
	GROW_CURVE_ATTACK_BOMB(13),
	GROW_CURVE_HP_LITTLEMONSTER(14),
	GROW_CURVE_ELEMENT_MASTERY(15),
	GROW_CURVE_PROGRESSION(16),
	GROW_CURVE_DEFENDING(17),
	GROW_CURVE_MHP(18),
	GROW_CURVE_MATK(19),
	GROW_CURVE_TOWERATK(20),
	GROW_CURVE_HP_S5(21),
	GROW_CURVE_HP_S4(22),
	GROW_CURVE_HP_2(23),
	GROW_CURVE_ATTACK_S5(31),
	GROW_CURVE_ATTACK_S4(32),
	GROW_CURVE_ATTACK_S3(33),
	GROW_CURVE_STRIKE_S5(34),
	GROW_CURVE_DEFENSE_S5(41),
	GROW_CURVE_DEFENSE_S4(42),
	GROW_CURVE_ATTACK_101(1101),
	GROW_CURVE_ATTACK_102(1102),
	GROW_CURVE_ATTACK_103(1103),
	GROW_CURVE_ATTACK_104(1104),
	GROW_CURVE_ATTACK_105(1105),
	GROW_CURVE_ATTACK_201(1201),
	GROW_CURVE_ATTACK_202(1202),
	GROW_CURVE_ATTACK_203(1203),
	GROW_CURVE_ATTACK_204(1204),
	GROW_CURVE_ATTACK_205(1205),
	GROW_CURVE_ATTACK_301(1301),
	GROW_CURVE_ATTACK_302(1302),
	GROW_CURVE_ATTACK_303(1303),
	GROW_CURVE_ATTACK_304(1304),
	GROW_CURVE_ATTACK_305(1305),
	GROW_CURVE_CRITICAL_101(2101),
	GROW_CURVE_CRITICAL_102(2102),
	GROW_CURVE_CRITICAL_103(2103),
	GROW_CURVE_CRITICAL_104(2104),
	GROW_CURVE_CRITICAL_105(2105),
	GROW_CURVE_CRITICAL_201(2201),
	GROW_CURVE_CRITICAL_202(2202),
	GROW_CURVE_CRITICAL_203(2203),
	GROW_CURVE_CRITICAL_204(2204),
	GROW_CURVE_CRITICAL_205(2205),
	GROW_CURVE_CRITICAL_301(2301),
	GROW_CURVE_CRITICAL_302(2302),
	GROW_CURVE_CRITICAL_303(2303),
	GROW_CURVE_CRITICAL_304(2304),
	GROW_CURVE_CRITICAL_305(2305);
	
	private final int id;
	private static final Int2ObjectMap<GrowCurve> map = new Int2ObjectOpenHashMap<>();
	private static final Map<String, GrowCurve> stringMap = new HashMap<>();
	
	public static final int[] fightProps = new int[] {1, 4, 7, 20, 21, 22, 23, 26, 27, 28, 29, 30, 40, 41, 42, 43, 44, 45, 46, 50, 51, 52, 53, 54, 55, 56, 2000, 2001, 2002, 2003, 1010};
	
	static {
		Stream.of(values()).forEach(e -> {
			map.put(e.getId(), e);
			stringMap.put(e.name(), e);
		});
	}
	
	private GrowCurve(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}
	
	public static GrowCurve getPropById(int value) {
		return map.getOrDefault(value, GROW_CURVE_NONE);
	}
	
	public static GrowCurve getPropByName(String name) {
		return stringMap.getOrDefault(name, GROW_CURVE_NONE);
	}
}
