public FinishedToteRewards(AccountWithAmount[] proportionalReward, ToteOption winningOption,
                            decimal ownerPercent)
 {
     ProportionalReward = proportionalReward;
     OwnerPercent       = ownerPercent;
     WinningBets        = winningOption.Bets;
     WinningOptionName  = winningOption.Name;
 }
        private static void AddToteOption(ToteOption option, Models.Tote tote,
                                          StringBuilder sb)
        {
            var participantsCount = option.Bets.Select(a => a.User).Distinct().Count();

            sb.Append(
                $"*{option.Name}* ");
            if (participantsCount > 0)
            {
                var sum = option.Bets.Sum(a => a.Amount);
                sum = Decimal.Round(sum, 2);
                sb.Append(
                    $"сделано ставок на {sum} {tote.Currency} от {participantsCount} {ParticipantsDecl(participantsCount)}");
            }

            sb.AppendLine();
        }
        public FinishedToteRewards CalcRewards(Models.Tote tote, string winningOptionId)
        {
            var bets     = tote.Options.SelectMany(a => a.Bets);
            var totalSum = bets.Sum(a => a.Amount);

            var ownerPercent = totalSum / 20; //5% more fun than 1%
            var winningFund  = totalSum - ownerPercent;

            ToteOption winningOption  = tote.Options.FirstOrDefault(a => a.Id == winningOptionId);
            var        winningBets    = winningOption.Bets;
            var        winningBetsSum = winningBets.Sum(a => a.Amount);

            var ama = winningBets.Select(a => new AccountWithAmount(new Account(a.User, tote.Currency), a.Amount));
            var agg = ama.AggregateOperations();

            // var proportions = agg.Select(a => new AccountWithAmount(a.Account, a.Amount / winningBetsSum));

            AccountWithAmount[] proportionalReward = agg.Select(a =>
                                                                new AccountWithAmount(a.Account, ((a.Amount * winningFund) / winningBetsSum).Trim())).ToArray();

            ownerPercent = AdjustRemainderToOwner(proportionalReward, winningFund, ownerPercent);

            return(new FinishedToteRewards(proportionalReward, winningOption, ownerPercent));
        }