package types

import (
	"github.com/gammazero/deque"
	"lab.zaar.be/thefish/alchemyst-go/util"
	"reflect"
)
import blt "lab.zaar.be/thefish/bearlibterminal"

var crng = util.NewRNG()

type ColorHolder interface {
	GetColor() uint32
}

type cdeque struct {
	deque.Deque
}

func (c *cdeque) Next() uint8 {
	c.Rotate(1)
	return c.Front().(uint8)
}

type DanceColorHolder struct {
	A uint8
	R *cdeque
	G *cdeque
	B *cdeque
}

func (chd *DanceColorHolder) GetColor() uint32 {
	return blt.ColorFromARGB(
		chd.A,
		chd.R.Next(),
		chd.G.Next(),
		chd.B.Next(),
	)
}

type PlainColorHolder struct {
	A uint8
	R uint8
	G uint8
	B uint8
}

func (chb *PlainColorHolder) GetColor() uint32 {
	return blt.ColorFromARGB(
		chb.A,
		chb.R,
		chb.G,
		chb.B,
	)
}

type TileColorSet struct {
	Fg     ColorHolder
	Bg     ColorHolder
	DarkFg ColorHolder
	DarkBg ColorHolder
}


type GlyphHolder interface {
	GetGlyph() string
}

type PlainGlyphHolder struct {
	Glyph string
}

func (pch *PlainGlyphHolder) GetGlyph() string {
	return pch.Glyph
}

type Appearance struct {
	Glyph    GlyphHolder   `json:"char"`
	ColorSet *TileColorSet `json:"colorSet"`
}

func SingleColorRing(colorValue uint8) *cdeque {
	c := &cdeque{}
	c.PushBack(colorValue)
	return c
}

func FillColorRing(colorValue uint8, minGlow, maxGlow, step int) *cdeque {
	q := make([]uint8, 0)
	color := int(colorValue)
	for color < maxGlow {
		q = append(q, uint8(color))
		color = crng.Range(1, step) + color
	}
	color = crng.Range(0, step+minGlow)
	q = append(q, colorValue)
	//for uint8(color) < uint8(colorValue) {
	//	q = append(q, uint8(color))
	//	color = crng.Range(1, step+minGlow)
	//}

	c := &cdeque{}
	for _, v := range q {
		c.PushBack(uint8(v))
	}
	return c
}

func (app Appearance) TypeOf() reflect.Type {
	return reflect.TypeOf(app)
}