// NOT DREW's BUT HAS GOOD INPUT COMMAND PROCESSING
package main

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

type Animal struct {
	food       string
	locomotion string
	noise      string
}

func (a *Animal) Eat() string {
	return a.food
}

func (a *Animal) Move() string {
	return a.locomotion
}

func (a *Animal) Speak() string {
	return a.noise
}

func main() {

	cow := Animal{"grass", "walk", "moo"}
	bird := Animal{"worms", "fly", "peep"}
	snake := Animal{"mice", "slither", "hsss"}

	var input string
	var animal string
	var information string

	for {

		fmt.Println("Hello. Enter in a line with a space separation an animal (cow, bird, or snake) and the information requested (eat, move or speak): ")

		scanner := bufio.NewScanner(os.Stdin)
		scanner.Scan()
		input = scanner.Text()

		input = strings.TrimSpace(input)
		numberStrings := strings.Fields(input)

		for _, item := range numberStrings {
			if item == "cow" || item == "bird" || item == "snake" {
				animal = item
			}

			if item == "eat" || item == "move" || item == "speak" {
				information = item
			}
		}

		var selectedAnimal *Animal

		switch animal {
		case "cow":
			selectedAnimal = &cow
		case "bird":
			selectedAnimal = &bird
		case "snake":
			selectedAnimal = &snake
		default:
			fmt.Println("Invalid animal. Please, enter 'cow', 'bird' or 'snake'")
			animal = ""
			information = ""
			continue
		}

		switch information {
		case "eat":
			fmt.Println("The action for the selected animal is: ", selectedAnimal.Eat())
		case "move":
			fmt.Println("The action for the selected animal is: ", selectedAnimal.Move())
		case "speak":
			fmt.Println("The action for the selected animal is: ", selectedAnimal.Speak())
		default:
			fmt.Println("Invalid action. Please, enter 'eat', 'move' or 'speak'")
			animal = ""
			information = ""
			continue
		}

		animal = ""
		information = ""

	}

}