package item

// FireworkShape represents a shape of a firework.
type FireworkShape struct {
	fireworkShape
}

// FireworkShapeSmallSphere is a small sphere firework.
func FireworkShapeSmallSphere() FireworkShape {
	return FireworkShape{0}
}

// FireworkShapeHugeSphere is a huge sphere firework.
func FireworkShapeHugeSphere() FireworkShape {
	return FireworkShape{1}
}

// FireworkShapeStar is a star firework.
func FireworkShapeStar() FireworkShape {
	return FireworkShape{2}
}

// FireworkShapeCreeperHead is a creeper head firework.
func FireworkShapeCreeperHead() FireworkShape {
	return FireworkShape{3}
}

// FireworkShapeBurst is a burst firework.
func FireworkShapeBurst() FireworkShape {
	return FireworkShape{4}
}

type fireworkShape uint8

// Uint8 returns the firework as a uint8.
func (f fireworkShape) Uint8() uint8 {
	return uint8(f)
}

// Name ...
func (f fireworkShape) Name() string {
	switch f {
	case 0:
		return "Small Sphere"
	case 1:
		return "Huge Sphere"
	case 2:
		return "Star"
	case 3:
		return "Creeper Head"
	case 4:
		return "Burst"
	}
	panic("unknown firework type")
}

// String ...
func (f fireworkShape) String() string {
	switch f {
	case 0:
		return "small_sphere"
	case 1:
		return "huge_sphere"
	case 2:
		return "star"
	case 3:
		return "creeper_head"
	case 4:
		return "burst"
	}
	panic("unknown firework type")
}

// FireworkShapes ...
func FireworkShapes() []FireworkShape {
	return []FireworkShape{FireworkShapeSmallSphere(), FireworkShapeHugeSphere(), FireworkShapeStar(), FireworkShapeCreeperHead(), FireworkShapeBurst()}
}
