package main

import (
	"bufio"
	"fmt"
	"math"
	"math/rand"
	"os"
	"strconv"
	"time"
)

func printIntro() {
	fmt.Println("                   Guess")
	fmt.Println("Creative Computing  Morristown, New Jersey")
	fmt.Println()
	fmt.Println()
	fmt.Println()
	fmt.Println("This is a number guessing game. I'll think")
	fmt.Println("of a number between 1 and any limit you want.")
	fmt.Println("Then you have to guess what it is")
}

func getLimit() (int, int) {
	scanner := bufio.NewScanner(os.Stdin)

	for {
		fmt.Println("What limit do you want?")
		scanner.Scan()

		limit, err := strconv.Atoi(scanner.Text())
		if err != nil || limit < 0 {
			fmt.Println("Please enter a number greater or equal to 1")
			continue
		}

		limitGoal := int((math.Log(float64(limit)) / math.Log(2)) + 1)
		return limit, limitGoal
	}

}

func main() {
	rand.Seed(time.Now().UnixNano())
	printIntro()

	scanner := bufio.NewScanner(os.Stdin)

	limit, limitGoal := getLimit()

	guessCount := 1
	stillGuessing := true
	won := false
	myGuess := int(float64(limit)*rand.Float64() + 1)

	fmt.Printf("I'm thinking of a number between 1 and %d\n", limit)
	fmt.Println("Now you try to guess what it is.")

	for stillGuessing {
		scanner.Scan()
		n, err := strconv.Atoi(scanner.Text())
		if err != nil {
			fmt.Println("Please enter a number greater or equal to 1")
			continue
		}

		if n < 0 {
			break
		}

		fmt.Print("\n\n\n")
		if n < myGuess {
			fmt.Println("Too low. Try a bigger answer")
			guessCount += 1
		} else if n > myGuess {
			fmt.Println("Too high. Try a smaller answer")
			guessCount += 1
		} else {
			fmt.Printf("That's it! You got it in %d tries\n", guessCount)
			won = true
			stillGuessing = false
		}
	}

	if won {
		if guessCount < limitGoal {
			fmt.Println("Very good.")
		} else if guessCount == limitGoal {
			fmt.Println("Good.")
		} else {
			fmt.Printf("You should have been able to get it in only %d guesses.\n", limitGoal)
		}
		fmt.Print("\n\n\n")
	}
}
