package sectionnet

import (
	"fmt"
	"log"
	"strings"
	"sync"

	// "time"

	"wartank/pkg/types"
)

/*
	Базовый тип для сетевых секций
*/

// SectionNet -- базовый тип для сетевых секций
type SectionNet struct {
	client  types.INetClient
	section types.ISection
	strUrl  string
	block   sync.Mutex
}

// NewSectionNet -- возвращает новый *SectionNet
func NewSectionNet(server types.IServer, bot types.IServBot, section types.ISection, strUrl string) *SectionNet {
	log.Printf("NewSectionNet(): url=%q\n", strUrl)
	{ // Предусловия
		if server == nil {
			panic("NewSectionNet(): IServer == nil")
		}
		if bot == nil {
			panic("NewSectionNet(): IServBot == nil")
		}
		if section == nil {
			panic("NewSectionNet(): ISection == nil")
		}
		if strUrl == "" {
			panic("NewSectionNet(): strUrl is empty")
		}
	}
	sf := &SectionNet{
		section: section,
		strUrl:  strUrl,
		client:  bot.BotNet().Net(),
	}
	return sf
}

func (sf *SectionNet) Run() {

}

// Обновляет список строк
func (sf *SectionNet) UpdateLst(name string) (err error) {
	if sf == nil {
		return
	}
	sf.block.Lock()
	defer sf.block.Unlock()
	// FIXME: попытка разобраться, что за фигня творится
	// time.Sleep(time.Millisecond * 500)
	// log._rintf("INFO SectionNet.UpdateLst(): name=%s\tlink=%v\n", name, sf.strUrl)
	lstString, err := sf.client.Get(sf.strUrl)
	if err != nil {
		return fmt.Errorf("SectionNet.UpdateLst(): in make request, err=\n\t%w", err)
	}
	if err := sf.section.Update(lstString); err != nil {
		return fmt.Errorf("SectionNet.UpdateLst(): in update ISection, err=\n\t%w", err)
	}
	return nil
}

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