private async Task <IEnumerable <LiveMatchStatus> > CreateMatchLiveStatus(IEnumerable <EventLiveMatchStatus> matchStatus, string matchId)
        {
            var teamPlayers = await _teamPlayerRepository.GetTeamPlayers();

            var liveMatchStatus = _genericLiveMatchStatusRepository.GetMongoDbCollection("TeamLiveStatus");

            var isTeamLiveStatusCount = _teamLiveStatusRepository.GetTeamLiveStatusCount(matchId).Result;

            var matchPlayerStatus = matchStatus.Select(a => a.PlayerInfos.GroupBy(g => g.TeamId).OrderBy(o => o.Key));

            var matchStatusTimeStamp = matchStatus.Select(a => a.EventTimeStamp);

            var matchStatusMatchId = matchStatus.Select(a => a.MatchId);

            var teamLiveStatusCollection = new List <LiveMatchStatus>();

            foreach (var item in matchPlayerStatus)
            {
                foreach (var item1 in item)
                {
                    var teamLiveStatus = new LiveMatchStatus();

                    var teamPlayerLiveStatusCollection = new List <LiveMatchPlayerStatus>();

                    int aliveCountIncremental = 0;
                    int deadCountIncremental  = 0;

                    int aliveCount = 0;
                    int deadCount  = 0;

                    foreach (var item2 in item1)
                    {
                        var teamPlayerStatus = new LiveMatchPlayerStatus();
                        teamLiveStatus.TeamId       = teamPlayers.Where(cn => cn.PlayerName == item2.PlayerName).Select(a => a.TeamIdShort).FirstOrDefault();
                        teamLiveStatus.TeamName     = _teamRepository.GetTeam().Result.Where(cn => cn.TeamId == teamLiveStatus.TeamId).Select(s => s.Name).ElementAtOrDefault(0);
                        teamPlayerStatus.PlayerId   = teamPlayers.Where(cn => cn.PlayerName == item2.PlayerName).Select(a => a.PlayerId).FirstOrDefault();
                        teamPlayerStatus.PlayerName = item2.PlayerName;
                        teamPlayerStatus.Location   = item2.Location;
                        teamPlayerStatus.Health     = item2.Health;
                        teamPlayerStatus.BoostGauge = item2.BoostGauge;

                        teamPlayerStatus.ArmedWeapon        = item2.ArmedWeapon;
                        teamPlayerStatus.ArmedAmmoCount     = item2.ArmedAmmoCount;
                        teamPlayerStatus.InventoryAmmoCount = item2.InventoryAmmoCount;

                        teamPlayerStatus.IsAlive = item2.Health > 0.000000000000001 ? true : false;

                        if (item2.Health < 0.000000000000001 && teamPlayerStatus.IsAlive == false)
                        {
                            teamPlayerStatus.State = "Dead";
                        }
                        else
                        {
                            teamPlayerStatus.State = item2.State;
                        }


                        aliveCount = item2.Health > 0.00001 ? ++aliveCountIncremental : aliveCountIncremental;

                        deadCount = item2.Health > 0.00001 ? deadCountIncremental : ++deadCountIncremental;

                        teamPlayerLiveStatusCollection.Add(teamPlayerStatus);

                        teamLiveStatus.TeamPlayers = teamPlayerLiveStatusCollection;

                        teamLiveStatus.AliveCount = aliveCount;

                        teamLiveStatus.DeadCount = deadCount;

                        teamLiveStatus.IsEliminated = deadCount == 4 ? true : false;

                        teamLiveStatus.MatchId = matchStatusMatchId.ElementAtOrDefault(0);

                        if (isTeamLiveStatusCount != 0 && teamLiveStatus.TeamId != 0)
                        {
                            var isTeamPlayerStatus = liveMatchStatus.FindAsync(Builders <LiveMatchStatus> .Filter.Where(cn => cn.TeamId == teamLiveStatus.TeamId && cn.MatchId == matchId)).Result.FirstOrDefaultAsync().Result;

                            if (isTeamPlayerStatus != null)
                            {
                                if (isTeamPlayerStatus.EliminatedAt == 0 && teamLiveStatus.IsEliminated == true)
                                {
                                    teamLiveStatus.EliminatedAt = matchStatusTimeStamp.ElementAtOrDefault(0);
                                }
                            }
                        }
                    }
                    teamLiveStatusCollection.Add(teamLiveStatus);
                }

                if (isTeamLiveStatusCount == 0)
                {
                    _teamLiveStatusRepository.CreateTeamLiveStatus(teamLiveStatusCollection);
                }
                else
                {
                    foreach (var team in teamLiveStatusCollection)
                    {
                        if (team.TeamId != 0)
                        {
                            var document = liveMatchStatus.Find(Builders <LiveMatchStatus> .Filter.Where(cn => cn.TeamId == team.TeamId && cn.MatchId == matchId)).FirstOrDefault();

                            if (document.IsEliminated == false)
                            {
                                team.Id = document.Id;

                                var filter = Builders <LiveMatchStatus> .Filter.Eq(s => s.Id, document.Id);

                                _teamLiveStatusRepository.ReplaceTeamLiveStatus(team, filter);
                            }
                        }
                    }
                }
            }

            return(await Task.FromResult(teamLiveStatusCollection));
        }
 public void ReplaceTeamLiveStatus(LiveMatchStatus liveMatchStatus, FilterDefinition <LiveMatchStatus> filter)
 {
     _liveMatchStatusRepository.Replace(liveMatchStatus, filter, "TeamLiveStatus");
 }