// package arena_net -- сетевая арена
package arena_net

import (
	"fmt"
	"strings"
	"sync"
	"wartank/pkg/components/kernel/logger"
	"wartank/pkg/types"
)

// АренаСеть -- базовый тип для сетевых арен
type АренаСеть struct {
	types.ИБотСеть
	клиент types.ИХттпВоркер
	сцена  types.ИСценаСтр
	стрУрл string
	блок   sync.Mutex
	лог    types.ИЛоггер
}

// НовАренаСеть -- возвращает новый *АренаСеть
func НовАренаСеть(сцена types.ИСценаСтр, стрУрл string) *АренаСеть {
	лог := logger.НовЛоггер("АренаСеть")
	лог.Инфо("НовАренаСеть(): strUrl=%q\n", стрУрл)
	лог.Паника(сцена == nil, "НовАренаСеть(): ИСценаСтр == nil")
	лог.Паника(стрУрл == "", "НовАренаСеть(): стрУрл пустой\n")
	сам := &АренаСеть{
		ИБотСеть: сцена.Бот().Сеть(),
		сцена:    сцена,
		стрУрл:   стрУрл,
		клиент:   сцена.Бот().Сеть().ВебВоркер(),
		лог:      лог,
	}
	_ = types.ИАренаСеть(сам)
	return сам
}

// Обновить -- обновляет список строк
func (сам *АренаСеть) Обновить() {
	сам.блок.Lock()
	defer сам.блок.Unlock()
	// FIXME: попытка разобраться, что за фигня творится
	// time.Sleep(time.Millisecond * 500)
	сам.лог.Отладка("Обновить(): бот=%s\tсцена=%v\n", сам.сцена.Бот().Имя(), сам.сцена.Имя())
	lstString := сам.клиент.Получ(сам.стрУрл)
	if ош := сам.сцена.СтрОбновить(lstString); ош != nil {
		сам.лог.Ошибка("Обновить(): при обновлении строк сцены, ош=\n\t%v\n", ош)
	}
}

// Get -- выполняет GET-запрос по указанному URL
func (сам *АренаСеть) Get(strLink string) (lstString []string, err error) {
	сам.блок.Lock()
	defer сам.блок.Unlock()
	// log._rintf("INFO АренаСеть.Get(): link=%v\n", сам.strUrl)
	if !strings.Contains(strLink, сам.стрУрл) {
		return nil, fmt.Errorf("АренаСеть.Get(): strLink(%v) не содержит strUrl(%v)", strLink, сам.стрУрл)
	}
	lstString = сам.клиент.Получ(strLink)
	return lstString, nil
}
