package effect

// Register registers an Effect with a specific ID to translate from and to on disk and network. An Effect
// instance may be created by creating a struct instance in this package like
// effect.regeneration{}.
func Register(id int, e Type) {
	effects[id] = e
	effectIds[e] = id
}

// init registers all implemented effects.
func init() {
	Register(1, Speed)
	Register(2, Slowness)
	Register(3, Haste)
	Register(4, MiningFatigue)
	Register(5, Strength)
	Register(6, InstantHealth)
	Register(7, InstantDamage)
	Register(8, JumpBoost)
	Register(9, Nausea)
	Register(10, Regeneration)
	Register(11, Resistance)
	Register(12, FireResistance)
	Register(13, WaterBreathing)
	Register(14, Invisibility)
	Register(15, Blindness)
	Register(16, NightVision)
	Register(17, Hunger)
	Register(18, Weakness)
	Register(19, Poison)
	Register(20, Wither)
	Register(21, HealthBoost)
	Register(22, Absorption)
	Register(23, Saturation)
	Register(24, Levitation)
	Register(25, FatalPoison)
	Register(26, ConduitPower)
	Register(27, SlowFalling)
	// TODO: (28) Bad omen. (Requires villages ...)
	// TODO: (29) Hero of the village. (Requires villages ...)
	Register(30, Darkness)
}

var (
	effects   = map[int]Type{}
	effectIds = map[Type]int{}
)

// ByID attempts to return an effect by the ID it was registered with. If found, the effect found
// is returned and the bool true.
func ByID(id int) (Type, bool) {
	effect, ok := effects[id]
	return effect, ok
}

// ID attempts to return the ID an effect was registered with. If found, the id is returned and
// the bool true.
func ID(e Type) (int, bool) {
	id, ok := effectIds[e]
	return id, ok
}
