package store

import (
	"speedtest/internal/db"

	"gorm.io/gorm"
)

// ResultStore 测速结果数据访问层
type ResultStore struct {
	db *gorm.DB
}

// NewResultStore creates a new ResultStore.
func NewResultStore(database *gorm.DB) *ResultStore {
	return &ResultStore{db: database}
}

// Create 保存一次测速结果
func (s *ResultStore) Create(r *db.SpeedTestResult) error {
	return s.db.Create(r).Error
}

// TopBy 按指定列排序取前 n 条（col 为白名单列名，asc 控制方向）
func (s *ResultStore) TopBy(col string, asc bool, n int) ([]db.SpeedTestResult, error) {
	var results []db.SpeedTestResult
	order := col + " DESC"
	if asc {
		order = col + " ASC"
	}
	err := s.db.Order(order).Limit(n).Find(&results).Error
	return results, err
}

// GetByID 按 ID 查询单条记录
func (s *ResultStore) GetByID(id uint) (*db.SpeedTestResult, error) {
	var r db.SpeedTestResult
	if err := s.db.First(&r, id).Error; err != nil {
		return nil, err
	}
	return &r, nil
}

// CountBetter 统计比指定值更优的记录数（用于计算记录的真实排名）
func (s *ResultStore) CountBetter(col string, asc bool, value float64) (int64, error) {
	op := ">"
	if asc {
		op = "<"
	}
	var n int64
	err := s.db.Model(&db.SpeedTestResult{}).Where(col+" "+op+" ?", value).Count(&n).Error
	return n, err
}

// TopDownload 返回下载速度最快的 n 条记录
func (s *ResultStore) TopDownload(n int) ([]db.SpeedTestResult, error) {
	return s.TopBy("download_mbps", false, n)
}

// TopUpload 返回上传速度最快的 n 条记录
func (s *ResultStore) TopUpload(n int) ([]db.SpeedTestResult, error) {
	return s.TopBy("upload_mbps", false, n)
}

// TopLatency 返回延迟最低的 n 条记录
func (s *ResultStore) TopLatency(n int) ([]db.SpeedTestResult, error) {
	return s.TopBy("latency_ms", true, n)
}

// Count 返回测速总次数
func (s *ResultStore) Count() (int64, error) {
	var total int64
	err := s.db.Model(&db.SpeedTestResult{}).Count(&total).Error
	return total, err
}
