package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func splitUnpack(s string) (string, string, string) {
	x := strings.Split(s, " ")
	return x[0], x[1], x[2]
}

type Animal interface {
	Eat()
	Move()
	Speak()
}

type Cow struct{}

type Bird struct{}

type Snake struct{}

func (an Snake) Eat() {
	fmt.Println("mice")
}

func (an Snake) Move() {
	fmt.Println("slither")
}

func (an Snake) Speak() {
	fmt.Println("hsss")
}

func (an Bird) Eat() {
	fmt.Println("worms")
}

func (an Bird) Move() {
	fmt.Println("fly")
}

func (an Bird) Speak() {
	fmt.Println("peep")
}

func (an Cow) Eat() {
	fmt.Println("grass")
}

func (an Cow) Move() {
	fmt.Println("walk")
}

func (an Cow) Speak() {
	fmt.Println("moo")
}

func newanimal(i1, i2 string, cages map[string]Animal) {
	switch i2 {
	case "cow":
		cages[i1] = Cow{}
	case "snake":
		cages[i1] = Snake{}
	case "bird":
		cages[i1] = Bird{}
	}
	fmt.Println("Created it!")
}

func query(i1, i2 string, cages map[string]Animal) {
	switch i2 {
	case "speak":
		cages[i1].Speak()
	case "move":
		cages[i1].Move()
	case "eat":
		cages[i1].Eat()
	}
}

func main() {

	scanner := bufio.NewScanner(os.Stdin)
	var commandtype string
	var input1 string
	var input2 string
	animalCages := make(map[string]Animal)

	for {
		fmt.Println(">")
		scanner.Scan()
		commandtype, input1, input2 = splitUnpack(scanner.Text())
		if commandtype == "newanimal" {
			newanimal(input1, input2, animalCages)
		} else if commandtype == "query" {
			query(input1, input2, animalCages)
		}
	}

}
