package services import ( "encoding/json" "fmt" "time" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" ) // ResultCheckerService handles the checking of game results type ResultCheckerService struct { // Add any dependencies here (e.g., repositories, external APIs) } // NewResultCheckerService creates a new instance of ResultCheckerService func NewResultCheckerService() *ResultCheckerService { return &ResultCheckerService{} } // CheckNFLResult checks the result of an NFL game func (s *ResultCheckerService) CheckNFLResult(data json.RawMessage) (*domain.Result, error) { nflResult, err := domain.ParseNFLResult(data) if err != nil { return nil, fmt.Errorf("failed to parse NFL result: %w", err) } winner, err := domain.GetNFLWinner(nflResult) if err != nil { return nil, fmt.Errorf("failed to determine NFL winner: %w", err) } score := domain.FormatNFLScore(nflResult) return &domain.Result{ Status: determineOutcomeStatus(winner, nflResult.Home.Name, nflResult.Away.Name), Score: score, FullTimeScore: score, SS: nflResult.SS, Scores: map[string]domain.Score{ "1": nflResult.Scores.FirstQuarter, "2": nflResult.Scores.SecondQuarter, "3": nflResult.Scores.ThirdQuarter, "4": nflResult.Scores.FourthQuarter, "5": nflResult.Scores.Overtime, "7": nflResult.Scores.TotalScore, }, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, nil } // determineOutcomeStatus determines the outcome status based on the winner and teams func determineOutcomeStatus(winner, homeTeam, awayTeam string) domain.OutcomeStatus { if winner == "Draw" { return domain.OUTCOME_STATUS_VOID } if winner == homeTeam { return domain.OUTCOME_STATUS_WIN } if winner == awayTeam { return domain.OUTCOME_STATUS_LOSS } return domain.OUTCOME_STATUS_PENDING } // CheckRugbyResult checks the result of a Rugby game func (s *ResultCheckerService) CheckRugbyResult(data json.RawMessage) (*domain.Result, error) { rugbyResult, err := domain.ParseRugbyResult(data) if err != nil { return nil, fmt.Errorf("failed to parse Rugby result: %w", err) } winner, err := domain.GetRugbyWinner(rugbyResult) if err != nil { return nil, fmt.Errorf("failed to determine Rugby winner: %w", err) } score := domain.FormatRugbyScore(rugbyResult) return &domain.Result{ Status: determineOutcomeStatus(winner, rugbyResult.Home.Name, rugbyResult.Away.Name), Score: score, FullTimeScore: score, SS: rugbyResult.SS, Scores: map[string]domain.Score{ "1": rugbyResult.Scores.FirstHalf, "2": rugbyResult.Scores.SecondHalf, "7": rugbyResult.Scores.TotalScore, }, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, nil } // CheckBaseballResult checks the result of a Baseball game func (s *ResultCheckerService) CheckBaseballResult(data json.RawMessage) (*domain.Result, error) { baseballResult, err := domain.ParseBaseballResult(data) if err != nil { return nil, fmt.Errorf("failed to parse Baseball result: %w", err) } winner, err := domain.GetBaseballWinner(baseballResult) if err != nil { return nil, fmt.Errorf("failed to determine Baseball winner: %w", err) } score := domain.FormatBaseballScore(baseballResult) return &domain.Result{ Status: determineOutcomeStatus(winner, baseballResult.Home.Name, baseballResult.Away.Name), Score: score, FullTimeScore: score, SS: baseballResult.SS, Scores: map[string]domain.Score{ "1": baseballResult.Scores.FirstInning, "2": baseballResult.Scores.SecondInning, "3": baseballResult.Scores.ThirdInning, "4": baseballResult.Scores.FourthInning, "5": baseballResult.Scores.FifthInning, "6": baseballResult.Scores.SixthInning, "7": baseballResult.Scores.SeventhInning, "8": baseballResult.Scores.EighthInning, "9": baseballResult.Scores.NinthInning, "10": baseballResult.Scores.ExtraInnings, "T": baseballResult.Scores.TotalScore, }, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, nil } // CheckRugbyUnionResult checks the result of a Rugby Union game func (s *ResultCheckerService) CheckRugbyUnionResult(data json.RawMessage) (*domain.Result, error) { rugbyResult, err := domain.ParseRugbyUnionResult(data) if err != nil { return nil, fmt.Errorf("failed to parse Rugby Union result: %w", err) } winner, err := domain.GetRugbyWinner(rugbyResult) if err != nil { return nil, fmt.Errorf("failed to determine Rugby Union winner: %w", err) } score := domain.FormatRugbyScore(rugbyResult) return &domain.Result{ Status: determineOutcomeStatus(winner, rugbyResult.Home.Name, rugbyResult.Away.Name), Score: score, FullTimeScore: score, SS: rugbyResult.SS, Scores: map[string]domain.Score{ "1": rugbyResult.Scores.FirstHalf, "2": rugbyResult.Scores.SecondHalf, "7": rugbyResult.Scores.TotalScore, }, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, nil } // CheckRugbyLeagueResult checks the result of a Rugby League game func (s *ResultCheckerService) CheckRugbyLeagueResult(data json.RawMessage) (*domain.Result, error) { rugbyResult, err := domain.ParseRugbyLeagueResult(data) if err != nil { return nil, fmt.Errorf("failed to parse Rugby League result: %w", err) } winner, err := domain.GetRugbyWinner(rugbyResult) if err != nil { return nil, fmt.Errorf("failed to determine Rugby League winner: %w", err) } score := domain.FormatRugbyScore(rugbyResult) return &domain.Result{ Status: determineOutcomeStatus(winner, rugbyResult.Home.Name, rugbyResult.Away.Name), Score: score, FullTimeScore: score, SS: rugbyResult.SS, Scores: map[string]domain.Score{ "1": rugbyResult.Scores.FirstHalf, "2": rugbyResult.Scores.SecondHalf, "7": rugbyResult.Scores.TotalScore, }, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, nil }