package lststring

import (
	"fmt"
	"strings"
	"sync"
)

/*
	Потокобезопасный компонент списка строк для анализа объектов
*/

// LstString -- потокобезопасный список строк объекта
type LstString struct {
	val        []string
	strControl string
	block      sync.RWMutex
}

// NewLstString -- возвращает новый *LstString
func NewLstString(strControl string) (*LstString, error) {
	if strControl == "" {
		return nil, fmt.Errorf("NewLstString(): strControl is empty")
	}
	sf := &LstString{
		val:        make([]string, 0),
		strControl: strControl,
	}
	return sf, nil
}

// Get -- возвращает список строк
func (sf *LstString) Get() []string {
	sf.block.RLock()
	defer sf.block.RUnlock()
	return sf.val
}

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

}
