using GameContract; using GameHandler.Extensions; using GameModel; using GameModel.DeathGame; using GameModel.Exceptions; using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; namespace GameHandler { public class ExpenseHandler { //public delegate void OnExpense(MemberExpense memberExpense); IExpenseRepository _expenseRepository; public ExpenseHandler(IExpenseRepository expenseRepository) { _expenseRepository = expenseRepository; } private ExpenseModel _expenseModel = new ExpenseModel(Array.Empty()); public ExpenseModel CheckThrow(BoardState currentState, PinThrow pinThrow, int[] PlayerIds) { if (!PlayerIds.Any(_ => _ == pinThrow.PlayerId)) { throw new InvalidPinThrowException($"Player {pinThrow.PlayerId} not found"); } var memberExpenses = new List(_expenseModel.MemberExpenses); var triggers = pinThrow.GetExpenseTriggers(currentState); var destExpenses = _expenseRepository.GetAll().Where(_ => _.ExpenseTriggers.Any(et => triggers.Any(et2 => et2 == et))); var inversePlayers = PlayerIds.Where(_ => _ != pinThrow.PlayerId); foreach (var expense in destExpenses) { if (expense.IsInverse) { foreach (var player in inversePlayers) { memberExpenses.Add(MemberExpense.Create(player, expense)); } } else { memberExpenses.Add(MemberExpense.Create(pinThrow.PlayerId, expense)); } } return _expenseModel with { MemberExpenses = memberExpenses.ToArray() }; } } }