package services import ( "database/sql" "fmt" "synlotto-website/internal/helpers" "synlotto-website/internal/models" thunderballRules "synlotto-website/internal/rules/thunderball" ) func MatchTicketToDraw(ticket models.MatchTicket, draw models.DrawResult, rules []models.PrizeRule, db *sql.DB) models.MatchResult { mainMatches := helpers.CountMatches(ticket.Balls, draw.Balls) bonusMatches := helpers.CountMatches(ticket.BonusBalls, draw.BonusBalls) prizeTier := GetPrizeTier(ticket.GameType, mainMatches, bonusMatches, rules) isWinner := prizeTier != "" result := models.MatchResult{ MatchedDrawID: draw.DrawID, MatchedMain: mainMatches, MatchedBonus: bonusMatches, PrizeTier: prizeTier, IsWinner: isWinner, } if ticket.GameType == "Thunderball" && isWinner { if idx, ok := thunderballRules.GetThunderballPrizeIndex(mainMatches, bonusMatches); ok { query := fmt.Sprintf(`SELECT prize%d_per_winner FROM prizes_thunderball WHERE draw_date = ?`, idx) var amount int err := db.QueryRow(query, draw.DrawDate).Scan(&amount) if err == nil { result.PrizeAmount = float64(amount) if amount == 0 { result.PrizeLabel = "Free Ticket" } else { result.PrizeLabel = fmt.Sprintf("£%.2f", float64(amount)) } } } } return result } func GetPrizeTier(game string, main, bonus int, rules []models.PrizeRule) string { for _, rule := range rules { if rule.Game == game && rule.MainMatches == main && rule.BonusMatches == bonus { return rule.Tier } } return "" }