// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
// Use of this source code is governed by the GPL 3.0

package main

import (
	"math/rand"

	"github.com/awesome-gocui/gocui"
	"go.wit.com/log"
)

// simple colors for light and dark

// information about how terminfo works
// https://jvns.ca/blog/2024/10/01/terminal-colours/

// TODO: move all this to a protobuf
// TODO: add black/white only flag for ttyS0
// TODO: fix kvm/qemu serial console & SIGWINCH.
// TODO: check minicom (doesn't work)
// TODO: fix riscv boards

// DONE ON ENABLE() WIDGET
// restores the last saved color and makes it active
func (tk *guiWidget) restoreEnableColor() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	tk.color.frame = tk.colorLast.frame
	tk.color.fg = tk.colorLast.fg
	tk.color.bg = tk.colorLast.bg
	tk.color.selFg = tk.colorLast.selFg
	tk.color.selBg = tk.colorLast.selBg

	tk.activateColor()
}

// DONE ON DISABLE() WIDGET
// makes the button look disabled
func (tk *guiWidget) setColorDisable() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	// save the current color
	tk.color.frame = superLightGrey
	tk.color.fg = gocui.ColorBlack
	tk.color.bg = superLightGrey
	tk.color.selFg = superLightGrey
	tk.color.selBg = superLightGrey
	tk.activateColor()
}

// sets the current gocui highlight colors
func (tk *guiWidget) activateColor() {
	if tk.v == nil {
		return
	}
	tk.v.FrameColor = tk.color.frame
	tk.v.FgColor = tk.color.fg
	tk.v.BgColor = tk.color.bg
	tk.v.SelFgColor = tk.color.selFg
	tk.v.SelBgColor = tk.color.selBg
}

// saves the color and makes it active
func (tk *guiWidget) updateColor() {
	if tk.v == nil {
		return
	}
	if tk.color != nil {
		tk.colorLast.frame = tk.color.frame
		tk.colorLast.fg = tk.color.fg
		tk.colorLast.bg = tk.color.bg
		tk.colorLast.selFg = tk.color.selFg
		tk.colorLast.selBg = tk.color.selBg
	}
	tk.activateColor()
}

// Below are all the colors. TODO: move to protobuf and save in a config file

func (tk *guiWidget) setColorWindowFrame() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark { // use a dark color palette
		tk.color.frame = gocui.AttrNone
		tk.color.fg = gocui.ColorBlack
		tk.color.bg = gocui.ColorBlack
		tk.color.selFg = gocui.AttrNone
		tk.color.selBg = gocui.AttrNone
	} else {
		tk.color.frame = gocui.AttrNone
		tk.color.fg = gocui.AttrNone
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.AttrNone
		tk.color.selBg = gocui.AttrNone
	}

	tk.updateColor()
}

// weird. lots of color problems for me on debian sid using the traditional Andy Herzfield 'gnome'
func (tk *guiWidget) setColorWindowTitleActive() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark { // use a dark color palette
		tk.color.frame = gocui.AttrNone
		tk.color.fg = gocui.ColorBlue
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.ColorWhite
		tk.color.selBg = gocui.ColorBlue
	} else {
		tk.color.frame = gocui.ColorWhite
		tk.color.fg = gocui.ColorWhite
		tk.color.bg = gocui.ColorBlue
		tk.color.selFg = gocui.ColorWhite
		tk.color.selBg = gocui.ColorBlue
	}

	tk.updateColor()
}

func (tk *guiWidget) setColorWindowTitle() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark { // use a dark color palette
		tk.color.frame = gocui.AttrNone
		tk.color.fg = gocui.ColorBlue
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.ColorWhite
		tk.color.selBg = gocui.ColorBlue
	} else {
		tk.color.frame = gocui.ColorWhite
		tk.color.fg = gocui.ColorBlue
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.ColorWhite
		tk.color.selBg = gocui.ColorBlue
	}

	tk.updateColor()
}

func (tk *guiWidget) setColorBG() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark {
		tk.color.frame = gocui.AttrNone
		tk.color.fg = gocui.ColorBlack
		tk.color.bg = gocui.ColorBlack
		tk.color.selFg = gocui.AttrNone
		tk.color.selBg = gocui.AttrNone
	} else {
		tk.color.frame = gocui.ColorWhite
		tk.color.fg = gocui.ColorWhite
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.AttrNone
		tk.color.selBg = gocui.AttrNone
	}

	tk.updateColor()
}

