// package arena_string -- потокобезопасный компонент списка строк для анализа арены
package arena_string

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

// АренаСтроки -- потокобезопасный список строк арены
type АренаСтроки struct {
	val        []string
	strControl string // Контрольная строка в исходной строке для анализа арены
	block      sync.RWMutex
}

// НовАренаСтроки -- возвращает новый потокобезопасный список строк арены
func НовАренаСтроки(strControl string) *АренаСтроки {
	лог := logger.НовЛоггер("АренаСтроки")
	лог.Отладка("НовАренаСтроки(): strControl=%q", strControl)
	лог.Паника(strControl == "", "НовАренаСтроки(): strControl is empty")
	сам := &АренаСтроки{
		val:        make([]string, 0),
		strControl: strControl,
	}
	return сам
}

// Получ -- возвращает список строк для анализа
func (сам *АренаСтроки) Получ() []string {
	сам.block.RLock()
	defer сам.block.RUnlock()
	return сам.val
}

// Set -- устанавливает список строк для анализа
func (сам *АренаСтроки) Set(lstString []string) error {
	сам.block.Lock()
	defer сам.block.Unlock()
	if lstString == nil {
		return fmt.Errorf("АренаСтроки.Set(): lstString == nil")
	}
	if len(lstString) == 0 {
		return fmt.Errorf("АренаСтроки.Set(): lstString ничего не содержит")
	}
	isOk := false
	for _, strControl := range lstString {
		if strings.Contains(strControl, сам.strControl) {
			isOk = true
			break
		}
	}
	if isOk {
		сам.val = lstString
		return nil
	}
	// Найти заголовок
	var strOut string
	for _, strOut = range lstString {
		if strings.Contains(strOut, "<title>") {
			break
		}
	}
	return fmt.Errorf("АренаСтроки.Set(): lstString не имеет правильный title(%q), фактически(%q)", сам.strControl, strOut)
}
