package user

import (
	"context"
	"fmt"
)

// getExchangeRate 获取积分兑换比率
// 配置含义：1 元 = X 积分（后台配置的值）
// 计算：分 / (100 / rate) = 分 * rate / 100
// 当 rate=1 时：1元=1积分，100分=1积分
// 当 rate=2 时：1元=2积分，50分=1积分
func (s *service) getExchangeRate(ctx context.Context) int64 {
	// 读取后台配置的 key：points.exchange_rate
	cfg, _ := s.readDB.SystemConfigs.WithContext(ctx).Where(s.readDB.SystemConfigs.ConfigKey.Eq("points.exchange_rate")).First()
	rate := int64(1) // 默认 1 元 = 1 积分
	if cfg != nil {
		var r int64
		_, _ = fmt.Sscanf(cfg.ConfigValue, "%d", &r)
		if r > 0 {
			rate = r
		}
	}
	return rate
}

// CentsToPointsFloat 分 → 积分（浮点数，用于 API 返回展示）
// 公式：积分 = 分 * rate / 100
// 例如：rate=1, 3580分 → 35.8积分
func (s *service) CentsToPointsFloat(ctx context.Context, cents int64) float64 {
	if cents <= 0 {
		return 0
	}
	rate := s.getExchangeRate(ctx)
	return float64(cents) * float64(rate) / 100
}

// CentsToPoints 分 → 积分（整数，向下取整，用于计算）
// 公式：积分 = 分 * rate / 100
func (s *service) CentsToPoints(ctx context.Context, cents int64) (int64, error) {
	if cents <= 0 {
		return 0, nil
	}
	rate := s.getExchangeRate(ctx)
	return (cents * rate) / 100, nil
}

// PointsToCents 积分 → 分（用于将用户输入的积分转为分）
// 公式：分 = 积分 * 100 / rate
func (s *service) PointsToCents(ctx context.Context, pts int64) (int64, error) {
	if pts <= 0 {
		return 0, nil
	}
	rate := s.getExchangeRate(ctx)
	if rate == 0 {
		rate = 1
	}
	return (pts * 100) / rate, nil
}
