static private bool ExecuteCompetitionEvents(SoccerWorldDatabaseContext _context, IRealtimeCallback _callback, DateTime date)
        {
            //get all events for current date
            ICollection <CompetitionEvent> events =
                _context.CompetitionEvents.Where(o => o.Date == date)
                .Include(o => o.NextCompetitionEvent)
                .Include(o => o.Competition)
                .ThenInclude(o => o.Clubs)
                .ThenInclude(o => o.Country)
                .OrderByDescending(o => o.Id)
                .ToList();

            if (events.Count == 0)
            {
                return(false);
            }

            //process each event sequential
            foreach (CompetitionEvent comp_event in events)
            {
                comp_event.Execute();
            }
            _context.SaveChanges();
            foreach (CompetitionEvent comp_event in events)
            {
                _callback.OnCompetitionEventProcessed(comp_event);
            }
            return(true);
        }
        public void Seed()
        {
            var country   = CreateCountry();
            var divisions = CreateCompetition(country);

            CreateCup(country);
            CreateClubs(divisions);

            Context.SaveChanges();
        }
        static private void ProcessWorld(SoccerWorldDatabaseContext _context, IRealtimeCallback _callback, DateTime target_date)
        {
            //if another Process is taking care of it, return
            if (IsProcessingMatches())
            {
                return;
            }

            //as long we did not reach target date
            while (GetWorldState().CurrentDateTime < target_date)
            {
                DateTime eventdate = GetEarliestEvent(_context);
                //update world date with the first next date (target or event)
                GetWorldState().CurrentDateTime = (eventdate < target_date ? eventdate : target_date);


                GetWorldState().AsyncProcessesCount++;
                _context.SaveChanges();
                _callback.OnWorldStateChanged(GetWorldState());
                ProcessGameTick(_context, _callback, true);
                GetWorldState().AsyncProcessesCount--;
                _context.SaveChanges();
            }
        }