package UI

import (
	"fmt"

	"github.com/veandco/go-sdl2/sdl"
	"github.com/veandco/go-sdl2/ttf"

	"github.com/clockworkpi/LauncherGoDev/sysgo"
	"github.com/cuu/gogame/font"
)

type WidgetInterface interface {
	Size() (int, int)
	NewSize(w, h int)
	Coord() (int, int)
	NewCoord(x, y int)
}

type Coord struct {
	X int
	Y int
}

type Plane struct {
	W int
	H int
}

type Widget struct {
	PosX   int
	PosY   int
	Width  int
	Height int
}

func (self *Widget) Size() (int, int) {
	return self.Width, self.Height
}

func (self *Widget) NewSize(w, h int) {
	self.Width = w
	self.Height = h
}

func (self *Widget) Coord() (int, int) {
	return self.PosX, self.PosY
}

func (self *Widget) NewCoord(x, y int) {
	self.PosX = x
	self.PosY = y
}

func FontRW(font_data [] byte, font_size int) *ttf.Font {

	mem,err := sdl.RWFromMem(font_data)
	if err != nil {
		panic(err)
	}

	font, err := ttf.OpenFontRW(mem, 0, font_size)
	if err != nil {
		panic(fmt.Sprintf("OpenRW font failed %s", err))
	}

	return font
}

type FontData struct {
	Data []byte
	Size int
}
//invoked in main.go
func Init() {
	font.Init()
	
	fonts_name := [4]string{"VarelaRound-Regular.ttf",
				"VeraMono.ttf",
				"NotoSansMono-Regular.ttf",
				"NotoSansCJK-Regular.ttf"}
	
	skinpath := sysgo.SKIN + "/truetype"

	Fonts = make(map[string]*ttf.Font)

	fonts_path := make(map[string]string)
	
	fonts_path["varela"] = fmt.Sprintf("%s/%s", skinpath,fonts_name[0])
	fonts_path["veramono"] = fmt.Sprintf("%s/%s", skinpath,fonts_name[1])
	fonts_path["noto"] = fmt.Sprintf("%s/%s", skinpath,fonts_name[2])
	fonts_path["notocjk"] = fmt.Sprintf("%s/%s", skinpath,fonts_name[3])
	
	fonts_data := make(map[string]FontData)
	d,s := sdl.LoadFile(fonts_path["varela"])	
	fonts_data["varela"] = FontData{d,s}

	d,s = sdl.LoadFile(fonts_path["veramono"])
	fonts_data["veramono"] = FontData{d,s}

        d,s = sdl.LoadFile(fonts_path["notocjk"])
        fonts_data["notocjk"] = FontData{d,s}

	d,s = sdl.LoadFile(fonts_path["noto"])
	fonts_data["noto"] = FontData{d,s}

	Fonts["varela11"] = FontRW(fonts_data["varela"].Data, 11)
	Fonts["varela12"] = FontRW(fonts_data["varela"].Data, 12)
	Fonts["varela13"] = FontRW(fonts_data["varela"].Data, 13)
	Fonts["varela15"] = FontRW(fonts_data["varela"].Data, 15)
	Fonts["varela16"] = FontRW(fonts_data["varela"].Data, 16)
	Fonts["varela18"] = FontRW(fonts_data["varela"].Data, 18)

	Fonts["varela22"] = FontRW(fonts_data["varela"].Data, 22)
	Fonts["varela25"] = FontRW(fonts_data["varela"].Data, 25)
	Fonts["varela40"] = FontRW(fonts_data["varela"].Data, 40)
	Fonts["varela120"] = FontRW(fonts_data["varela"].Data, 120)

	Fonts["veramono10"] = FontRW(fonts_data["veramono"].Data, 10)
	Fonts["veramono12"] = FontRW(fonts_data["veramono"].Data, 12)
	Fonts["veramono15"] = FontRW(fonts_data["veramono"].Data, 15)
	Fonts["veramono18"] = FontRW(fonts_data["veramono"].Data, 18)
	Fonts["veramono20"] = FontRW(fonts_data["veramono"].Data, 20)
	Fonts["veramono24"] = FontRW(fonts_data["veramono"].Data, 24)
	/*
	for i := 10; i < 28; i++ {
		keyname := fmt.Sprintf("notosansmono%d", i)
		Fonts[keyname] = FontRW(fonts_data["noto"].Data, i)
	}
	*/
	Fonts["notosanscjk12"] = FontRW(fonts_data["notocjk"].Data, 12)
	Fonts["notosanscjk14"] = FontRW(fonts_data["notocjk"].Data, 14)
	Fonts["notosanscjk15"] = FontRW(fonts_data["notocjk"].Data, 15)
	//
	keys_def_init()

	//// global variables Init
	if MyIconPool == nil {
		MyIconPool = NewIconPool()
		MyIconPool.Init()
	}
	if MyLangManager == nil {

		MyLangManager = NewLangManager()
		MyLangManager.Init()

	}
	if MySkinManager == nil {
		MySkinManager = NewSkinManager()
		MySkinManager.Init()
	}
}
