private void AddTargetLeagueToLeagueParents(ExternalLeagueCode externalLeagueCode)
 {
     if (LeagueParents.Count(x => x.ExternalLeagueCode == externalLeagueCode) == 0)
     {
         LeagueParents.Add(new LeagueParent
         {
             ExternalLeagueCode = externalLeagueCode,
             Standings          = Standings,
             FixturePasts       = FixturePasts,
             FixtureFutures     = FixtureFutures,
         });
     }
 }
        public void FetchDataFromGateway(ExternalLeagueCode externalLeagueCode, GridType gridType)
        {
            ThreadPool.QueueUserWorkItem(delegate
            {
                //Debug.WriteLine("Get thread: " + Thread.CurrentThread.ManagedThreadId);
                //Thread.Sleep(TimeSpan.FromSeconds(10));//for debugging

                var leagueParent = new LeagueParent();

                try
                {
                    //throw new Exception(); //for debugging
                    leagueParent = LeagueParents.Single(x => x.ExternalLeagueCode == externalLeagueCode);

                    switch (gridType)
                    {
                    case GridType.Standing:
                        var iEnumerableStandings = GetStandings(externalLeagueCode);
                        leagueParent.Standings.Clear();
                        var standingsList = iEnumerableStandings.ToList();
                        if (standingsList.Any(x => x.Team != null && x.Team.StartsWith(RequestLimitReached)))
                        {
                            var politeRequestLimitReached = standingsList.First(x => x.Team.StartsWith(RequestLimitReached)).Team.Replace(RequestLimitReached, EntityConstants.PoliteRequestLimitReached);
                            leagueParent.Standings.Add(new Standing {
                                PoliteError = EntityConstants.PoliteRequestLimitReached
                            });
                        }
                        else
                        {
                            if (standingsList.Any(x => x.Team != null && x.Team.StartsWith(EntityConstants.PotentialTimeout)))
                            {
                                leagueParent.Standings.Add(new Standing {
                                    PoliteError = EntityConstants.PotentialTimeout
                                });
                            }
                            else
                            {
                                foreach (var standing in iEnumerableStandings)
                                {
                                    leagueParent.Standings.Add(standing);
                                }
                            }
                        }
                        break;

                    case GridType.Result:
                        var iEnumerableFixturePasts = GetFixturePasts(externalLeagueCode);
                        leagueParent.FixturePasts.Clear();
                        var resultsList = iEnumerableFixturePasts.ToList();
                        if (resultsList.Any())
                        {
                            if (resultsList.Any(x => x.HomeName != null && x.HomeName.StartsWith(RequestLimitReached)))
                            {
                                var politeRequestLimitReached = resultsList.First(x => x.HomeName.StartsWith(RequestLimitReached)).HomeName.Replace(RequestLimitReached, EntityConstants.PoliteRequestLimitReached);
                                leagueParent.FixturePasts.Add(new FixturePast {
                                    PoliteError = EntityConstants.PoliteRequestLimitReached
                                });
                            }
                            else
                            {
                                if (resultsList.Any(x => x.HomeName != null && x.HomeName.StartsWith(EntityConstants.PotentialTimeout)))
                                {
                                    leagueParent.FixturePasts.Add(new FixturePast {
                                        PoliteError = EntityConstants.PotentialTimeout
                                    });
                                }
                                else
                                {
                                    foreach (var fixturePast in iEnumerableFixturePasts)
                                    {
                                        leagueParent.FixturePasts.Add(fixturePast);
                                    }
                                }
                            }
                        }
                        else
                        {
                            leagueParent.FixturePasts.Add(new FixturePast {
                                PoliteError = _zeroFixturePasts
                            });
                        }
                        break;

                    case GridType.Fixture:
                        var iEnumerableFixtureFutures = GetFixtureFutures(externalLeagueCode);
                        leagueParent.FixtureFutures.Clear();
                        var fixturesList = iEnumerableFixtureFutures.ToList();
                        if (fixturesList.Any())
                        {
                            if (fixturesList.Any(x => x.HomeName != null && x.HomeName.StartsWith(RequestLimitReached)))
                            {
                                var politeRequestLimitReached = fixturesList.First(x => x.HomeName.StartsWith(RequestLimitReached)).HomeName.Replace(RequestLimitReached, EntityConstants.PoliteRequestLimitReached);
                                leagueParent.FixtureFutures.Add(new FixtureFuture {
                                    PoliteError = EntityConstants.PoliteRequestLimitReached
                                });
                            }
                            else
                            {
                                if (fixturesList.Any(x => x.HomeName != null && x.HomeName.StartsWith(EntityConstants.PotentialTimeout)))
                                {
                                    leagueParent.FixtureFutures.Add(new FixtureFuture {
                                        PoliteError = EntityConstants.PotentialTimeout
                                    });
                                }
                                else
                                {
                                    foreach (var fixtureFuture in iEnumerableFixtureFutures)
                                    {
                                        leagueParent.FixtureFutures.Add(fixtureFuture);
                                    }
                                }
                            }
                        }
                        else
                        {
                            leagueParent.FixtureFutures.Add(new FixtureFuture {
                                PoliteError = _zeroFixtureFutures
                            });
                        }
                        break;

                    default:
                        break;
                    }
                }
                catch (Exception)
                {
                    leagueParent = LeagueParents.FirstOrDefault();
                    leagueParent.ExternalLeagueCode = externalLeagueCode;
                    switch (gridType)
                    {
                    case GridType.Standing:
                        leagueParent.Standings.Clear();
                        leagueParent.Standings.Add(new Standing {
                            PoliteError = EntityConstants.UnexpectedErrorOccured
                        });
                        break;

                    case GridType.Result:
                        leagueParent.FixturePasts.Clear();
                        leagueParent.FixturePasts.Add(new FixturePast {
                            PoliteError = EntityConstants.UnexpectedErrorOccured
                        });
                        break;

                    case GridType.Fixture:
                        leagueParent.FixtureFutures.Clear();
                        leagueParent.FixtureFutures.Add(new FixtureFuture {
                            PoliteError = EntityConstants.UnexpectedErrorOccured
                        });
                        break;
                    }
                }
            });
        }