public async Task <IActionResult> LeggTilBok()
        {
            ApplicationUser user = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
            }

            var eiere    = _context.Eiere.OrderBy(x => x.Navn).Select(x => new { Id = x.Id.ToString(), Value = x.Navn });
            var bokTyper = _context.BokTyper.OrderBy(x => x.Type).Select(x => new { Id = x.Id.ToString(), Value = x.Type });

            List <int> aarList = new List <int>();

            for (int i = 1958; i < DateTime.Now.Year + 3; i++)
            {
                aarList.Add(i);
            }

            var tilgjengeligeAar = aarList.OrderByDescending(x => x).Select(x => new { Id = x.ToString(), Value = x.ToString() });

            KlistremerkebokViewModel model = new KlistremerkebokViewModel
            {
                StatusMessage = StatusMessage,
                BokTyper      = new SelectList(bokTyper, "Id", "Value"),
                Eiere         = new SelectList(eiere, "Id", "Value"),
                AarList       = new SelectList(tilgjengeligeAar, "Id", "Value")
            };

            model.Eiere.First().Selected    = true;
            model.BokTyper.First().Selected = true;
            model.AarList.First(x => x.Value == DateTime.Now.Year.ToString()).Selected = true;

            return(View(model));
        }
        public async Task <IActionResult> SjekkBytter(KlistremerkebokViewModel model)
        {
            KlistremerkeBok bok = await _context.Boker.Include(x => x.Merker).SingleOrDefaultAsync(m => m.Id == model.Id);

            string[] xMangler = string.IsNullOrEmpty(model.xMangler) ?
                                new string[] { } :
            model.xMangler.Split(new[] { ",", " ", ";", "-", "\r\n", "\r", "\n", "." }, StringSplitOptions.RemoveEmptyEntries);

            string[] xDubletter = string.IsNullOrEmpty(model.xDublett) ?
                                  new string[] { } :
            model.xDublett.Split(new[] { ",", " ", ";", "-", "\r\n", "\r", "\n", "." }, StringSplitOptions.RemoveEmptyEntries);

            if (bok.Merker == null)
            {
                bok.Merker = new List <Merke>();
            }

            string jegHarTilX    = "";
            string xHarTilMeg    = "";
            int    antJegHarTilX = 0;
            int    antXharTilMeg = 0;

            foreach (string s in xMangler)
            {
                int  nummer       = int.Parse(s);
                bool jegHarEkstra = bok.Merker.Any(x => x.Nummer == nummer && !x.klistretInn);

                if (jegHarEkstra)
                {
                    jegHarTilX += $"{s}-";
                    antJegHarTilX++;
                }
            }

            foreach (string s in xDubletter)
            {
                int  nummer            = int.Parse(s);
                bool xHarSomJegMangler = !bok.Merker.Any(x => x.Nummer == nummer);

                if (xHarSomJegMangler)
                {
                    xHarTilMeg += $"{s}-";
                    antXharTilMeg++;
                }
            }

            await _context.SaveChangesAsync();

            if (!string.IsNullOrEmpty(jegHarTilX))
            {
                StatusMessage += $"Jeg har {antJegHarTilX} til x: {jegHarTilX.Remove(jegHarTilX.Length - 1)}";
            }

            if (!string.IsNullOrEmpty(xHarTilMeg))
            {
                StatusMessage += $"X har {antXharTilMeg} til meg: {xHarTilMeg.Remove(xHarTilMeg.Length - 1)}";
            }

            return(RedirectToAction(nameof(Klistremerkebok)));
        }
        public async Task <IActionResult> EditBok(KlistremerkebokViewModel model)
        {
            KlistremerkeBok bok = await _context.Boker.Include(x => x.Merker).SingleOrDefaultAsync(m => m.Id == model.Id);

            if (!string.IsNullOrEmpty(model.Navn))
            {
                bok.Navn = model.Navn;
            }

            string[] merker = string.IsNullOrEmpty(model.MerkeString) ?
                              new string[] { } :
            model.MerkeString.Split(new [] { ",", " ", ";", "-", "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);

            if (bok.Merker == null)
            {
                bok.Merker = new List <Merke>();
            }

            string klistretInn = "";
            string bytteMerker = "";

            foreach (string s in merker)
            {
                int  nummer    = int.Parse(s);
                bool harFraFor = bok.Merker.Any(x => x.Nummer == nummer);

                if (!harFraFor)
                {
                    klistretInn += $"{s}-";
                }
                else
                {
                    bytteMerker += $"{s}-";
                }

                bok.Merker.Add(new Merke
                {
                    BokId       = bok.Id,
                    klistretInn = !harFraFor,
                    Bok         = bok,
                    Nummer      = nummer
                });
            }

            await _context.SaveChangesAsync();

            if (!string.IsNullOrEmpty(klistretInn))
            {
                StatusMessage += $"{klistretInn.Remove(klistretInn.Length - 1)} klistret inn. ";
            }

            if (!string.IsNullOrEmpty(bytteMerker))
            {
                StatusMessage += $"{bytteMerker.Remove(bytteMerker.Length-1)} som nye byttemerker. ";
            }

            return(RedirectToAction(nameof(Klistremerkebok)));
        }
        public async Task <IActionResult> BokInfo(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            ApplicationUser user = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
            }

            KlistremerkeBok bok = await _context.Boker
                                  .Include(x => x.Merker)
                                  .Include(x => x.Eier)
                                  .SingleOrDefaultAsync(m => m.Id == id);

            bool isAdmin = await _userManager.IsInRoleAsync(user, "Admin");

            if (!isAdmin)
            {
                if (user.Id != bok.Eier.UserId)
                {
                    StatusMessage = "Du kan kun endre dine egne bøker";
                    return(RedirectToAction(nameof(Klistremerkebok)));
                }
            }

            List <bool> merkerForAvhuking = Enumerable.Repeat(false, bok.TotaltAntallMerker + 1).ToList();

            foreach (Merke merke in bok.Merker.Where(x => x.klistretInn))
            {
                merkerForAvhuking[merke.Nummer] = true;
            }

            KlistremerkebokViewModel model = new KlistremerkebokViewModel
            {
                Id                 = bok.Id,
                StatusMessage      = StatusMessage,
                Aar                = bok.Aar,
                Navn               = bok.Navn,
                Merker             = bok.Merker,
                MerkerForAvhuking  = merkerForAvhuking,
                TotaltAntallMerker = bok.TotaltAntallMerker
            };

            return(View(model));
        }
        public async Task <IActionResult> FjernBytteMerker(KlistremerkebokViewModel model)
        {
            KlistremerkeBok bok = await _context.Boker.Include(x => x.Merker).SingleOrDefaultAsync(m => m.Id == model.Id);

            string[] fjernDisse = string.IsNullOrEmpty(model.fjernDisse) ?
                                  new string[] { } :
            model.fjernDisse.Split(new[] { ",", " ", ";", "-", "\r\n", "\r", "\n", "." }, StringSplitOptions.RemoveEmptyEntries);

            List <Merke> merker = _context.Merker
                                  .ToList()
                                  .Where(x => x.BokId == model.Id && !x.klistretInn)
                                  .ToList();

            string disseErKlistretInn = "";


            foreach (string s in fjernDisse)
            {
                Merke fjern = merker.FirstOrDefault(x => x.Nummer == int.Parse(s));

                if (fjern != null)
                {
                    _context.Merker.Remove(fjern);
                    StatusMessage += $"{fjern.Nummer}-";
                }
                else
                {
                    disseErKlistretInn += $"{s}-";
                }
            }

            if (!string.IsNullOrEmpty(StatusMessage))
            {
                StatusMessage  = StatusMessage.Remove(StatusMessage.Length - 1);
                StatusMessage += " fjernet. ";
            }

            if (!string.IsNullOrEmpty(disseErKlistretInn))
            {
                disseErKlistretInn = disseErKlistretInn.Remove(disseErKlistretInn.Length - 1);
                StatusMessage     += $@"<br \> {disseErKlistretInn} er allerede klistret inn, eller fins ikke i samlingen.";
            }


            await _context.SaveChangesAsync();

            return(RedirectToAction(nameof(Klistremerkebok)));
        }
        public async Task <IActionResult> OppdaterMerker(KlistremerkebokViewModel klistremerkebokViewModel)
        {
            KlistremerkeBok bok = await _context.Boker
                                  .Include(x => x.Merker)
                                  .SingleOrDefaultAsync(m => m.Id == klistremerkebokViewModel.Id);

            string lagtTil = "Klistret inn: ";
            string fjernet = " Fjernet: ";

            for (int i = 0; i < klistremerkebokViewModel.MerkerForAvhuking.Count; i++)
            {
                bool klistretInn = klistremerkebokViewModel.MerkerForAvhuking[i];

                if (klistretInn)
                {
                    if (!bok.Merker.Any(x => x.Nummer == i))
                    {
                        lagtTil += $"{i},";
                        bok.Merker.Add(new Merke
                        {
                            BokId       = bok.Id,
                            klistretInn = true,
                            Bok         = bok,
                            Nummer      = i
                        });
                    }
                }
                else
                {
                    if (bok.Merker.Any(x => x.Nummer == i))
                    {
                        fjernet += $"{i},";
                        bok.Merker.RemoveAll(x => x.Nummer == i);
                    }
                }
            }

            StatusMessage += $"{lagtTil.Remove(lagtTil.Length - 1)} ";

            StatusMessage += $"{fjernet.Remove(fjernet.Length - 1)} ";


            await _context.SaveChangesAsync();

            return(RedirectToAction(nameof(Klistremerkebok)));
        }
        public async Task <IActionResult> LeggTilBok(KlistremerkebokViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            KlistremerkeBok bok = new KlistremerkeBok
            {
                Aar  = model.Aar,
                Eier = _context.Eiere.ToList().First(x => x.Id == model.EierId),
                Type = _context.BokTyper.ToList().First(x => x.Id == model.BokTypeId),
                Navn = model.Navn,
                TotaltAntallMerker = model.TotaltAntallMerker
            };

            await _context.Boker.AddAsync(bok);

            await _context.SaveChangesAsync();

            return(RedirectToAction(nameof(Type)));
        }
        public async Task <IActionResult> Klistremerkebok()
        {
            ApplicationUser user = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
            }

            List <KlistremerkeBok> boker = new List <KlistremerkeBok>();

            if (await _userManager.IsInRoleAsync(user, "Admin"))
            {
                boker = _context.Boker
                        .Include(x => x.Type)
                        .Include(x => x.Merker)
                        .Include(x => x.Eier)
                        .ToList();
            }
            else
            {
                boker = _context.Boker
                        .Include(x => x.Type)
                        .Include(x => x.Merker)
                        .Include(x => x.Eier)
                        .Where(x => x.Eier.UserId == user.Id)
                        .ToList();
            }


            KlistremerkebokViewModel model = new KlistremerkebokViewModel
            {
                StatusMessage = StatusMessage,
                Boker         = boker,
                Merker        = _context.Merker.ToList()
            };

            return(View(model));
        }