package poker import ( "sort" gopoker "github.com/chehsunliu/poker" ) // HandRank evaluates the best 5-card hand from the given cards (hole + community). // Returns a rank value where lower is better (1 = royal flush). func HandRank(cards []string) int32 { gocards := make([]gopoker.Card, len(cards)) for i, c := range cards { gocards[i] = gopoker.NewCard(c) } return gopoker.Evaluate(gocards) } // HandDescription returns a human-readable description of the best hand. func HandDescription(cards []string) string { gocards := make([]gopoker.Card, len(cards)) for i, c := range cards { gocards[i] = gopoker.NewCard(c) } return gopoker.RankString(gopoker.Evaluate(gocards)) } // Winner represents a player and their hand rank at showdown. type Winner struct { Username string Rank int32 Desc string } // Showdown evaluates all active players' hands against the community cards // and returns winners sorted best to worst. Ties are included. // hands maps username -> []string of hole cards (2 cards). // community is the board (3-5 cards). func Showdown(hands map[string][]string, community []string) []Winner { results := make([]Winner, 0, len(hands)) for username, hole := range hands { all := append(hole, community...) rank := HandRank(all) results = append(results, Winner{ Username: username, Rank: rank, Desc: HandDescription(all), }) } // Sort ascending — lower rank value = better hand sort.Slice(results, func(i, j int) bool { return results[i].Rank < results[j].Rank }) return results } // Winners returns only the players who tied for best hand. func Winners(hands map[string][]string, community []string) []Winner { all := Showdown(hands, community) if len(all) == 0 { return nil } best := all[0].Rank var winners []Winner for _, w := range all { if w.Rank == best { winners = append(winners, w) } } return winners }