package main

import (
	"math/rand"
	"github.com/awesome-gocui/gocui"
)

//w.v.SelBgColor = gocui.ColorCyan
//color.go:       w.v.SelFgColor = gocui.ColorBlack
//color.go:               w.v.BgColor = gocui.ColorGreen

type colorT struct {
	frame gocui.Attribute
	fg gocui.Attribute
	bg gocui.Attribute
	selFg gocui.Attribute
	selBg gocui.Attribute
	name string
}

var none gocui.Attribute = gocui.AttrNone
var lightPurple gocui.Attribute = gocui.GetColor("#DDDDDD") // light purple
var darkPurple gocui.Attribute = gocui.GetColor("#FFAA55")  // Dark Purple
var heavyPurple gocui.Attribute = gocui.GetColor("#88AA55") // heavy purple
var powdererBlue gocui.Attribute = gocui.GetColor("#B0E0E6") // w3c 'powerder blue'
var superLightGrey gocui.Attribute = gocui.GetColor("#55AAFF") // super light grey

// Standard defined colors from gocui:
// ColorBlack ColorRed ColorGreen ColorYellow ColorBlue ColorMagenta ColorCyan ColorWhite

// v.BgColor = gocui.GetColor("#111111") // crazy red
// v.BgColor = gocui.GetColor("#FF9911") // heavy red
// v.SelBgColor = gocui.GetColor("#FFEE11") // blood red

// v.BgColor = gocui.GetColor("#55AAFF") // super light grey
// v.BgColor = gocui.GetColor("#FFC0CB") // 'w3c pink' yellow

//                                                                 Normal Text                             On mouseover
//                                     Widget Frame         Text              background              Text           background
var colorWindow  colorT       = colorT{ none         ,    gocui.ColorBlue,   none            ,   none           ,   powdererBlue   ,  "normal window"}
var colorActiveW colorT       = colorT{ none         ,    none           ,   powdererBlue    ,   none           ,   powdererBlue   ,  "active window"}

var colorTab     colorT       = colorT{gocui.ColorBlue,   gocui.ColorBlue,   none            ,   none          ,    powdererBlue   ,  "normal tab"}
var colorActiveT colorT       = colorT{gocui.ColorBlue,   none           ,   powdererBlue    ,   none          ,    powdererBlue   ,  "active tab"}

var colorButton  colorT       = colorT{gocui.ColorGreen,  none          ,    gocui.ColorWhite,   gocui.ColorGreen,  gocui.ColorBlack, "normal button"}
var colorLabel   colorT       = colorT{ none           ,  none          ,    superLightGrey  ,   none            ,  superLightGrey  , "normal label"}
var colorGroup   colorT       = colorT{ none           ,  none          ,    superLightGrey  ,   none            ,  superLightGrey  , "normal group"}

// widget debugging colors. these widgets aren't displayed unless you are debugging
var colorRoot    colorT       = colorT{gocui.ColorRed ,   none          ,    powdererBlue  ,     none          ,    gocui.ColorBlue,  "debug root"}
var colorFlag    colorT       = colorT{gocui.ColorRed ,   none          ,    powdererBlue  ,     none          ,    gocui.ColorGreen, "debug flag"}
var colorBox     colorT       = colorT{gocui.ColorRed ,   none          ,    lightPurple   ,     none          ,    gocui.ColorCyan,  "debug box"}
var colorGrid    colorT       = colorT{gocui.ColorRed ,   none          ,    lightPurple   ,     none          ,    gocui.ColorRed,   "debug grid"}
var colorNone    colorT       = colorT{ none          ,   none          ,    none          ,     none          ,    none          ,   "debug none"}

// actually sets the colors for the gocui element 
// the user will see the colors change when this runs
// TODO: add black/white only flag for ttyS0 
// TODO: or fix kvm/qemu serial console & SIGWINCH.
// TODO: and minicom and uboot and 5 million other things.
// TODO: maybe enough of us could actually do that if we made it a goal.
// TODO: start with riscv boards and fix it universally there
// TODO: so just a small little 'todo' item here
func (n *node) setColor(newColor *colorT) {
	tk := n.tk
	if (tk.color == newColor) {
		// nothing to do since the colors have nto changed
		return
	}
	tk.color = newColor
	if (tk.v == nil) {
		return
	}
	if (tk.color == nil) {
		log(true, "Set the node to color = nil")
		tk.color = &colorNone
	}
	log(true, "Set the node to color =", tk.color.name)
	n.recreateView()
}

func (n *node) setDefaultWidgetColor() {
	n.showView()
}

func (n *node) setDefaultHighlight() {
	w := n.tk
	if (w.v == nil) {
		log(logError, "SetColor() failed on view == nil")
		return
	}
	w.v.SelBgColor = gocui.ColorGreen
	w.v.SelFgColor = gocui.ColorBlack
}

func randColor() gocui.Attribute {
	colors := []string{"Green", "#FFAA55", "Yellow", "Blue", "Red", "Black", "White"}
	i := rand.Intn(len(colors))
	log(true, "randColor() i =", i)
	return gocui.GetColor(colors[i])
}

func (n *node) redoColor(draw bool) {
	w := n.tk
	if (w == nil) {
		return
	}

	sleep(.05)
	n.setDefaultHighlight()
	n.setDefaultWidgetColor()

	for _, child := range n.children {
		child.redoColor(draw)
	}
}