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, bool saved) { GameStateId = gameStateId; Saved = saved; 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 void Add(ExpenseModel expenseModel) { if (ExpenseModel != null) { if (!expenseModel.Equals(ExpenseModel)) { expenseModels.Add(new GameStateHandlerItem(_gameStateId, expenseModel, false)); Save(); } } else { expenseModels.Add(new GameStateHandlerItem(_gameStateId, expenseModel, false)); Save(); } foreach(var memberExpense in expenseModel.MemberExpenses.Where(_ => memberExpenses.Any(me => me.Data.Id.Equals(_.Id)))) { memberExpenses.Add(new GameStateHandlerItem(_gameStateId,memberExpense,false)); } } internal void Add(GameState newState) { if (!newState.Equals(GameState)) { _gameStateId = Guid.NewGuid(); gameStates.Add(new GameStateHandlerItem(_gameStateId, newState, false)); Save(); } } private void Save() { foreach (var item in gameStates.Where(_ => !_.Saved)) { _gameRepository.Save(item.Data); item.Saved = true; } foreach (var item in memberExpenses) { _expenseRepository.Save(item.Data); item.Saved = true; } } public void Undo() { } } }