using GameModel; using GameModel.Contract; using GameModel.Contracts; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GameHandler { class GameStateHandlerItem { internal Guid GameStateId; internal bool Saved; internal T Data; public GameStateHandlerItem(Guid gameStateId, T data) { GameStateId = gameStateId; Data = data; } } public class GameStateHandler { private Guid _gameStateId; private List> gameStates = new List>(); private List> expenseModels = new List>(); private List> memberExpenses = new List>(); private IGameRepository _gameRepository; private IExpenseRepository _expenseRepository; public GameStateHandler(IGameRepository gameRepository, IExpenseRepository expenseRepository) { _gameRepository = gameRepository; _expenseRepository = expenseRepository; } public ExpenseModel ExpenseModel { get { var res = expenseModels.LastOrDefault(); if (res != null) { return res.Data; } return null; } } public GameState GameState { get { var res = gameStates.LastOrDefault(); if (res != null) { return res.Data; } return null; } } internal async Task Add(ExpenseModel expenseModel) { if (ExpenseModel != null) { if (!expenseModel.Equals(ExpenseModel)) { expenseModels.Add(new GameStateHandlerItem(_gameStateId, expenseModel)); } } else { expenseModels.Add(new GameStateHandlerItem(_gameStateId, expenseModel)); } foreach(var memberExpense in expenseModel.MemberExpenses.Where(_ => !memberExpenses.Any(me => me.Data.Id.Equals(_.Id)))) { var item = new GameStateHandlerItem(_gameStateId, memberExpense with { GamestateId = _gameStateId }); memberExpenses.Add(item); await Save(item); } } private async Task Save(GameStateHandlerItem item) { await _expenseRepository.Save(item.Data); } internal async Task Add(GameState newState, Game game) { if (!newState.Equals(GameState)) { _gameStateId = Guid.NewGuid(); var item = new GameStateHandlerItem(_gameStateId, newState with { Id = _gameStateId, Counter = gameStates.Count + 1 }); gameStates.Add(item); await Save(item); } } private async Task Save(GameStateHandlerItem item) { await _gameRepository.Save(item.Data); } public void Undo() { } internal async Task CreateNewGame() { return await _gameRepository.Create(null); } } }