package statusscreen

import (
	"fmt"

	"github.com/gdamore/tcell"
	"github.com/iotaledger/goshimmer/packages/node"
	"github.com/rivo/tview"
)

type UILogEntry struct {
	Primitive         *tview.Grid
	TimeContainer     *tview.TextView
	MessageContainer  *tview.TextView
	LogLevelContainer *tview.TextView
}

func NewUILogEntry(message StatusMessage) *UILogEntry {
	logEntry := &UILogEntry{
		Primitive:         tview.NewGrid(),
		TimeContainer:     tview.NewTextView(),
		MessageContainer:  tview.NewTextView(),
		LogLevelContainer: tview.NewTextView(),
	}

	logEntry.TimeContainer.SetBackgroundColor(tcell.ColorWhite)
	logEntry.TimeContainer.SetTextColor(tcell.ColorBlack)
	logEntry.TimeContainer.SetDynamicColors(true)

	logEntry.MessageContainer.SetBackgroundColor(tcell.ColorWhite)
	logEntry.MessageContainer.SetTextColor(tcell.ColorBlack)
	logEntry.MessageContainer.SetDynamicColors(true)

	logEntry.LogLevelContainer.SetBackgroundColor(tcell.ColorWhite)
	logEntry.LogLevelContainer.SetTextColor(tcell.ColorBlack)
	logEntry.LogLevelContainer.SetDynamicColors(true)

	textColor := "black::d"
	switch message.LogLevel {
	case node.LOG_LEVEL_INFO:
		fmt.Fprintf(logEntry.LogLevelContainer, " [black::d][ [blue::d]INFO [black::d]]")
	case node.LOG_LEVEL_SUCCESS:
		fmt.Fprintf(logEntry.LogLevelContainer, " [black::d][  [green::d]OK  [black::d]]")
	case node.LOG_LEVEL_WARNING:
		fmt.Fprintf(logEntry.LogLevelContainer, " [black::d][ [yellow::d]WARN [black::d]]")

		textColor = "yellow::d"
	case node.LOG_LEVEL_FAILURE:
		fmt.Fprintf(logEntry.LogLevelContainer, " [black::d][ [red::d]FAIL [black::d]]")

		textColor = "red::d"
	case node.LOG_LEVEL_DEBUG:
		fmt.Fprintf(logEntry.LogLevelContainer, " [black::d][ [black::b]NOTE [black::d]]")

		textColor = "black::b"
	}

	fmt.Fprintf(logEntry.TimeContainer, "  [black::b]"+message.Time.Format("15:04:05"))
	if message.Source == "Node" {
		fmt.Fprintf(logEntry.MessageContainer, "["+textColor+"]"+message.Message)
	} else {
		fmt.Fprintf(logEntry.MessageContainer, "["+textColor+"]"+message.Source+": "+message.Message)
	}

	logEntry.Primitive.
		SetColumns(11, 0, 11).
		SetRows(1).
		SetBorders(false).
		AddItem(logEntry.TimeContainer, 0, 0, 1, 1, 0, 0, false).
		AddItem(logEntry.MessageContainer, 0, 1, 1, 1, 0, 0, false).
		AddItem(logEntry.LogLevelContainer, 0, 2, 1, 1, 0, 0, false)

	return logEntry
}