// package http_worker -- веб-воркер бота
package http_worker

import (
	"context"
	"io"
	"net/http"
	"strings"
	"sync"
	"time"
	"wartank/pkg/components/arena_net/http_worker/net_stat"
	"wartank/pkg/components/kernel/logger"
	"wartank/pkg/types"
)

var (
	блок sync.Mutex
)

// ХттпВоркер -- объект сетевого исполнителя бота
type ХттпВоркер struct {
	botNet     types.ИБотСеть
	conn       *http.Client
	статистика *net_stat.СетьСтата
	лог        types.ИЛоггер
}

// НовХттпВоркер -- возвращает веб-воркера бота
func НовХттпВоркер(botNet types.ИБотСеть, conn *http.Client) *ХттпВоркер {
	лог := logger.НовЛоггер("ХттпВоркер")
	лог.Инфо("НовХттпВоркер()\n")
	сам := &ХттпВоркер{
		botNet:     botNet,
		conn:       conn,
		статистика: net_stat.НовСетьСтата(botNet),
		лог:        лог,
	}
	_ = types.ИХттпВоркер(сам)
	return сам
}

// Получ -- потокобезопасно возвращает список строк по ссылке
func (сам *ХттпВоркер) Получ(strLink string) []string {
	блок.Lock()
	defer блок.Unlock()

	ctxCancel, fnCancel := context.WithTimeout(сам.botNet.Контекст(), time.Second*10)
	defer fnCancel()
	запрос, ош := http.NewRequestWithContext(ctxCancel, "GET", strLink, nil)
	сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при создании запроса, err=\n\t%v\n", ош)
	запрос.Header.Set("User-Agent", "Mozilla Firefox 106.1")
	ответ, ош := сам.conn.Do(запрос)
	сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при выполнении GET-запроса, err=\n\t%v\n", ош)
	defer ответ.Body.Close()
	сам.лог.Паника(ответ.StatusCode != http.StatusOK, "ХттпВоркер.Получ(): code=%v, status=%v", ответ.StatusCode, ответ.Status)
	binData, ош := io.ReadAll(ответ.Body)
	сам.лог.Паника(ош != nil, "ХттпВоркер.Получ(): при чтении тела ответа, err=\n\t%v\n", ош)
	сам.лог.Паника(len(binData) == 0, "ХттпВоркер.Получ(): пустое тело ответа")
	lenData := len(binData) + len(strLink)
	сам.статистика.AddByte(lenData)

	lstString := strings.Split(string(binData), "\n")
	сам.лог.Паника(len(lstString) == 0, "ХттпВоркер.Получ(): пустая строка ответа")
	return lstString
}
