package ui

import "image/color"

var defaultDimensions *Dimensions
var defaultFonts *Fonts
var defaultPalette *Palette
var defaultStyle *Style

type Dimensions struct {
	OutlineWidth   float32
	ScrollbarWidth float32
	TextPadding    float32
}

type Fonts struct {
	Default string
}

type Palette struct {
	// Background is the default background color.
	Background color.Color
	// Primary is used as a the main contrast color.
	Primary color.Color
	// PrimaryDark is a foreground version of the main contrast color.
	PrimaryDark color.Color
	// PrimaryHighlight is a light version of the main contrast color.
	PrimaryHighlight color.Color
	// PrimaryLight is a background version of the main contrast color.
	PrimaryLight color.Color
	// ShadedBackground is a darker version of the background color.
	ShadedBackground color.Color
	// Text is the default text color.
	Text color.Color
	// TextDisabled is disabled text color.
	TextDisabled color.Color
	// TextNegative is the text color associated with a negative event.
	TextNegative color.Color
	// TextOnPrimary is the text color when used with the main contrast color as background.
	TextOnPrimary color.Color
	// TextPositive is the text color associated with a positive event.
	TextPositive color.Color
}

type Style struct {
	Dimensions *Dimensions
	Fonts      *Fonts
	Palette    *Palette
}

func DefaultDimensions() *Dimensions {
	if defaultDimensions == nil {
		defaultDimensions = &Dimensions{
			OutlineWidth:   2.,
			ScrollbarWidth: 16.,
			TextPadding:    8.,
		}
	}
	return defaultDimensions
}

func DefaultFonts() *Fonts {
	if defaultFonts == nil {
		defaultFonts = &Fonts{
			Default: "default",
		}
	}
	return defaultFonts
}

func DefaultPalette() *Palette {
	if defaultPalette == nil {
		defaultPalette = &Palette{
			Background:       color.White,
			Primary:          RGBA(0x3F, 0x51, 0xB5, 0xFF),
			PrimaryDark:      RGBA(0x00, 0x28, 0x84, 0xFF),
			PrimaryHighlight: RGBA(0xE8, 0xEA, 0xF6, 0xFF),
			PrimaryLight:     RGBA(0x75, 0x7C, 0xE8, 0xFF),
			ShadedBackground: RGBA(0xFA, 0xFA, 0xFA, 0xFF),
			Text:             color.Black,
			TextDisabled:     RGBA(0xBD, 0xBD, 0xBD, 0xFF),
			TextNegative:     RGBA(0xFF, 0x43, 0x36, 0xFF),
			TextOnPrimary:    color.White,
			TextPositive:     RGBA(0x4C, 0xAF, 0x50, 0xFF),
		}
	}
	return defaultPalette
}

func DefaultStyle() *Style {
	if defaultStyle == nil {
		defaultStyle = &Style{
			Dimensions: DefaultDimensions(),
			Fonts:      DefaultFonts(),
			Palette:    DefaultPalette(),
		}
	}
	return defaultStyle
}

func RGBA(r, g, b, a byte) *color.RGBA {
	return &color.RGBA{R: r, G: g, B: b, A: a}
}