package view

import (
	"github.com/derailed/k9s/internal/config"
	"github.com/derailed/k9s/internal/model"
	"github.com/derailed/k9s/internal/render"
	"github.com/derailed/k9s/internal/ui"
	"github.com/derailed/tview"
	"github.com/gdamore/tcell"
)

var _ model.ClusterInfoListener = (*ClusterInfo)(nil)

// ClusterInfo represents a cluster info view.
type ClusterInfo struct {
	*tview.Table

	app    *App
	styles *config.Styles
}

// NewClusterInfo returns a new cluster info view.
func NewClusterInfo(app *App) *ClusterInfo {
	return &ClusterInfo{
		Table:  tview.NewTable(),
		app:    app,
		styles: app.Styles,
	}
}

// Init initializes the view.
func (c *ClusterInfo) Init() {
	c.SetBorderPadding(0, 0, 1, 0)
	c.app.Styles.AddListener(c)
	c.layout()
	c.StylesChanged(c.app.Styles)
}

// StylesChanged notifies skin changed.
func (c *ClusterInfo) StylesChanged(s *config.Styles) {
	c.styles = s
	c.SetBackgroundColor(s.BgColor())
	c.updateStyle()
}

func (c *ClusterInfo) layout() {
	for row, v := range []string{"Context", "Cluster", "User", "K9s Rev", "K8s Rev", "CPU", "MEM"} {
		c.SetCell(row, 0, c.sectionCell(v))
		c.SetCell(row, 1, c.infoCell(render.NAValue))
	}
}

func (c *ClusterInfo) sectionCell(t string) *tview.TableCell {
	cell := tview.NewTableCell(t + ":")
	cell.SetAlign(tview.AlignLeft)
	// var style tcell.Style
	// style.Bold(true).
	// 	Background(tcell.ColorGreen).
	// 	Foreground(config.AsColor(c.styles.K9s.Info.SectionColor))
	// cell.SetStyle(style)
	// cell.SetBackgroundColor(c.app.Styles.BgColor())
	// cell.SetBackgroundColor(tcell.ColorDefault)
	cell.SetBackgroundColor(tcell.ColorGreen)

	return cell
}

func (c *ClusterInfo) infoCell(t string) *tview.TableCell {
	cell := tview.NewTableCell(t)
	cell.SetExpansion(2)
	cell.SetTextColor(c.styles.K9s.Info.FgColor.Color())
	cell.SetBackgroundColor(c.app.Styles.BgColor())

	return cell
}

// ClusterInfoUpdated notifies the cluster meta was updated.
func (c *ClusterInfo) ClusterInfoUpdated(data model.ClusterMeta) {
	c.app.QueueUpdateDraw(func() {
		var row int
		c.GetCell(row, 1).SetText(data.Context)
		row++
		c.GetCell(row, 1).SetText(data.Cluster)
		row++
		c.GetCell(row, 1).SetText(data.User)
		row++
		c.GetCell(row, 1).SetText(data.K9sVer)
		row++
		c.GetCell(row, 1).SetText(data.K8sVer)
		row++
		c.GetCell(row, 1).SetText(render.AsPerc(data.Cpu) + "%")
		row++
		c.GetCell(row, 1).SetText(render.AsPerc(data.Mem) + "%")

		c.updateStyle()
	})
}

// ClusterInfoChanged notifies the cluster meta was changed.
func (c *ClusterInfo) ClusterInfoChanged(prev, curr model.ClusterMeta) {
	c.app.QueueUpdateDraw(func() {
		var row int
		c.GetCell(row, 1).SetText(curr.Context)
		row++
		c.GetCell(row, 1).SetText(curr.Cluster)
		row++
		c.GetCell(row, 1).SetText(curr.User)
		row++
		c.GetCell(row, 1).SetText(curr.K9sVer)
		row++
		c.GetCell(row, 1).SetText(curr.K8sVer)
		row++
		c.GetCell(row, 1).SetText(ui.AsPercDelta(prev.Cpu, curr.Cpu))
		row++
		c.GetCell(row, 1).SetText(ui.AsPercDelta(prev.Mem, curr.Mem))

		c.updateStyle()
	})
}

func (c *ClusterInfo) updateStyle() {
	for row := 0; row < c.GetRowCount(); row++ {
		c.GetCell(row, 0).SetTextColor(c.styles.K9s.Info.FgColor.Color())
		c.GetCell(row, 0).SetBackgroundColor(c.styles.BgColor())
		var s tcell.Style
		c.GetCell(row, 1).SetStyle(s.Bold(true).Foreground(c.styles.K9s.Info.SectionColor.Color()))
	}
}
