package store

import (
	"context"

	"gorm.io/gorm/clause"
)

// Setting 是平台级键值配置（全局，非租户作用域）——如 token→积分汇率 等可后台热调的计费规则。
// 表名 sundynix_setting。Key 唯一。
type Setting struct {
	BaseModel
	Key   string `gorm:"size:64;uniqueIndex"`
	Value string `gorm:"type:text"` // 曾是 varchar(255)：支付配置 JSON(含加密密钥)一条就超,live 撞过 22001
}

func (Setting) TableName() string { return "sundynix_setting" }

// 平台设置键。
const (
	SettingTokensPerCredit = "tokens_per_credit"
	SettingCreditEnforce   = "credit_enforce" // "on"=余额≤0 拒绝新任务；其它/未设=软扣不拦
)

// CreditEnforceEnabled 是否开启积分硬拦截（默认关：软扣，余额可为负）。
func (p *Postgres) CreditEnforceEnabled(ctx context.Context) bool {
	return p.GetSetting(ctx, SettingCreditEnforce) == "on"
}

// GetSetting 读一个平台设置；不存在返回空串（调用方回退默认）。
func (p *Postgres) GetSetting(ctx context.Context, key string) string {
	if p.db == nil {
		return ""
	}
	var s Setting
	if err := p.db.WithContext(ctx).Select("value").Where("key = ?", key).First(&s).Error; err != nil {
		return ""
	}
	return s.Value
}

// SetSetting 幂等写一个平台设置（key 唯一，重复即覆盖 value）。
func (p *Postgres) SetSetting(ctx context.Context, key, value string) error {
	if p.db == nil {
		return errStoreDisabled
	}
	return p.db.WithContext(ctx).Clauses(clause.OnConflict{
		Columns:   []clause.Column{{Name: "key"}},
		DoUpdates: clause.AssignmentColumns([]string{"value", "updated_at"}),
	}).Create(&Setting{Key: key, Value: value}).Error
}
