package tankstat

import (
	"fmt"
	"log"

	"wartank/pkg/types"
	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
)

/*
	Исходник предоставляет статические параметры танка.
	Броня, атака, прочность и т.п.
*/

// TankStat -- статические параметры танка
type TankStat struct {
	атака     types.ИСтатПарам // Сила атаки танка
	точность  types.ИСтатПарам // Точность танка
	прочность types.ИСтатПарам // Броня танка
	броня     types.ИСтатПарам // Броня танка
	power     types.ИСтатПарам // Танковая мощь (может не совпадать по сумме, если есть усиление)
	усиление  types.ИСтатПарам
}

// NewTankStat -- возвращает новый *TankStat
func NewTankStat() (*TankStat, error) {
	атака, ош := static_param.НовСтатПарам("attack")
	if ош != nil {
		return nil, fmt.Errorf("НовТанкСтат(): при создании статы атаки, ош=\n\t%w", ош)
	}
	точность, ош := static_param.НовСтатПарам("fyne")
	if ош != nil {
		return nil, fmt.Errorf("НовТанкСтат(): при создании статы точности, ош=\n\t%w", ош)
	}
	прочность, ош := static_param.НовСтатПарам("armor")
	if ош != nil {
		return nil, fmt.Errorf("НовТанкСтат(): при создании статы прочности, ош=\n\t%w", ош)
	}
	броня, ош := static_param.НовСтатПарам("hard")
	if ош != nil {
		return nil, fmt.Errorf("НовТанкСтат(): при создании статы брони, ош=\n\t%w", ош)
	}
	мощь, ош := static_param.НовСтатПарам("power")
	if ош != nil {
		return nil, fmt.Errorf("НовТанкСтат(): при создании статы мощи, ош=\n\t%w", ош)
	}
	усиление, ош := static_param.НовСтатПарам("force")
	if ош != nil {
		return nil, fmt.Errorf("НовТанкСтат(): при создании статы усиления, ош=\n\t%w", ош)
	}
	sf := &TankStat{
		атака:     атака,
		точность:  точность,
		прочность: прочность,
		броня:     броня,
		power:     мощь,
		усиление:  усиление,
	}
	return sf, nil
}

// Атака -- возвращает объект силы атаки
func (sf *TankStat) Атака() types.ИСтатПарам {
	return sf.атака
}

// Прочность -- возвращает объект прочности танка
func (sf *TankStat) Прочность() types.ИСтатПарам {
	return sf.броня
}

// Точность -- возвращает объект точности танка
func (sf *TankStat) Точность() types.ИСтатПарам {
	return sf.точность
}

// Броня -- возвращает объект брони танка
func (sf *TankStat) Броня() types.ИСтатПарам {
	return sf.прочность
}

// Мощь -- возвращает объект мощи танка
func (sf *TankStat) Мощь() types.ИСтатПарам {
	return sf.power
}

// Форсаж -- возвращает объект форсированного параметра
func (sf *TankStat) Форсаж() types.ИСтатПарам {
	return sf.усиление
}

// Форсаж -- возвращает объект форсированного параметра
func (сам *TankStat) ФорсажОбнов(парам string, знач int) {
	var ош error
	сам.усиление, ош = static_param.НовСтатПарам("force")
	if ош != nil {
		log.Printf("НовТанкСтат(): при создании статы усиления, ош=\n\t%v\n", ош)
		panic("TanStat.ФорсажОбнов()")
	}
	сам.усиление.Уст(знач)
}
