/// <summary>
 ///
 /// </summary>
 /// <param name="searchEngineId"></param>
 /// <param name="regionId"></param>
 /// <param name="proxyId"></param>
 /// <returns></returns>
 private Proxy CreateProxyDetails(short searchEngineId, short regionId, int proxyId)
 {
     Data.Entities.Proxy proxy = _proxyRepo.Select(proxyId); // proxy id
     return(new Proxy
     {
         ProxyID = proxy.ID,
         IP = proxy.IP,
         Port = proxy.Port,
         SearchEngineID = searchEngineId,
         RegionID = regionId
     });
 }
        /// <summary>
        /// All methods that make use of the _proxyStatus dictionary
        /// should call this method prior.
        /// </summary>
        private void InitializeProxyStatuses()
        {
            Log.Information("Initializing Proxy Statuses");
            // create search engine, region, proxy tuples
            IEnumerable <Data.Entities.SearchEngine> searchEngines = _searchEngineRepo.SelectAll();
            List <Data.Entities.Proxy> proxies = _proxyRepo.SelectAll().ToList();

            // shuffle
            int n = proxies.Count();

            for (int i = n - 1; i >= 1; i--)
            {
                int j = _random.Next(0, i);
                Data.Entities.Proxy temp = proxies[i];
                proxies[i] = proxies[j];
                proxies[j] = temp;
            }

            foreach (var searchEngine in searchEngines)
            {
                foreach (var proxy in proxies)
                {
                    Tuple <short, short> key = new Tuple <short, short>(searchEngine.ID, proxy.RegionID);
                    if (!_proxyStatuses.ContainsKey(key))
                    {
                        _proxyStatuses[key] = new Dictionary <int, ProxyStatus>();
                    }

                    _proxyStatuses[key].Add(proxy.ID, new ProxyStatus
                    {
                        IsLocked = false,
                        // forces slow start, but proxies will now be naturally distributed
                        NextAvailability = new DateTime(
                            DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day,
                            DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, 0).AddSeconds(
                            _random.Next(START_LOWER_BOUND, START_UPPER_BOUND))
                    });
                }
            }

            _addedInitStatuses = true;
        }