static ConsoleOption Create(IConsolePersistence <Guid, MondayMorningBlues> repo)
        {
            return(new ConsoleOption("Create entity"
                                     , (m, o) =>
            {
                sContext.EntityState.Id = Guid.NewGuid();
                bool success = false;
                try
                {
                    var result = repo.Persistence.Create(CreateEntity(sContext.EntityState.Id, email: sContext.EntityState.Reference)
                                                         , new RepositorySettings()
                    {
                        WaitTime = TimeSpan.FromSeconds(30), Source = "Xigadee"
                    }).Result;

                    success = result?.IsSuccess ?? false;
                    if (success)
                    {
                        sContext.EntityState.Versionid = result.Entity.VersionId;
                    }
                }
                catch (Exception ex)
                {
                }
                finally
                {
                    PersistenceLog(m, "Create", success);
                }
            }));
        }
        static ConsoleOption StressTest(IConsolePersistence <Guid, MondayMorningBlues> repo)
        {
            return(new ConsoleOption("Create 100000 entities async"
                                     , (m, o) =>
            {
                var batchId = Guid.NewGuid().ToString("N").ToUpperInvariant();
                int i = 0;
                for (; i < 100000; i++)
                {
                    try
                    {
                        var result = repo.Persistence.Create(CreateEntity()
                                                             , new RepositorySettings()
                        {
                            WaitTime = TimeSpan.FromMinutes(15),
                            ProcessAsync = true,
                            BatchId = batchId,
                            CorrelationId = string.Format("{0}/{1}", batchId, i)
                        }
                                                             ).Result;
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }

                PersistenceLog(m, "100000 enqueued", true);
            }));
        }
        static ConsoleOption Update(IConsolePersistence <Guid, MondayMorningBlues> repo)
        {
            return(new ConsoleOption("Update entity"
                                     , (m, o) =>
            {
                var result = repo.Persistence.Update(
                    new MondayMorningBlues()
                {
                    Id = sContext.EntityState.Id,
                    ContentId = new Guid(),
                    VersionId = sContext.EntityState.Versionid,
                    Message = $"Hello mom2 -{DateTime.Now.ToString()}",
                    NotEnoughCoffee = false,
                    NotEnoughSleep = false,
                    Email = sContext.EntityState.Reference
                }
                    , new RepositorySettings()
                {
                    WaitTime = TimeSpan.FromMinutes(5)
                })
                             .Result;

                PersistenceLog(m, "Update", result.IsSuccess);

                if (result.IsSuccess)
                {
                    sContext.EntityState.Versionid = result.Entity.VersionId;
                }
            }));
        }
 static ConsoleOption Read(IConsolePersistence <Guid, MondayMorningBlues> repo)
 {
     return(new ConsoleOption("Read entity"
                              , (m, o) =>
     {
         var result = repo.Persistence.Read(sContext.EntityState.Id
                                            , new RepositorySettings()
         {
             WaitTime = TimeSpan.FromMinutes(5)
         }).Result;
         PersistenceLog(m, "Read", result.IsSuccess);
     }));
 }
 static ConsoleOption ReadByReference(IConsolePersistence <Guid, MondayMorningBlues> repo)
 {
     return(new ConsoleOption("Read entity by reference"
                              , (m, o) =>
     {
         var result = repo.Persistence.ReadByRef("email", sSettings.EntityState.Reference
                                                 , new RepositorySettings()
         {
             WaitTime = TimeSpan.FromMinutes(5)
         }).Result;
         PersistenceLog(m, "Read By Reference", result.IsSuccess);
     }));
 }
 static ConsoleOption Version(IConsolePersistence <Guid, MondayMorningBlues> repo)
 {
     return(new ConsoleOption("Version entity"
                              , (m, o) =>
     {
         var result = repo.Persistence.Version(sContext.EntityState.Id,
                                               new RepositorySettings()
         {
             WaitTime = TimeSpan.FromMinutes(5)
             , VersionId = sContext.EntityState.Versionid.ToString()
         }).Result;
         PersistenceLog(m, "Version", result.IsSuccess);
     }));
 }
 static ConsoleOption DeleteByReference(IConsolePersistence <Guid, MondayMorningBlues> repo)
 {
     return(new ConsoleOption("Delete entity by reference"
                              , (m, o) =>
     {
         var result = repo.Persistence.DeleteByRef("email", sContext.EntityState.Reference,
                                                   new RepositorySettings()
         {
             WaitTime = TimeSpan.FromMinutes(5)
             , VersionId = sContext.EntityState.Versionid.ToString()
         }).Result;
         PersistenceLog(m, "Delete By Reference", result.IsSuccess);
     }));
 }
        static ConsoleOption Search(IConsolePersistence <Guid, MondayMorningBlues> repo)
        {
            return(new ConsoleOption("Search entity"
                                     , (m, o) =>
            {
                var search = new SearchRequest();

                var result = repo.Persistence.Search(search,
                                                     new RepositorySettings()
                {
                    WaitTime = TimeSpan.FromMinutes(5)
                }).Result;

                PersistenceLog(m, "Search", result.IsSuccess);
            }));
        }
        static ConsoleOption StressCrudTest(IConsolePersistence <Guid, MondayMorningBlues> repo)
        {
            return(new ConsoleOption("Create, Read, Update, Delete 1000 entities async"
                                     , (m, o) =>
            {
                //// Create a work queue to process
                //var batchId = Guid.NewGuid().ToString("N").ToUpperInvariant();
                //var workQueue = new ConcurrentQueue<Tuple<int, Func<Lazy<IRepositoryAsync<Guid, MondayMorningBlues>>, string, Task<bool>>>>();
                //for (var j = 0; j < 1000; j++)
                //{
                //    workQueue.Enqueue(new Tuple<int, Func<Lazy<IRepositoryAsync<Guid, MondayMorningBlues>>, string, Task<bool>>>(j, (r, b) => PerformCrud(r, b, m)));
                //}

                //for (int i = 0; i < 50; i++)
                //{
                //    var taskId = i;
                //    Task.Run(async () =>
                //    {
                //        Tuple<int, IRepositoryAsync<Guid, MondayMorningBlues>, string, Task<bool>>> queueItem;
                //        while (workQueue.TryDequeue(out queueItem))
                //        {
                //            var crudStart = DateTime.UtcNow;
                //            var result = await queueItem.Item2(repo.Persistence, batchId);
                //            if (!result)
                //            {
                //                PersistenceLog(m, "Failure for " + taskId, false);
                //                return;
                //            }
                //            Console.WriteLine($"Crud for worker {taskId} processed {queueItem.Item1} successfully after {DateTime.UtcNow.Subtract(crudStart).TotalSeconds} seconds");
                //        }
                //        PersistenceLog(m, $"{taskId} Finished Crud {queueItem.Item1}", true);
                //    });
                //}

                PersistenceLog(m, "1000 enqueued", true);
            }));
        }