package main

import (
	"fmt"
	"strings"

	"github.com/fatih/color"
)

var colorCache = map[string]*color.Color{}

func makeColor(colorSpec string) (c *color.Color) {
	// caching
	if c, ok := colorCache[colorSpec]; ok {
		return c
	}
	defer func() { colorCache[colorSpec] = c }()

	splits := strings.Split(colorSpec, ",")
	name := strings.TrimSpace(splits[0])

	c = color.New()

	switch name {
	case "black":
		c.Add(color.FgBlack)
	case "red":
		c.Add(color.FgRed)
	case "green":
		c.Add(color.FgGreen)
	case "yellow":
		c.Add(color.FgYellow)
	case "blue":
		c.Add(color.FgBlue)
	case "magenta":
		c.Add(color.FgMagenta)
	case "cyan":
		c.Add(color.FgCyan)
	case "white":
		c.Add(color.FgWhite)
	case "":
	default:
		panic("unknown color name. valid color names: black, red, green, yellow, blue, magenta, cyan, white")
	}

	if len(splits) >= 2 {
		attr := splits[1]

		switch attr {
		case "bold":
			fmt.Println("bold")
			c.Add(color.Bold)
		case "faint":
			fmt.Println("faint")
			c.Add(color.Faint)
		case "italic":
			fmt.Println("italic")
			c.Add(color.Italic)
		case "underline":
			fmt.Println("underline")
			c.Add(color.Underline)
		case "blink_slow":
			fmt.Println("blink_slow")
			c.Add(color.BlinkSlow)
		case "blink_rapid":
			fmt.Println("blink_rapid")
			c.Add(color.BlinkRapid)
		case "reverse_video":
			fmt.Println("reverse_video")
			c.Add(color.ReverseVideo)
		case "concealed":
			fmt.Println("concealed")
			c.Add(color.Concealed)
		case "crossed_out":
			fmt.Println("crossed_out")
			c.Add(color.CrossedOut)
		case "":
			fmt.Println("")
		default:
			panic("unknown attribute. valid attributes: bold, faint, italic, underline, blink_slow, blink_rapid, reverse_video, concealed, crossed_out")
		}
	}

	return c
}