package warbot_net

import (
	"fmt"
	"net/http"

	"wartank/pkg/components/safebool"
	"wartank/pkg/components/sectionnet/netclient"
	"wartank/pkg/types"
	"wartank/server/serv_bots/warbot/warbot_net/bot_net_conn"
	"wartank/server/serv_bots/warbot/warbot_net/bot_net_login"
)

/*
	Веб-клиент для выполнения запросов на сервер
*/

// WarBotNet -- веб-клиент для выполнения запросов на веб-сервер
type WarBotNet struct {
	server     types.IServer
	bot        types.IServBot
	botNetConn *bot_net_conn.BotNetConn
	login      *bot_net_login.BotNetLogin
	isOnline   *safebool.SafeBool
	net        *netclient.NetClient
}

// NewWarBotNet -- возвращает новый *NetClient
func NewWarBotNet(server types.IServer, bot types.IServBot) (gc *WarBotNet, err error) {
	fmt.Printf("NewWarBotNet()\n")
	{ // Предусловия
		if server == nil {
			return nil, fmt.Errorf("NewWarBotNet(): IServer == nil")
		}
		if bot == nil {
			return nil, fmt.Errorf("NewWarBotNet(): IServBot == nil")
		}
	}

	sf := &WarBotNet{
		server:     server,
		bot:        bot,
		botNetConn: bot_net_conn.NewBotNetConn(),
		isOnline:   safebool.NewSafeBool(),
	}
	return sf, nil
}

// Login -- пытается законнектиться к серверу
func (sf *WarBotNet) Login() error {
	var err error
	{ // Подключаем сетевой логин
		sf.login, err = bot_net_login.NewBotNetLogin(sf.bot)
		if err != nil {
			return fmt.Errorf("WarBotNet.Login(): in create NetLogin, err=\n\t%w", err)
		}
	}
	if err = sf.login.Connect(); err != nil {
		return fmt.Errorf("WarBotNet.Login(): in login connect, err=\n\t%w", err)
	}
	sf.isOnline.Set()
	sf.net = netclient.NewNetClient(sf.server, sf.bot)
	return nil
}

// IsOnline -- возвращает признак нахождения в онлайне
func (sf *WarBotNet) IsOnline() *safebool.SafeBool {
	return sf.isOnline
}

// Net -- возвращает исполнитель запросов
func (sf *WarBotNet) Net() types.INetClient {
	return sf.net
}

// Conn -- возвращает HTTP-коннект
func (sf *WarBotNet) Conn() *http.Client {
	return sf.botNetConn.Client()
}

// Cookie -- возвращает куки для HTTP-коннект
func (sf *WarBotNet) Cookie() types.IBotCookie {
	return sf.botNetConn.Cookie()
}
