package warbot_net

import (
	"context"
	"fmt"
	"log"
	"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 {
	bot        types.ИБот
	botNetConn *bot_net_conn.BotNetConn
	login      *bot_net_login.BotNetLogin
	isOnline   *safebool.SafeBool
	net        *netclient.NetClient
	ctx        context.Context
	fnCancel   func()
}

// NewWarBotNet -- возвращает новый *NetClient
func NewWarBotNet(bot types.ИБот) (*WarBotNet, error) {
	if bot == nil {
		return nil, fmt.Errorf("NewWarBotNet(): IBot == nil")
	}
	log.Printf("NewWarBotNet(): name=%q\n", bot.Имя())
	ctx, fnCancel := context.WithCancel(bot.Кнт())
	sf := &WarBotNet{
		bot:        bot,
		botNetConn: bot_net_conn.NewBotNetConn(),
		isOnline:   safebool.NewSafeBool(),
		ctx:        ctx,
		fnCancel:   fnCancel,
	}
	sf.net = netclient.NewNetClient(sf)
	{ // Подключаем сетевой логин
		var err error
		sf.login, err = bot_net_login.NewBotNetLogin(sf)
		if err != nil {
			return nil, fmt.Errorf("NewWarBotNet(): in create BotNetLogin, err=\n\t%w", err)
		}
	}
	sf.isOnline.Уст()
	_ = types.ИБотСеть(sf)
	return sf, nil
}

// Бот -- возвращает ссылку на своего бота
func (sf *WarBotNet) Бот() types.ИБот {
	return sf.bot
}

// Кнт -- контекст сети бота
func (sf *WarBotNet) Кнт() context.Context {
	return sf.ctx
}

// Отмена -- отменяет контекст сети бота
func (sf *WarBotNet) Отмена() {
	sf.fnCancel()
}

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

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

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

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