// Copyright 2016 Canonical Ltd.
// Licensed under the LGPLv3, see LICENCE file for details.

package ansiterm

const (
	_ Color = iota
	Default
	Black
	Red
	Green
	Yellow
	Blue
	Magenta
	Cyan
	Gray
	DarkGray
	BrightRed
	BrightGreen
	BrightYellow
	BrightBlue
	BrightMagenta
	BrightCyan
	White
)

// Color represents one of the standard 16 ANSI colors.
type Color int

// String returns the name of the color.
func (c Color) String() string {
	switch c {
	case Default:
		return "default"
	case Black:
		return "black"
	case Red:
		return "red"
	case Green:
		return "green"
	case Yellow:
		return "yellow"
	case Blue:
		return "blue"
	case Magenta:
		return "magenta"
	case Cyan:
		return "cyan"
	case Gray:
		return "gray"
	case DarkGray:
		return "darkgray"
	case BrightRed:
		return "brightred"
	case BrightGreen:
		return "brightgreen"
	case BrightYellow:
		return "brightyellow"
	case BrightBlue:
		return "brightblue"
	case BrightMagenta:
		return "brightmagenta"
	case BrightCyan:
		return "brightcyan"
	case White:
		return "white"
	default:
		return ""
	}
}

func (c Color) foreground() attribute {
	switch c {
	case Default:
		return 39
	case Black:
		return 30
	case Red:
		return 31
	case Green:
		return 32
	case Yellow:
		return 33
	case Blue:
		return 34
	case Magenta:
		return 35
	case Cyan:
		return 36
	case Gray:
		return 37
	case DarkGray:
		return 90
	case BrightRed:
		return 91
	case BrightGreen:
		return 92
	case BrightYellow:
		return 93
	case BrightBlue:
		return 94
	case BrightMagenta:
		return 95
	case BrightCyan:
		return 96
	case White:
		return 97
	default:
		return unknownAttribute
	}
}

func (c Color) background() attribute {
	value := c.foreground()
	if value != unknownAttribute {
		return value + 10
	}
	return value
}