package warbot_net

import (
	"context"
	"wartank/pkg/components/arena_net/http_worker"
	"wartank/pkg/components/kernel/logger"
	"wartank/pkg/components/safe_bool"
	"wartank/pkg/types"
	"wartank/server/serv_bots/warbot/warbot_net/bot_net_login"
	"wartank/server/serv_bots/warbot/warbot_net/bot_web_conn"
)

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

// ВарБотСеть -- веб-клиент для выполнения запросов на веб-сервер
type ВарБотСеть struct {
	бот        types.ИБот
	вебСокет   *bot_web_conn.БотВебСокет
	логин      *bot_net_login.БотСетьЛогин
	еслиОнлайн *safe_bool.БезопБул
	вебВоркер  types.ИХттпВоркер
	ctx        context.Context
	фнОтмена   func()
	лог types.ИЛоггер
}

// НовВарБотСеть -- возвращает новый коннект к сети бота
func НовВарБотСеть(бот types.ИБот) *ВарБотСеть {
	лог:=logger.НовЛоггер("ВарБотСеть")
	лог.Инфо("НовВарБотСеть()\n")
	лог.Паника(бот == nil, "НовВарБотСеть(): ИБот == nil")

	лог.Инфо("НовВарБотСеть(): имя=%q\n", бот.Имя())
	ctx, фнОтмена := context.WithCancel(бот.Контекст())
	сам := &ВарБотСеть{
		бот:        бот,
		вебСокет:   bot_web_conn.НовБотВебСокет(),
		еслиОнлайн: safe_bool.НовБезопБул(),
		ctx:        ctx,
		фнОтмена:   фнОтмена,
		лог:        лог,
	}
	сам.вебВоркер = http_worker.НовХттпВоркер(сам, сам.вебСокет.ВебСокет())
	// Подключаем сетевой логин
	сам.логин = bot_net_login.НовБотСетьЛогин(сам, сам.вебСокет.ВебСокет())

	сам.еслиОнлайн.Уст()
	_ = types.ИБотСеть(сам)
	return сам
}

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

// Контекст -- контекст сети бота
func (сам *ВарБотСеть) Контекст() context.Context {
	return сам.ctx
}

// Отмена -- отменяет контекст сети бота
func (сам *ВарБотСеть) Отмена() {
	сам.фнОтмена()
}

// ЕслиОнлайн -- возвращает признак нахождения в онлайне
func (сам *ВарБотСеть) ЕслиОнлайн() *safe_bool.БезопБул {
	return сам.еслиОнлайн
}

// ВебВоркер -- возвращает веб-воркер бота
func (сам *ВарБотСеть) ВебВоркер() types.ИХттпВоркер {
	return сам.вебВоркер
}

// Куки -- возвращает куки для HTTP-коннект
func (сам *ВарБотСеть) Куки() types.ИБотКуки {
	return сам.вебСокет.Куки()
}
