// package section -- типовая секция работы части игры (банк, арсенал и т.п.)
package section

import (
	"fmt"
	"log"

	"wartank/pkg/components/lst_string"
	"wartank/pkg/components/parsetime"
	"wartank/pkg/components/section/down_time"
	"wartank/pkg/components/section/section_mode"
	"wartank/pkg/components/section/zone"
	"wartank/pkg/types"
)

// Section -- секция игры
type Section struct {
	*zone.Zone
	countDown types.ИВремяОстат     // Обратный отсчёт до окончания работы режима
	mode      types.ИРежимРаботы    // Объект режима работы
	lstString *lst_string.LstString // Список строк из сети для анализа секции
}

// NewSection -- возвращает новую секцию игры
func NewSection(bot types.ИБот, zoneName, strControl string) (*Section, error) {
	log.Printf("NewSection(): strControl=%q\n", strControl)
	zone, err := zone.NewZone(bot, zoneName)
	if err != nil {
		return nil, fmt.Errorf("NewSection(): in create IZone, err=\n\t%w", err)
	}
	sf := &Section{
		Zone:      zone,
		countDown: down_time.НовВремОбрат(zone, 5),
		mode:      section_mode.NewSectionMode(),
	}
	sf.lstString, err = lst_string.NewLstString(strControl)
	if err != nil {
		return nil, fmt.Errorf("NewSection(): in create *LstString, err=\n\t%w", err)
	}
	return sf, nil
}

// СтрОбновить -- обновляет список строк секции по требованию
func (sf *Section) СтрОбновить(lstString []string) error {
	if err := sf.lstString.Set(lstString); err != nil {
		return fmt.Errorf("Section.СтрОбновить(): при установке lstString, err=\n\t%w", err)
	}
	return nil
}

// СписПолучить -- возвращает список строк секции
func (sf *Section) СписПолучить() []string {
	return sf.lstString.Get()
}

// SetCountDown -- устанавливает новое значение обратного счётчика времени (int)
func (sf *Section) SetCountDown(sec int) error {
	sf.countDown = down_time.НовВремОбрат(sf, sec)
	// if err := sf.countDown.Set(sec); err != nil {
	// 	return fmt.Errorf("Section.SetCountDown(): err=\n\t%w", err)
	// }
	return nil
}

// ParseCountDown -- устанавливает новое значение обратного счётчика времени (string)
func (sf *Section) ParseCountDown(sec string) error {
	pt := parsetime.NewParseTime()
	pt.Parse(sec)
	_sec := pt.Get()
	sf.countDown = down_time.НовВремОбрат(sf, _sec)
	// if err := sf.countDown.Set(sec); err != nil {
	// 	return fmt.Errorf("Section.SetCountDown(): err=\n\t%w", err)
	// }
	return nil
}

// ВремяОпрос -- объект оставшегося времени
func (sf *Section) ВремяОпрос() types.ИВремяОстат {
	return sf.countDown
}

// РежимТекущ -- текущий режим работы
func (sf *Section) РежимТекущ() types.ИРежимРаботы {
	return sf.mode
}
