package service

// expAdder EnergyService 对经验增加的最小依赖（ISP）
type expAdder interface {
	AddExp(userID uint, delta int) (newExp int, levelUp bool, err error)
}

// EnergyService 域能业务逻辑
type EnergyService struct {
	repo     EnergyStore
	fundRepo FundStore // 只读查询用（GetFundBalance/GetFundLogs）
	expSvc   expAdder
	notifSvc energyNotifier
}

// NewEnergyService 构造函数
func NewEnergyService(repo EnergyStore, expSvc expAdder, notifSvc energyNotifier) *EnergyService {
	return &EnergyService{repo: repo, expSvc: expSvc, notifSvc: notifSvc}
}

// SetExpAdder 链式注入经验服务（用于赋能获得经验）
func (s *EnergyService) SetExpAdder(svc expAdder) {
	s.expSvc = svc
}

// SetFundRepo 链式注入公户仓储（只读查询）
func (s *EnergyService) SetFundRepo(repo FundStore) {
	s.fundRepo = repo
}

// EnergyInfo 域能信息（含每日赋能经验状态）
type EnergyInfo struct {
	Energy             int  // 域能余额（乘10存储）
	DailyEnergizeExp   int  // 当日已通过赋能获得的经验值
	DailyExpCap        int  // 每日赋能经验上限
	DailyExpCapReached bool // 是否已达上限
}

// 域能相关常量（乘10存储，DB值）
const (
	EnergyCheckIn    = 10   // +1.0 域能
	EnergyRename     = -60  // -6.0 域能
	EnergyRenameRefund = 60 // +6.0 域能
	EnergyDeletePost = -20  // -2.0 域能
	EnergyEnergize1  = 10   // 轻赋 1 域能
	EnergyEnergize2  = 20   // 重赋 2 域能
	EnergizeExpPerEnergy = 10 // 每 1 域能 = 10 经验
	DailyEnergizeExpCap  = 50 // 每日赋能经验上限
	MaxEnergizePerPost   = 20 // 单用户单文章最多赋能 2 域能（×10）
)
