// package page_monolit -- страница показа монолита
package page_monolit

import (
	_ "embed"
	"fmt"
	"strings"

	"github.com/gofiber/fiber/v2"

	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_serv_http/btn_modules"
	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_serv_http/btn_monolit"
)

// PageMonolit -- страница показа монолита
type PageMonolit struct {
	ctx        IKernelCtx
	btnMonolit *btn_monolit.BtnMonolit
	btnModules *btn_modules.BtnModules
}

var page *PageMonolit

// GetPageMonolit -- возвращает страницу монолита
func GetPageMonolit() *PageMonolit {
	if page != nil {
		return page
	}
	kCtx := kctx.GetKernelCtx()
	sf := &PageMonolit{
		ctx:        kCtx,
		btnMonolit: btn_monolit.NewBtnMonolit(),
		btnModules: btn_modules.NewBtnModules(),
	}

	fiberApp := kCtx.Get("fiberApp").Val().(*fiber.App)
	fiberApp.Get("/monolit", sf.getMonolit)
	fiberApp.Post("/monolit_state", sf.postMonolitState)
	fiberApp.Post("/monolit_ctx", sf.postMonolitCtx)
	fiberApp.Post("/monolit_log", sf.postMonolitLog)
	page = sf
	return sf
}

// Функция обратного вызова при клике на кнопку "Монолит"
func (sf *PageMonolit) clickMonolit() string {
	return ""
}

//go:embed log_block.html
var strLogBlock string

// Возвращает страницу лога монолита
func (sf *PageMonolit) postMonolitLog(ctx *fiber.Ctx) error {
	mon := sf.ctx.Get("monolit").Val().(IKernelMonolit)
	_log := mon.Log()
	strOut := ""
	for i := range 100 {
		msg := _log.Get(i).String()
		if strings.Contains(msg, "*no msg*") {
			continue
		}
		strOut += msg + "\n"
	}
	strOut = strings.ReplaceAll(strLogBlock, "{.log}", strOut)
	return ctx.SendString(strOut)
}

//go:embed ctx_row_val.html
var strCtxRowVal string

//go:embed ctx_row_block.html
var strCtxRowBlock string

// Возвращает блок контекста монолита
func (sf *PageMonolit) postMonolitCtx(ctx *fiber.Ctx) error {
	mon := sf.ctx.Get("monolit").Val().(IKernelMonolit)
	chLst := mon.Ctx().SortedList()
	strOut := ``
	for _, val := range chLst {
		strRow := strCtxRowVal
		strRow = strings.ReplaceAll(strRow, "{.key}", val.Key())
		strRow = strings.ReplaceAll(strRow, "{.value}", fmt.Sprint(val.Val()))
		type_ := fmt.Sprintf("%#T", val.Val())
		type_ = strings.ReplaceAll(type_, ".", ",<br>")
		strRow = strings.ReplaceAll(strRow, "{.type}", type_)
		strRow = strings.ReplaceAll(strRow, "{.createAt}", string(val.CreateAt()))
		strRow = strings.ReplaceAll(strRow, "{.updateAt}", string(val.UpdateAt()))
		strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment())
		strOut += strRow
	}
	strOut = strings.ReplaceAll(strCtxRowBlock, "{.ctx_block}", strOut)
	return ctx.SendString(strOut)
}

//go:embed monolit_state.html
var strStateMonolit string

// Показывает состояние монолита
func (sf *PageMonolit) postMonolitState(ctx *fiber.Ctx) error {
	dictState := map[string]any{}
	mon := sf.ctx.Get("monolit").Val().(IKernelMonolit)
	dictState["{.name}"] = mon.Name()
	monVal := sf.ctx.Get("monolit")
	dictState["{.createAt}"] = monVal.CreateAt()
	dictState["{.updateAt}"] = monVal.UpdateAt()
	dictState["{.comment}"] = monVal.Comment()
	strOut := strStateMonolit
	for key, val := range dictState {
		strOut = strings.ReplaceAll(strOut, key, fmt.Sprint(val))
	}
	return ctx.SendString(strOut)
}

//go:embed page_monolit.html
var strPageMonolit string

// Индексная страница монолита
func (sf *PageMonolit) getMonolit(ctx *fiber.Ctx) error {
	ctx.Set("Content-type", "text/html; charset=utf8;\n\n")
	strOut := strings.ReplaceAll(strPageMonolit, "{.btn_monolit}", sf.btnMonolit.Html())
	strOut = strings.ReplaceAll(strOut, "{.btn_modules}", sf.btnModules.Html())
	return ctx.SendString(strOut)
}
