/// <summary>
        /// Word add to black list
        /// </summary>
        /// <param name="sender"></param>
        public void AddToBlackList(object sender)
        {
            var textBlock = sender as TextBlock;
            var wordItem  = textBlock.DataContext as WordItem;

            var blackWord = new DiaryBlackWord
            {
                Word = wordItem.Word.ToLower()
            };

            using var db = new AppDbContext();

            if (!db.DiaryBlackWords.Any(x => x.Word == wordItem.Word.ToLower()))
            {
                db.DiaryBlackWords.Add(blackWord);

                db.SaveChanges();
            }

            WordList.Remove(wordItem);

            BlackWordsList.Add(new WordItem
            {
                Id      = blackWord.Id,
                Word    = wordItem.Word,
                Command = new RelayParameterizedCommand(RemoveFromBlackList)
            });
        }
        /// <summary>
        /// Word remove from black list
        /// </summary>
        /// <param name="sender"></param>
        public void RemoveFromBlackList(object sender)
        {
            var textBlock = sender as TextBlock;
            var wordItem  = textBlock.DataContext as WordItem;

            using var db = new AppDbContext();

            db.DiaryBlackWords.Remove(new DiaryBlackWord
            {
                Id   = wordItem.Id,
                Word = wordItem.Word
            });

            db.SaveChanges();

            var item = BlackWordsList.First(x => x.Word == wordItem.Word);

            BlackWordsList.Remove(item);

            WordList.Add(new WordItem
            {
                Id      = wordItem.Id,
                Word    = wordItem.Word,
                Count   = 0,
                Command = new RelayParameterizedCommand(AddToBlackList)
            });
        }
        /// <summary>
        /// Retrives diary logs by target year and applies month of days
        /// </summary>
        public async Task LoadLogOfDays()
        {
            using var db = new AppDbContext();

            // diary logs
            var diaryLogs = db.DiaryLogs
                            .Where(x => EF.Functions.Like(x.Date.Year.ToString(), TargetYear.YearNumber.ToString()))
                            .Select(x => new DiaryLog
            {
                Id               = x.Id,
                Date             = x.Date,
                LogContent       = x.LogContent,
                AddedDate        = x.AddedDate,
                UpdateDate       = x.UpdateDate,
                LogContentLength = x.LogContentLength,
                DiaryLogRate     = db.DiaryLogRates.FirstOrDefault(c => c.DiaryLogId == x.Id)
            }).ToList();

            // set diarylogs of days
            foreach (DiaryLog log in diaryLogs)
            {
                var targetMonth = log.Date.Month - 1;

                if (Months[targetMonth].DiaryDays.Any(x => x.Date == log.Date))
                {
                    var day = Months[targetMonth].DiaryDays.First(x => x.Date == log.Date);
                    day.DiaryLog  = log;
                    day.DayStatus = log.Date.Date == DateTime.Now.Date ? DayStatus.LoggedToday : DayStatus.LoggedDay;
                }
            }

            // load black list
            BlackWordsList = db.DiaryBlackWords.Select(x => new WordItem
            {
                Id      = x.Id,
                Word    = x.Word,
                Count   = x.Word.Length,
                Command = new RelayParameterizedCommand(RemoveFromBlackList)
            }).ToObservableCollection();

            // load most used words of diarylogs
            var wordList = diaryLogs.SelectMany(x => x.LogContent
                                                .Replace("\n", null).Replace("\r", null).ToLower().Split(new[] { ' ', '.', ',', '\'' }))
                           .GroupBy(x => x)
                           .Select(x => new WordItem
            {
                Word    = Settings.CultureInfo.TextInfo.ToTitleCase(x.Key),
                Count   = x.Count(),
                Command = new RelayParameterizedCommand(AddToBlackList)
            })
                           .Where(x => x.Word.Length > 2 && x.Count > 10)
                           .OrderBy(a => Guid.NewGuid())
                           .ToList();

            // remove black list items from most used words list
            for (int i = 0; i < wordList.Count; i++)
            {
                if (BlackWordsList.Any(x => x.Word == wordList[i].Word.ToLower()))
                {
                    wordList.Remove(wordList[i]);
                }
            }

            // set filtered list to ToObservableCollection
            WordList = wordList.Take(200).ToObservableCollection();
        }