internal Item GetExtendedItem(Items itemEnum)
        {
            Item item = GetItem(itemEnum);

            HtmlNode root = HtmlDocumentController.GetDotabuffItemRoot(item.Reference);

            if (item.WinRate == null || item.Popularity == null)
            {
                item.WinRate    = mainController.ConvertStringToWinRate(root.SelectSingleNode(ItemPath.General.WinRate.Value).InnerText);
                item.Popularity = mainController.ConvertStringToPopularity(root.SelectSingleNode(ItemPath.General.Popularity.Value).InnerText);

                string url = UrlPath.Main + root.SelectSingleNode(ItemPath.General.Image.Value).Attributes[MainController.HTML_ATTRIBUTE_SRC].Value;
                using (WebClient webclient = HtmlDocumentController.CreateWebclient())
                {
                    item.Image = webclient.DownloadData(url);
                }
            }

            if (item.ItemDetails == null)
            {
                item.ItemDetails = itemDetailsController.FetchItemDetails(item.Reference);
            }

            item.BuildsInto = FetchBuildsList(root, ItemPath.Details.BuildsInto.Value);

            item.BuildsFrom = FetchBuildsList(root, ItemPath.Details.BuildsFrom.Value);

            return(item);
        }
        private List <Item> FetchMostUsedItems(string heroReference)
        {
            HtmlNode root = HtmlDocumentController.GetDotabuffHeroRoot(heroReference);

            IEnumerable <HtmlNode> mostUsedItemNodes = root.SelectNodes(HeroPath.MostUsedItems.List.Value);

            List <Item> mostUsedItems = new List <Item>();

            foreach (HtmlNode node in mostUsedItemNodes)
            {
                string itemReference = HtmlEntity.DeEntitize(node.Attributes[HtmlAttributes.MostUsedItem.Attribute.Value].Value).Replace(HtmlAttributes.MostUsedItem.Replace.Value, "");
                mostUsedItems.Add(mainController.ItemController.GetItem(itemReference));
            }

            return(mostUsedItems);
        }
        private List <Roles> FetchRoles(string heroReference)
        {
            HtmlNode root = HtmlDocumentController.GetDotabuffHeroRoot(heroReference);

            string roles = root.SelectSingleNode(HeroPath.General.Roles.Value).InnerText;

            string[] rolesSplit = roles.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);

            List <Roles> roleList = new List <Roles>();

            foreach (string role in rolesSplit)
            {
                roleList.Add(mainController.MapStringToEnum <Roles>(role));
            }

            return(roleList);
        }
        internal List <Ability> FetchAbilities(string heroReference)
        {
            HtmlNode root = HtmlDocumentController.GetDotabuffAbilityRoot(heroReference);

            IList <HtmlNode> abilitiesNodes = root.SelectNodes(HeroAbilitiesPath.List.Value);
            IList <HtmlNode> referenceNodes = root.SelectNodes(HeroAbilitiesPath.Image.Value);

            List <Ability> abilityList = new List <Ability>();

            int counter = 0;

            foreach (HtmlNode node in abilitiesNodes)
            {
                Ability ability = new Ability();

                HtmlNode headerNode = node.Descendants("header").First();

                ability.Name = headerNode.ChildNodes[0].InnerText;
                if (headerNode.ChildNodes.Count > 1 && !string.IsNullOrEmpty(headerNode.ChildNodes[1].InnerText))
                {
                    ability.Key = Convert.ToChar(headerNode.ChildNodes[1].InnerText);
                }

                byte[] abilityImage =
                    HtmlDocumentController.CreateWebclient()
                    .DownloadData(UrlPath.Main.Value +
                                  referenceNodes[counter].Attributes[MainController.HTML_ATTRIBUTE_SRC].Value);


                ability.Image = abilityImage;

                abilityList.Add(ability);

                counter++;
            }

            abilityList.Add(new Ability()
            {
                Name = "Attribute Bonus"
            });

            return(abilityList);
        }
        internal List <AbilityBuild> FetchMostPopularAbilityBuild(string heroReference)
        {
            HtmlNode root = HtmlDocumentController.GetDotabuffHeroRoot(heroReference);

            IList <HtmlNode> mostPopularAbilityBuildNodes     = root.SelectNodes(HeroPath.MostPopularAbilitBuild.Abilities.Value);
            IList <HtmlNode> mostPopularAbilityBuildIconNodes = root.SelectNodes(HeroPath.MostPopularAbilitBuild.Icons.Value);

            List <Ability> abilities = FetchAbilities(heroReference);

            List <AbilityBuild> abilityBuildList = new List <AbilityBuild>();

            for (int i = 0; i < mostPopularAbilityBuildNodes.Count(); i++)
            {
                AbilityBuild abilityBuild = new AbilityBuild();

                string abilityName = HtmlEntity.DeEntitize(mostPopularAbilityBuildIconNodes[i].Attributes["alt"].Value);

                abilityBuild.Ability = abilities.First(ability => ability.Name.Contains(abilityName));



                abilityBuild.LevelBuild = new List <int>();
                IEnumerable <HtmlNode> levelBuildNodes =
                    mostPopularAbilityBuildNodes[i].Descendants("div")
                    .Where(
                        d => d.Attributes.Contains("class") && d.Attributes["class"].Value.Contains("entry choice"));


                List <int> abilityLevelBuild = new List <int>();
                foreach (HtmlNode levelBuildNode in levelBuildNodes)
                {
                    abilityLevelBuild.Add(int.Parse(levelBuildNode.InnerText));
                }

                abilityBuild.LevelBuild = abilityLevelBuild;
                abilityBuildList.Add(abilityBuild);
            }

            return(abilityBuildList);
        }
        public Hero GetExtendedHero(Heroes heroEnum)
        {
            Hero hero = mappedHeros.Find(h => h.HeroEnum == heroEnum);

            if (hero.WinRate == null || hero.Popularity == null || hero.Image == null)
            {
                HtmlNode root = HtmlDocumentController.GetDotabuffHeroRoot(hero.Reference);

                hero.WinRate    = mainController.ConvertStringToWinRate(root.SelectSingleNode(HeroPath.General.WinRate.Value).InnerText);
                hero.Popularity = mainController.ConvertStringToPopularity(root.SelectSingleNode(HeroPath.General.Popularity.Value).InnerText);

                string url = UrlPath.Main + root.SelectSingleNode(HeroPath.General.Image.Value).Attributes[MainController.HTML_ATTRIBUTE_SRC].Value;
                using (WebClient webclient = HtmlDocumentController.CreateWebclient())
                {
                    hero.Image = webclient.DownloadData(url);
                }
            }

            if (hero.Abilities == null)
            {
                hero.Abilities = abilityController.FetchAbilities(hero.Reference);
            }

            if (hero.MostPopularAbilityBuild == null)
            {
                hero.MostPopularAbilityBuild = abilityController.FetchMostPopularAbilityBuild(hero.Reference);
            }

            if (hero.Roles == null)
            {
                hero.Roles = FetchRoles(hero.Reference);
            }

            if (hero.Attributes == null)
            {
                hero.Attributes = attributeController.FetchAttributes(hero.Reference);
            }

            if (hero.LanePresence == null)
            {
                hero.LanePresence = lanePresenceController.FetchLanePresence(hero.Reference);
            }

            if (hero.BestVersus == null)
            {
                hero.BestVersus = AttachHeroesToVersus(versusController.FetchBestVersus(hero.Reference), hero.Reference);
            }

            if (hero.WorstVersus == null)
            {
                hero.WorstVersus = AttachHeroesToVersus(versusController.FetchWorstVersus(hero.Reference),
                                                        hero.Reference);
            }

            if (hero.MostUsedItems == null)
            {
                hero.MostUsedItems = FetchMostUsedItems(hero.Reference);
            }

            return(hero);
        }