package stats import ( "rideaware/pkg/database" ) type Service struct { repo *Repository } func NewService() *Service { return &Service{ repo: NewRepository(), } } func (s *Service) GetSummary(userID uint) (*Summary, error) { return s.repo.GetSummary(userID) } func (s *Service) GetWeeklyStats(userID uint, weeks int) ([]PeriodStats, error) { if weeks <= 0 || weeks > 52 { weeks = 12 } return s.repo.GetWeeklyStats(userID, weeks) } func (s *Service) GetMonthlyStats(userID uint, months int) ([]PeriodStats, error) { if months <= 0 || months > 24 { months = 12 } return s.repo.GetMonthlyStats(userID, months) } func (s *Service) GetPersonalBests(userID uint) ([]PersonalBest, error) { return s.repo.GetPersonalBests(userID) } // getUserFTP retrieves the user's FTP from the user_profiles table. func (s *Service) getUserFTP(userID uint) int { var ftp int database.DB.Table("user_profiles"). Where("user_id = ?", userID). Select("ftp"). Scan(&ftp) return ftp } // GetTrainingLoad returns daily TSS data and the user's FTP. func (s *Service) GetTrainingLoad(userID uint, days int) ([]DailyTSS, int, error) { if days <= 0 || days > 730 { days = 180 } ftp := s.getUserFTP(userID) data, err := s.repo.GetDailyTSS(userID, ftp, days) if err != nil { return nil, 0, err } return data, ftp, nil } // GetPowerHistory returns power data points for completed workouts. func (s *Service) GetPowerHistory(userID uint, days int) ([]PowerPoint, error) { if days <= 0 || days > 730 { days = 365 } return s.repo.GetPowerHistory(userID, days) }