55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
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 ""
|
|
}
|