private static async Task ProcessTagAddedEvent(TagsRepository tagrepo, TagAddedEvent evt)
        {
            switch (evt.Tag.Name)
            {
            case "step":
                await tagrepo.RemoveTagFromHost(evt.TagId, evt.HostId);

                var tags = await tagrepo.GetTagsForHost(evt.Host.Id);

                if (!tags.Any(x => x.Name == "prepare") && !tags.Any(x => x.Name == "restart") && !tags.Any(x => x.Name == "complete"))
                {
                    await tagrepo.AddTagToHost("prepare", evt.HostId);
                }
                else if (tags.Any(x => x.Name == "prepare") && !tags.Any(x => x.Name == "restart") && !tags.Any(x => x.Name == "complete"))
                {
                    await tagrepo.RemoveTagFromHost("prepare", evt.HostId);

                    await tagrepo.AddTagToHost("restart", evt.HostId);
                }
                else if (!tags.Any(x => x.Name == "prepare") && tags.Any(x => x.Name == "restart") && !tags.Any(x => x.Name == "complete"))
                {
                    await tagrepo.RemoveTagFromHost("restart", evt.HostId);

                    await tagrepo.AddTagToHost("complete", evt.HostId);
                }
                break;
            }
        }
        internal async Task <bool> LoopProcessor(EventRepository eventrepo, TagsRepository tagrepo, HostStatesRepository staterepo)
        {
            if (!eventrepo.HasElements)
            {
                return(false);
            }

            var appevent = await eventrepo.Dequeue();

            if (appevent == null)
            {
                return(true);
            }

            switch (appevent)
            {
            case TagAddedEvent evt:
                await ProcessTagAddedEvent(tagrepo, evt);

                break;

            case TagRemovedEvent evt:
                break;

            case HostOnlineEvent evt:
                if (staterepo
                    .GetForHost(evt.HostId, 5)
                    .All(x =>
                         x.Status == HostState.StatusEnum.Online ||
                         x.Status == HostState.StatusEnum.Warning ||
                         x.Status == HostState.StatusEnum.Critical) &&
                    !(await tagrepo.GetTagsForHost(evt.HostId)).Any(x => x.Name == "online"))
                {
                    if (!(await tagrepo.GetTagsForHost(evt.HostId)).Any(x => x.Name == "offline"))
                    {
                        break;
                    }

                    await tagrepo.AddTagToHost("online", evt.HostId);

                    await tagrepo.RemoveTagFromHost("offline", evt.HostId);
                }
                break;

            case HostOfflineEvent evt:
                if (staterepo
                    .GetForHost(evt.HostId, 5)
                    .All(x => x.Status == HostState.StatusEnum.Offline) &&
                    !(await tagrepo.GetTagsForHost(evt.HostId)).Any(x => x.Name == "offline"))
                {
                    await tagrepo.AddTagToHost("offline", evt.HostId);

                    await tagrepo.RemoveTagFromHost("online", evt.HostId);
                }
                break;

            default:
                _logger.LogError($"Unknown event type {appevent.ToString()}");
                break;
            }

            return(true);
        }