func (tk *guiWidget) setColorLabel() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark {
		tk.color.frame = gocui.AttrNone
		tk.color.fg = gocui.ColorWhite
		tk.color.bg = gocui.ColorBlack
		tk.color.selFg = gocui.ColorWhite
		tk.color.selBg = gocui.AttrNone
	} else {
		tk.color.frame = gocui.AttrNone
		tk.color.fg = gocui.ColorBlack
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.AttrNone
		tk.color.selBg = gocui.ColorWhite
	}

	tk.updateColor()
}

func (tk *guiWidget) setColorButtonDense() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark {
		tk.color.frame = gocui.AttrNone
		tk.color.fg = gocui.ColorBlue
		tk.color.bg = gocui.ColorBlack
		tk.color.selFg = gocui.ColorWhite
		tk.color.selBg = gocui.ColorBlue
	} else {
		tk.color.frame = gocui.AttrNone
		tk.color.fg = gocui.ColorWhite
		tk.color.bg = gocui.ColorBlue
		tk.color.selFg = gocui.ColorBlue
		tk.color.selBg = gocui.AttrNone
	}

	tk.updateColor()
}

func (tk *guiWidget) setColorButton() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark {
		tk.color.frame = gocui.ColorBlack
		tk.color.fg = gocui.ColorBlue
		tk.color.bg = gocui.ColorBlack
		tk.color.selFg = gocui.ColorWhite
		tk.color.selBg = gocui.ColorBlue
	} else {
		tk.color.frame = gocui.ColorBlue
		tk.color.fg = gocui.AttrNone
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.ColorWhite
		tk.color.selBg = gocui.ColorBlue
	}

	tk.updateColor()
}

func (tk *guiWidget) setColorInput() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark {
		tk.color.frame = gocui.ColorYellow
		tk.color.fg = gocui.AttrNone
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.ColorYellow
		tk.color.selBg = gocui.ColorBlack
	} else {
		tk.color.frame = gocui.ColorYellow
		tk.color.fg = gocui.AttrNone
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.ColorYellow
		tk.color.selBg = gocui.ColorBlack
	}
	tk.updateColor()
}

func (tk *guiWidget) setColorModal() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark {
		tk.color.frame = gocui.ColorRed
		tk.color.fg = gocui.ColorRed
		tk.color.bg = gocui.ColorBlack
		tk.color.selFg = gocui.ColorBlack
		tk.color.selBg = gocui.AttrNone
	} else {
		tk.color.frame = gocui.ColorRed
		tk.color.fg = gocui.AttrNone
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.AttrNone
		tk.color.selBg = gocui.ColorWhite
	}
	tk.updateColor()
}

// what genius figured this out?
func (tk *guiWidget) setColorTextbox() {
	if tk.color == nil {
		tk.color = new(colorT)
	}
	if me.dark {
		tk.color.frame = gocui.ColorRed
		tk.color.fg = gocui.ColorRed
		tk.color.bg = gocui.ColorBlack
		tk.color.selFg = gocui.ColorBlack
		tk.color.selBg = gocui.AttrNone
	} else {
		tk.color.frame = gocui.ColorRed
		tk.color.fg = gocui.AttrNone
		tk.color.bg = gocui.AttrNone
		tk.color.selFg = gocui.AttrNone
		tk.color.selBg = gocui.ColorWhite
	}
	tk.updateColor()
}

// just notes down here

// what genius figured this out?
// originally from github.com/dimasma0305/GoFetch
func get_teminal_color_palette() string {
	// var runes rune
	// color1 := "\x1b[0;29m  \x1b[0m"
	// runes = []rune(color1)
	// view.WriteRunes(runes)

	color1 := "\x1b[0;29m  \x1b[0m"
	color2 := "\x1b[0;31m  \x1b[0m"
	color3 := "\x1b[0;32m  \x1b[0m"
	color4 := "\x1b[0;33m  \x1b[0m"
	color5 := "\x1b[0;34m  \x1b[0m"
	color6 := "\x1b[0;35m  \x1b[0m"
	color7 := "\x1b[0;36m  \x1b[0m"
	color8 := "\x1b[0;37m  \x1b[0m"

	return color1 + " " + color2 + " " + color3 + " " + color4 + " " + color5 + " " + color6 + " " + color7 + " " + color8
}

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

var none gocui.Attribute = gocui.AttrNone
var colorNone colorT = colorT{none, none, none, none, none, "debug none"}

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