package beer

import (
	"errors"
	"strconv"
	"strings"
)

// buildBase builds the basic "x bottle(s) of beer"
func buildBase(num int) string {
	var ret string
	if num == 0 {
		ret = "No more"
	} else {
		ret = strconv.Itoa(num)
	}
	ret += " bottle"
	if num != 1 {
		ret += "s"
	}
	ret += " of beer"
	return ret
}

// Verse generates a single verse
func Verse(num int) (string, error) {
	var ret string
	if num > 99 || num < 0 {
		return "", errors.New("Invalid verse requested")
	}
	ret += buildBase(num) + " on the wall, " + strings.ToLower(buildBase(num)) + ".\n"
	if num == 0 {
		ret += "Go to the store and buy some more, " + buildBase(99) + " on the wall.\n"
	} else {
		ret += "Take "
		if num == 1 {
			ret += "it "
		} else {
			ret += "one "
		}
		ret += "down and pass it around, " + strings.ToLower(buildBase(num-1)) + " on the wall.\n"
	}
	return ret, nil
}

// Verses generates all verses starting at 'st' and going to 'end'
func Verses(st, end int) (string, error) {
	if st < end {
		return "", errors.New("Start less than stop")
	}
	var r, ret string
	var err error
	for i := st; i >= end; i-- {
		if r, err = Verse(i); err != nil {
			return "", err
		}
		ret += r + "\n"
	}
	return ret, nil
}

// Song generates the entire song (all 100 verses)
func Song() string {
	r, _ := Verses(99, 0)
	return r
}
