public static void MapFrom(this ArenaSessionModel target, ArenaSessionModel source)
 {
     target.InjectFrom(source);
     // target.Games.IsNotifying = false;
     target.Games.Clear();
     target.Games.AddRange(source.Games);
     // target.Games.IsNotifying = true;
     // target.Games.Refresh();
 }
 public static void MapFrom(this ArenaSessionModel target, ArenaSession source)
 {
     target.InjectFrom(source);
     // target.Games.IsNotifying = false;
     target.Games.Clear();
     target.Games.AddRange(source.Games.Select(g => g.ToModel()));
     // target.Games.IsNotifying = true;
     // target.Games.Refresh();
 }
 public static ArenaSessionModel ToModel(this ArenaSession arena, int arenaSessionRecurse = 0)
 {
     if (arena == null)
     {
         return null;
     }
     ArenaSessionModel model = null;
     model = new ArenaSessionModel();
     model.InjectFrom(arena);
     model.Games.AddRange(arena.Games.Select(x => x.ToModel(arenaSessionRecurse, model)));
     return model;
 }
        public static ArenaSessionModel ToModel(this ArenaSession arena, int arenaSessionRecurse = 0)
        {
            if (arena == null)
            {
                return(null);
            }
            ArenaSessionModel model = null;

            model = new ArenaSessionModel();
            model.InjectFrom(arena);
            model.Games.AddRange(arena.Games.Select(x => x.ToModel(arenaSessionRecurse, model)));
            return(model);
        }
 public static GameResultModel ToModel(this GameResult game, int arenaSessionRecurse = 0, ArenaSessionModel arenaSessionModel = null)
 {
     if (game == null)
     {
         return null;
     }
     GameResultModel model = null;
     model = new GameResultModel();
     model.InjectFrom(game);
     if (arenaSessionRecurse <= 1)
     {
         arenaSessionRecurse++;
         model.ArenaSession = arenaSessionModel ?? game.ArenaSession.ToModel(arenaSessionRecurse);
     }
     return model;
 }
        public async Task AssignGameToArena(GameResultModel gameModel, ArenaSessionModel arenaModel)
        {
            using (var context = this.dbContext())
            {
                // var lastGame = context.Games.Where(x => x.ArenaSessionId == arenaModel.Id).OrderByDescending(x => x.ArenaGameNo).FirstOrDefault();
                var arena = context.ArenaSessions.Query().First(x => x.Id == arenaModel.Id);
                var game = context.Games.Query().First(x => x.Id == gameModel.Id);
                // game.ArenaGameNo = lastGame == null ? 1 : lastGame.ArenaGameNo + 1;

                AddGameToArena(game, arena);
                SetEndDateIfNeeded(arena);
                arena.Modified = DateTime.Now;
                game.Modified = DateTime.Now;
                await context.SaveChangesAsync();

                gameModel.InjectFrom(game);
                arenaModel.InjectFrom(arena);

                gameModel.ArenaSession = arenaModel;
                arenaModel.Games.Add(gameModel);
            }
        }
        public async Task UpdateArenaSession(ArenaSessionModel arenaModel)
        {
            using (var context = this.dbContext())
            {
                var arena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == arenaModel.Id);
                if (arena == null)
                {
                    throw new ArgumentException("arena does not exist", "arenaModel");
                }
                if (!Equals(arenaModel.Hero, arena.Hero))
                {
                    arena.Hero = context.Heroes.Find(arenaModel.Hero.Id);
                }
                if (arenaModel.Image1 != null)
                {
                    var img = context.ArenaDeckImages.Find(arenaModel.Image1.Id);
                    if (img == null)
                    {
                        img = arenaModel.Image1;
                        context.ArenaDeckImages.Add(img);
                    }
                    context.Entry(img).CurrentValues.SetValues(arenaModel.Image1);
                    arena.Image1 = img;
                }
                if (arenaModel.Image2 != null)
                {
                    var img = context.ArenaDeckImages.Find(arenaModel.Image2.Id);
                    if (img == null)
                    {
                        img = arenaModel.Image2;
                        context.ArenaDeckImages.Add(img);
                    }
                    context.Entry(img).CurrentValues.SetValues(arenaModel.Image2);
                    arena.Image2 = img;
                }

                context.Entry(arena).CurrentValues.SetValues(arenaModel);
                SetEndDateIfNeeded(arena);
                arena.Modified = DateTime.Now;
                await context.SaveChangesAsync();

                arena = context.ArenaSessions.Query().First(x => x.Id == arena.Id);
                var latestId = context.ArenaSessions.OrderByDescending(x => x.StartDate).Select(x => x.Id).FirstOrDefault();
                arenaModel.InjectFrom(arena);
                this.events.PublishOnBackgroundThread(new ArenaSessionUpdated(arenaModel.Id, latestId == arena.Id));
            }
        }
 public async Task<ArenaSessionModel> AddArenaSession(ArenaSessionModel arenaModel)
 {
     using (var context = this.dbContext())
     {
         var arena = new ArenaSession();
         arena.InjectFrom(arenaModel);
         if (arenaModel.Hero != null)
         {
             arena.Hero = context.Heroes.Find(arenaModel.Hero.Id);
         }
         if (arenaModel.Image1 != null)
         {
             var img = context.ArenaDeckImages.Find(arenaModel.Image1.Id);
             if (img == null)
             {
                 img = arenaModel.Image1;
                 context.ArenaDeckImages.Add(img);
             }
             context.Entry(img).CurrentValues.SetValues(arenaModel.Image1);
             arena.Image1 = img;
         }
         if (arenaModel.Image2 != null)
         {
             var img = context.ArenaDeckImages.Find(arenaModel.Image2.Id);
             if (img == null)
             {
                 img = arenaModel.Image2;
                 context.ArenaDeckImages.Add(img);
             }
             context.Entry(img).CurrentValues.SetValues(arenaModel.Image2);
             arena.Image2 = img;
         }
         context.ArenaSessions.Add(arena);
         await context.SaveChangesAsync();
         arenaModel.InjectFrom(arena);
     }
     this.events.PublishOnBackgroundThread(new ArenaSessionAdded(arenaModel));
     return arenaModel;
 }
        public async Task MergeArenas(ArenaSessionModel source, ArenaSessionModel target)
        {
            if (source == null || target == null || source.Hero == null || target.Hero == null || source.Hero.Id != target.Hero.Id)
            {
                Log.Error("Error merging arenas, null parameters or heroes are not the same.");
                return;
            }

            using (var context = this.dbContext())
            {
                var sourceArena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == source.Id);
                var targetArena = context.ArenaSessions.Query().FirstOrDefault(x => x.Id == target.Id);
                if (sourceArena == null || targetArena == null)
                {
                    Log.Error("Error merging arenas, source or target does not exist");
                    return;
                }

                var updatedGames = new List<GameResult>();
                foreach (var sourceGame in sourceArena.Games)
                {
                    AddGameToArena(sourceGame, targetArena);
                    updatedGames.Add(sourceGame);
                }

                for (int i = sourceArena.Games.Count - 1; i >= 0; i--)
                {
                    sourceArena.Games.Remove(sourceArena.Games[i]);
                }

                context.ArenaSessions.Remove(sourceArena);

                SetEndDateIfNeeded(targetArena);

                await context.SaveChangesAsync();

                target.MapFrom(targetArena);
                this.events.PublishOnBackgroundThread(new ArenaSessionDeleted(source));
                this.events.PublishOnBackgroundThread(new ArenaSessionUpdated(targetArena.Id));
                foreach (var game in updatedGames)
                {
                    this.events.PublishOnBackgroundThread(new GameResultUpdated(game.Id, game.ArenaSessionId));
                }
            }
        }
 public ArenaSessionDeleted(ArenaSessionModel arenaSession)
 {
     ArenaSession = arenaSession;
 }
 protected bool Equals(ArenaSessionModel other)
 {
     return this.Id.Equals(other.Id);
 }
        public static GameResultModel ToModel(this GameResult game, int arenaSessionRecurse = 0, ArenaSessionModel arenaSessionModel = null)
        {
            if (game == null)
            {
                return(null);
            }
            GameResultModel model = null;

            model = new GameResultModel();
            model.InjectFrom(game);
            if (arenaSessionRecurse <= 1)
            {
                arenaSessionRecurse++;
                model.ArenaSession = arenaSessionModel ?? game.ArenaSession.ToModel(arenaSessionRecurse);
            }
            return(model);
        }
 public ArenaSessionAdded(ArenaSessionModel arenaSession)
 {
     this.ArenaSession = arenaSession;
 }
        public async Task Save()
        {
            var arena = new ArenaSessionModel();
            arena.Hero = Hero;
            arena.StartDate = Started;
            arena.Losses = Losses;
            arena.Wins = Wins;
            arena.Server = SelectedServer.Name;

            await gameManager.AddArenaSession(arena);
            events.PublishOnBackgroundThread(new SendNotification("Arena successfully saved."));
            Reset();
            IsOpen = false;
            ArenaFlyout.Load(arena);
        }
 public async Task Retire(ArenaSessionModel arenaModel)
 {
     using (var context = this.dbContext())
     {
         var arena = context.ArenaSessions.Query().First(x => x.Id == arenaModel.Id);
         arena.Retired = true;
         if (arena.EndDate == null)
         {
             arena.EndDate = DateTime.Now;
         }
         arena.Modified = DateTime.Now;
         await context.SaveChangesAsync();
         arenaModel.InjectFrom(arena);
     }
 }
        public async Task MoveGameToArena(GameResultModel gameModel, ArenaSessionModel arenaModel)
        {
            using (var context = this.dbContext())
            {
                var sourceArena = context.ArenaSessions.Query().First(x => x.Id == gameModel.ArenaSessionId);
                var targetarena = context.ArenaSessions.Query().First(x => x.Id == arenaModel.Id);
                var game = context.Games.Query().First(x => x.Id == gameModel.Id);

                if (sourceArena.Games.Contains(game))
                {
                    sourceArena.Games.Remove(game);
                    if (game.Victory)
                    {
                        sourceArena.Wins--;
                    }
                    else
                    {
                        sourceArena.Losses--;
                    }
                }
                if (!(Equals(targetarena.Hero, game.Hero)))
                {
                    game.Hero = targetarena.Hero;
                }
                AddGameToArena(game, targetarena);
                SetEndDateIfNeeded(targetarena);

                context.SaveChanges();
                var latestId = context.ArenaSessions.OrderByDescending(x => x.StartDate).Select(x => x.Id).FirstOrDefault();
                this.events.PublishOnBackgroundThread(new ArenaSessionUpdated(sourceArena.Id, latestId == sourceArena.Id));
                this.events.PublishOnBackgroundThread(new ArenaSessionUpdated(targetarena.Id, latestId == targetarena.Id));
                this.events.PublishOnBackgroundThread(new GameResultUpdated(gameModel.Id, game.ArenaSessionId));
            }
        }
 protected bool Equals(ArenaSessionModel other)
 {
     return(Id.Equals(other.Id));
 }