package kindergarten

import (
	"errors"
	"sort"
	"strings"
)

type Garden struct {
	children []string
	rows     []string
}

func NewGarden(diagram string, children []string) (*Garden, error) {
	var err error
	g := new(Garden)
	g.rows = strings.Split(diagram[1:], "\n")
	g.children = children
	if diagram[0] != '\n' {
		err = errors.New("Wrong diagram format")
	} else if len(g.rows) == 0 {
		err = errors.New("No rows")
	} else if len(g.children) == 0 {
		err = errors.New("No children")
	} else if len(g.rows[0]) != len(g.rows[1]) {
		err = errors.New("Mismatched rows")
	} else {
		for i := range g.rows {
			if len(g.rows[i])%2 != 0 {
				err = errors.New("Odd number of cups")
				break
			}
			for j := range g.rows[i] {
				tst := g.rows[i][j]
				switch tst {
				case 'R':
				case 'C':
				case 'G':
				case 'V':
				default:
					err = errors.New("Invalid Cup Codes")
				}
			}
			if err != nil {
				break
			}
		}
		for i := range g.children {
			if i > 0 {
				if g.children[i] == g.children[i-1] {
					err = errors.New("Duplicate Children")
					break
				}
			}
		}
	}
	return g, err
}

func (g *Garden) Plants(child string) ([]string, bool) {
	var i int
	var ret []string
	var found bool
	c := g.children
	sort.Strings(c)
	for i = 0; i < len(c); i++ {
		if c[i] == child {
			found = true
			break
		}
	}
	if !found || len(g.rows) == 0 || len(g.rows[0]) <= 2*i {
		return ret, found
	}
	for j := range []int{0, 1} {
		for k := range []int{0, 1} {
			switch g.rows[j][(i*2 + k)] {
			case 'G':
				ret = append(ret, "grass")
			case 'C':
				ret = append(ret, "clover")
			case 'R':
				ret = append(ret, "radishes")
			case 'V':
				ret = append(ret, "violets")
			}
		}
	}
	return ret, found
}

//	kindergarten_garden_test.go:140: Garden 6 lookup Patricia =
// [radishes radishes grass clover], want [violets clover radishes violets].
