package ocr

import "strings"

// recognizeDigit takes a 3x4 grid of pipes, underscores, and spaces
// and determines the digit represented.
func recognizeDigit(in string) string {
	switch in {
	case "\n _ \n| |\n|_|\n   ":
		return "0"
	case "\n   \n  |\n  |\n   ":
		return "1"
	case "\n _ \n _|\n|_ \n   ":
		return "2"
	case "\n _ \n _|\n _|\n   ":
		return "3"
	case "\n   \n|_|\n  |\n   ":
		return "4"
	case "\n _ \n|_ \n _|\n   ":
		return "5"
	case "\n _ \n|_ \n|_|\n   ":
		return "6"
	case "\n _ \n  |\n  |\n   ":
		return "7"
	case "\n _ \n|_|\n|_|\n   ":
		return "8"
	case "\n _ \n|_|\n _|\n   ":
		return "9"
	}
	return "?"
}

// parseChar takes 3 lines and a number and returns
// the string value of that character
func parseChar(lines []string, num int) string {
	startIdx := 3 * num
	lenNeed := startIdx + 3
	if len(lines[0]) < lenNeed || len(lines[1]) < lenNeed {
		return ""
	}
	char := "\n" + lines[0][(startIdx+0):(startIdx+3)]
	char += "\n" + lines[1][(startIdx+0):(startIdx+3)]
	char += "\n" + lines[2][(startIdx+0):(startIdx+3)]
	char += "\n" + lines[3][(startIdx+0):(startIdx+3)]
	return recognizeDigit(char)
}

// Recognize takes a string, splits it up by \n and
// then sends 4 line chunks and calls parseChar on it
func Recognize(in string) []string {
	var ret []string
	lines := strings.Split(in, "\n")
	numRet := len(lines) / 4
	for i := 0; i < numRet; i++ {
		var retString string
		startIdx := (i * 4) + 1
		procLines := lines[startIdx : startIdx+4]
		numChars := len(lines[startIdx]) / 3
		for j := 0; j < numChars; j++ {
			retString += parseChar(procLines, j)
		}
		ret = append(ret, retString)
	}
	return ret
}
