// package desktop -- главный тип локального приложения
package desktop

import (
	"fmt"
	"log"

	"wartank/desktop/dict_bot"
	"wartank/desktop/root"
	"wartank/desktop/store_net"
	"wartank/desktop/web_socket"
	"wartank/desktop/win_main"
	"wartank/pkg/components/kernel"
	"wartank/pkg/types"
)

// Desktop -- главный тип локального приложения
type Desktop struct {
	*kernel.Kernel
	store   types.IStore
	winMain *win_main.WinMain
	ws      types.IWebSocket
	root    types.IRoot
	dictBot types.IDictBot
}

// NewDesktop -- возвращает новый объект настольного приложения
func NewDesktop() (*Desktop, error) {
	log.Println("NewDesktop()")
	kernel, err := kernel.NewKernel()
	if err != nil {
		return nil, fmt.Errorf("NewDesktop(): in create IKernel, err=\n\t%w", err)
	}
	sf := &Desktop{
		Kernel: kernel,
	}
	sf.ws, err = web_socket.NewWebSocket(sf)
	if err != nil {
		return nil, fmt.Errorf("NewDesktop(): in create IWebSocket, err=\n\t%w", err)
	}
	sf.store, err = store_net.NewStoreNet(sf)
	if err != nil {
		return nil, fmt.Errorf("NewDesktop(): in create IStore, err=\n\t%w", err)
	}
	sf.root, err = root.NewRoot(sf)
	if err != nil {
		return nil, fmt.Errorf("NewDesktop(): in create IRoot, err=\n\t%w", err)
	}
	sf.dictBot, err = dict_bot.NewDictBot(sf)
	if err != nil {
		return nil, fmt.Errorf("NewDesktop(): in create IGamers, err=\n\t%w", err)
	}
	sf.winMain, err = win_main.NewWinMain(sf)
	if err != nil {
		return nil, fmt.Errorf("NewDesktop(): in create WinMain, err=\n\t%w", err)
	}
	return sf, nil
}

// Run -- запускает десктоп в работу
func (sf *Desktop) Run() error {
	sf.Slog().Infof("Desktop.Run()\n")
	sf.winMain.Run()
	sf.Wg().Wait()
	return nil
}

// Store -- возвращает хранилище
func (sf *Desktop) Store() types.IStore {
	return sf.store
}

// Ws -- возвращает веб-сокет
func (sf *Desktop) Ws() types.IWebSocket {
	return sf.ws
}

// Root -- возвращает объект рута
func (sf *Desktop) Root() types.IRoot {
	return sf.root
}

// DictBot -- возвращает объект списка ботов игрока
func (sf *Desktop) DictBot() types.IDictBot {
	return sf.dictBot
}
