// package win_bot_add -- добавляет новый бот
package win_bot_add

import (
	_ "embed"
	"fmt"
	"log"
	"net/url"
	"runtime"

	"github.com/zserge/lorca"

	"wartank/pkg/types"
)

//go:embed win_bot_add.html
var strWinHtml string

// WinBotAdd -- окно добавления бота
type WinBotAdd struct {
	desktop types.IDesktop
	store   types.IStore
	win     lorca.UI
	ws      types.IWebSocket
	fnAdd   func(name, pass string)
}

// NewWinBotAdd -- возвращает новое окно добавления бота
func NewWinBotAdd(desktop types.IDesktop, fnAdd func(name, pass string)) (*WinBotAdd, error) {
	{ // Предусловия
		if desktop == nil {
			return nil, fmt.Errorf("NewWinBotAdd(): IDesktop == nil")
		}
		if fnAdd == nil {
			return nil, fmt.Errorf("NewWinBotAdd(): fnAdd == nil")
		}
	}

	sf := &WinBotAdd{
		desktop: desktop,
		store:   desktop.Store(),
		ws:      desktop.Ws(),
		fnAdd:   fnAdd,
	}

	args := []string{}
	if runtime.GOOS == "linux" {
		args = append(args, "--class=Lorca")
	}
	var err error
	sf.win, err = lorca.New("data:text/html,"+url.PathEscape(strWinHtml), "", 640, 480, args...)
	if err != nil {
		return nil, fmt.Errorf("NewWinBotAdd(): in create win, err=\n\t%w", err)
	}
	go sf.close()
	return sf, nil
}

// Работает в отдельном потоке, главный цикл окна
func (sf *WinBotAdd) Run() {
	log.Println("NewWinBotAdd.Run()")
	sf.win.Bind("close_win", sf.onClose)
	sf.win.Bind("add", sf.onBotAdd)
	<-sf.win.Done() // Ожидание закрытия окна
}

// Добавляет пользователя по требованию
func (sf *WinBotAdd) onBotAdd() {
	log.Printf("NewWinBotAdd.onBotAdd()\n")
	name := sf.win.Eval(`document.getElementById("/bot/name").value`).String()
	pass := sf.win.Eval(`document.getElementById("/bot/pass").value`).String()
	go sf.fnAdd(name, pass)
	sf.onClose()
}

// Закрывает приложение
func (sf *WinBotAdd) onClose() {
	log.Println("NewWinBotAdd.onClose()")
	sf.win.Close()
}

// close -- ожидает отмены глобального контекста
func (sf *WinBotAdd) close() {
	<-sf.desktop.CtxApp().Done()
	log.Println("NewWinBotAdd.close()")
	sf.win.Close()
}
