package mainwindow

import (
	"context"
	"fmt"
	"lab.zaar.be/thefish/alchemyst-go/engine/types"
	"lab.zaar.be/thefish/alchemyst-go/util/appctx"
	blt "lab.zaar.be/thefish/bearlibterminal"
)

type MainWindow struct {
	types.Rect
	ctx    context.Context
	layers map[string]types.Renderable
}

func Init(ctx context.Context) *MainWindow {
	appctx.Logger(ctx).Info().Msgf("Opening main window...")
	mw := MainWindow{ctx: ctx, layers: make(map[string]types.Renderable, 0)}
	mw.Open()
	return &mw
}



func (mw *MainWindow) AddLayer(name string, idx int, colorName string) *MainWindow {
	c := blt.ColorFromName(colorName)
	mw.layers[name] = &Layer{Idx: idx, defaultColor: c}
	return mw
}

func (mw *MainWindow) GetLayer(name string) *Layer {
	if layer, ok := mw.layers[name]; ok {
		return layer.(*Layer)
	}
	appctx.Logger(mw.ctx).Fatal().Msgf("No layer with such name %s", name)
	return nil
}

func (mw *MainWindow) Open() {
	config := appctx.Config(mw.ctx)
	blt.Open()
	//blt.Set("window: size=80x25, title="+config.Title+" v"+string(version)+"; font: ./fonts/Monaco-Linux.ttf, size=10")
	blt.Set(
		fmt.Sprintf(
			//"window: size=%dx%d, title='%s v%s'; font: ./assets/fonts/bitmap/ibmnew8x12.png, size=8x12;",
			"window: size=%dx%d, title='%s %s'; font: %s, size=%s;",
			//"window: size=%dx%d, title='%s v%s'",
			config.MainWindowSizeX,
			config.MainWindowSizeY,
			config.Title,
			config.Version,
			config.Font,
			config.FontSize,
		),
	)
	mw.Rect = types.NewRect(0,0, config.MainWindowSizeX, config.MainWindowSizeY)
}

func (mw *MainWindow) Close() {
	appctx.Logger(mw.ctx).Info().Msg("Closing main window...")
	blt.Close()
}

func (mw *MainWindow) Render() {
	for _, l := range mw.layers {
		l.Render()
	}
}