public void StemplingerUtOverSpesifikasjonStempling_GirSistePoeng()
        {
            var poeng = "100,80";

            var beregnet = PostIMatch.BeregnPoengForNesteRegistrering(poeng, 15);

            Assert.AreEqual(80, beregnet);
        }
        public void FørsteStempling_GirFørstePoeng()
        {
            var poeng = "100,80";

            var beregnet = PostIMatch.BeregnPoengForNesteRegistrering(poeng, 0);

            Assert.AreEqual(100, beregnet);
        }
        public void AndreStempling_GirAndrePoeng()
        {
            var poeng = "100,80";

            var beregnet = PostIMatch.BeregnPoengForNesteRegistrering(poeng, 1);

            Assert.AreEqual(80, beregnet);
        }
        public void Calculate()
        {
            var matchId = _currentMatchProvider.GetMatchId();

            //using (With.ReadUncommitted())
            using (var context = _dataContextFactory.Create())
            {
                var sorterteLag =
                    context.LagIMatch.Include(x => x.Lag.Deltakere).Include(x => x.VåpenBeholdning).Include("Våpenbeholdning.BruktIPostRegistrering")
                    .Where(x => x.Match.MatchId == matchId)
                    .OrderByDescending(x => x.PoengSum)
                    .ToList();

                // Legg på poeng fra Achievements
                var achievementsPoeng = from a in context.Achievements
                                        group a by a.LagId
                                        into g
                                        select new { LagId = g.Key, Poeng = g.Sum(x => x.Score), Achievements = g };

                foreach (var lagPoeng in achievementsPoeng)
                {
                    var p   = lagPoeng;
                    var lag = sorterteLag.Single(x => x.Lag.LagId == p.LagId);
                    lag.PoengSum += p.Poeng;
                }

                var poster = (from p in context.PosterIMatch.Include(x => x.Post)
                              where p.Match.MatchId == matchId
                              select new TempPost
                {
                    PostId = p.Post.PostId,
                    Latitude = p.Post.Latitude,
                    Longitude = p.Post.Longitude,
                    CurrentPoengIndex = p.CurrentPoengIndex,
                    PoengArray = p.PoengArray,
                    Navn = p.Post.Navn,
                    ErSynlig = p.SynligFraTid < TimeService.Now && TimeService.Now < p.SynligTilTid,
                    SynligFra = p.SynligFraTid,
                    SynligTil = p.SynligTilTid,
                    RiggetMedVåpen = p.RiggetVåpen
                }).ToList();

                var postRegistreringer = (from l in context.LagIMatch
                                          from p in l.PostRegistreringer
                                          where l.Match.MatchId == matchId
                                          select new
                {
                    PostId = p.RegistertPost.Post.PostId,
                    LagIMatchId = p.RegistertForLag.Id,
                    Poeng = p.PoengForRegistrering,
                    Deltaker = p.RegistrertAvDeltaker
                }).ToList();


                var rankedeLag = (from l in sorterteLag
                                  select new
                {
                    Id = l.Id,
                    Lag = l.Lag,
                    Rank = sorterteLag.Count(x => x.PoengSum > l.PoengSum) + 1,
                    PoengSum = l.PoengSum,
                    LagIMatch = l
                }).OrderBy(x => x.Rank).ToList();

                var poengsummer = (from l in rankedeLag
                                   select l.PoengSum).Distinct().OrderByDescending(x => x).ToList();

                var nyGameState = new Dictionary <string, GameStateForLag>();
                var random      = new Random();

                foreach (var lag in rankedeLag)
                {
                    var egenPoengIndex = poengsummer.IndexOf(lag.PoengSum);

                    var poengForover = egenPoengIndex == 0 ? lag.PoengSum : poengsummer[egenPoengIndex - 1];
                    var poengBakover = egenPoengIndex == poengsummer.Count - 1 ? lag.PoengSum : poengsummer[egenPoengIndex + 1];

                    var state = new GameStateForLag
                    {
                        LagId    = lag.Lag.LagId,
                        LagNavn  = lag.Lag.Navn,
                        LagFarge = lag.Lag.Farge,
                        LagIkon  = lag.Lag.Ikon,
                        Score    = lag.PoengSum,
                        Ranking  = new GameStateRanking
                        {
                            Rank = lag.Rank,
                            PoengBakLagetForan = poengForover - lag.PoengSum,
                            PoengForanLagetBak = lag.PoengSum - poengBakover,
                        },
                        Poster = (from p in poster.Where(x => x.ErSynlig)
                                  join r in postRegistreringer.Where(x => x.LagIMatchId == lag.Id) on p.PostId equals r.PostId into j
                                  from reg in j.DefaultIfEmpty()
                                  select new GameStatePost
                        {
                            PostId = p.PostId.ToString(),
                            Navn = p.Navn,
                            Latitude = p.Latitude,
                            Longitude = p.Longitude,
                            PoengVerdi = reg != null ? reg.Poeng : PostIMatch.BeregnPoengForNesteRegistrering(p.PoengArray, p.CurrentPoengIndex),
                            HarRegistrert = reg != null,
                        }).OrderBy(x => x.Navn).ToList(),
                        Vaapen = lag.LagIMatch.VåpenBeholdning.Where(x => x.BruktIPostRegistrering == null).Select(x => new GameStateVaapen {
                            VaapenId = x.VaapenId
                        }).ToList(),
                        Deltakere = lag.Lag.Deltakere.Select(x => new GameStateDeltaker {
                            DeltakerId = x.DeltakerId, Navn = x.Navn
                        }).ToList(),
                        Achievements = new List <GameStateAchievement>()//achievementsPoeng.Where(x => x.LagId == lag.Lag.LagId).Select(x => x.Achievements)
                    };

                    nyGameState.Add(state.LagId, state);
                }

                var scoreboard = new ScoreboardState();
                scoreboard.Poster = (from p in poster
                                     select new ScoreboardPost
                {
                    PostId = p.PostId.ToString(),
                    Latitude = p.Latitude,
                    Longitude = p.Longitude,
                    ErSynlig = p.ErSynlig,
                    Navn = p.Navn,
                    Verdi = PostIMatch.BeregnPoengForNesteRegistrering(p.PoengArray, p.CurrentPoengIndex),
                    AntallRegistreringer = postRegistreringer.Count(x => x.PostId == p.PostId),
                    SynligFra = p.SynligFra,
                    RiggetMedVåpen = p.RiggetMedVåpen
                }).OrderBy(x => x.Navn).ToList();

                scoreboard.Lag = sorterteLag.Select(l => new ScoreboardLag
                {
                    LagId                = l.Lag.LagId,
                    LagNavn              = l.Lag.Navn,
                    LagFarge             = l.Lag.Farge,
                    Score                = l.PoengSum,
                    Ranking              = sorterteLag.Count(x => x.PoengSum > l.PoengSum) + 1,
                    AntallRegistreringer = postRegistreringer.Count(x => x.LagIMatchId == l.Id)
                }).ToList();

                var deltakerPoeng = postRegistreringer
                                    .GroupBy(p => p.Deltaker.DeltakerId)
                                    .Select(g => new
                {
                    DeltakerId           = g.Key,
                    Navn                 = g.First().Deltaker.Navn,
                    LagIMatchId          = g.First().LagIMatchId,
                    AntallRegistreringer = g.Count(),
                    Poengsum             = g.Sum(x => x.Poeng)
                }).ToList();

                scoreboard.Deltakere = (from p in deltakerPoeng
                                        join l in sorterteLag on p.LagIMatchId equals l.Id
                                        select new ScoreboardDeltaker
                {
                    DeltakerId = p.DeltakerId,
                    Navn = p.Navn,
                    AntallRegistreringer = p.AntallRegistreringer,
                    Score = p.Poengsum,
                    LagId = l.Lag.LagId,
                    LagFarge = l.Lag.Farge,
                    LagIkon = l.Lag.Ikon,
                    LagNavn = l.Lag.Navn,
                    MostValueablePlayerRanking = deltakerPoeng.Count(x => x.Poengsum > p.Poengsum) + 1
                }).OrderByDescending(x => x.MostValueablePlayerRanking).ToList();

                var førsteTidspunktEtterNå = (from p in poster
                                              from t in p.Tider
                                              where t > TimeService.Now
                                              select t).Union(new[] { DateTime.MaxValue }).Min();

                scoreboard.Match = LagScoreboardMatchInfo(context, matchId);

                // swap current state
                _matchStates[matchId] = new MatchState(matchId, nyGameState, scoreboard, førsteTidspunktEtterNå);

                // IKKE SAVE CHANGES
            }
        }