public ActionResult Add(SocialPageFormViewModel model)
        {
            bool error = false;
            var  listaSocialNetworks = _context.SocialNetworks.ToList();

            if (!ModelState.IsValid)
            {
                model.SocialNetworks = listaSocialNetworks;
                return(View("Add", model));
            }

            try
            {
                switch (model.SocialNetworkId)
                {
                case 1:
                    addFacebookPage(model);
                    break;

                case 2:
                    addTwitterFollow(model);
                    break;

                case 3:
                    addYoutubeSubscriber(model);
                    break;

                default:
                    throw new Exception("Please enter valid values");
                }
            }
            catch (BadLinkException e)
            {
                ModelState.AddModelError("", e.Message);
                error = true;
            }
            catch (LinkAlreadyExistException e)
            {
                ModelState.AddModelError("", e.Message);
                error = true;
            }
            catch (Exception)
            {
                ModelState.AddModelError("", "Please add a valid page");
                error = true;
            }

            if (error)
            {
                model.SocialNetworks = listaSocialNetworks;
                return(View("Add", model));
            }


            _context.SaveChanges();
            return(RedirectToAction("index", "home"));
        }
        public ActionResult Add()
        {
            var listaSocialNetworks = _context.SocialNetworks.ToList();
            var model = new SocialPageFormViewModel()
            {
                SocialNetworks = listaSocialNetworks,
                Cpc            = 10
            };

            return(View("Add", model));
        }
        private void addTwitterFollow(SocialPageFormViewModel model)
        {
            var username = Regex.Match(model.Url, @"(?<=\.com\/)[^\/\s]+").ToString();

            if (String.IsNullOrWhiteSpace(username))
            {
                throw new BadLinkException("Please enter a valid twitter url");
            }

            var user = _twitterContext.User.Where(u => u.Type == UserType.Show && u.ScreenName == username).SingleOrDefault();

            if (user == null || user.Protected)
            {
                throw new BadLinkException("This user doesn't exist or it's private");
            }

            var currentUserId = User.Identity.GetUserId();

            var twitter = _context.Twitters.SingleOrDefault(twt => twt.TwitterUsername == username);

            if (twitter != null)
            {
                if (twitter.UserId.Equals(currentUserId))
                {
                    twitter.Deleted = false;
                }
                else
                {
                    throw new LinkAlreadyExistException("This twitter accounts is already added on this site");
                }
            }
            else
            {
                TwitterPage twitterPage = new TwitterPage()
                {
                    Url             = "http://twitter.com/" + username,
                    TwitterUsername = username,
                    Name            = model.Name,
                    Cpc             = model.Cpc,
                    UserId          = currentUserId
                };

                _context.Twitters.Add(twitterPage);
            }
        }
        private void addFacebookPage(SocialPageFormViewModel model)
        {
            var url = Regex.Match(model.Url, @"http(s)?:\/\/(www\.)?facebook\.com\/[^\/\s]+").ToString();

            if (String.IsNullOrWhiteSpace(url))
            {
                throw new BadLinkException("Please enter a valid facebook page");
            }
            FacebookGraph fbGraph = new FacebookGraph(url);

            FacebookPage fbPage = new FacebookPage()
            {
                Name = model.Name,
                Url  = url,
                Cpc  = model.Cpc
            };


            var facebookId     = fbGraph.takeFacebookId();
            var fbAlreadyAdded = _context.Facebooks.SingleOrDefault(fb => fb.FacebookCode == facebookId);
            var currentUserId  = User.Identity.GetUserId();

            if (fbAlreadyAdded == null)
            {
                fbPage.FacebookCode = facebookId;
                fbPage.UserId       = currentUserId;

                _context.Facebooks.Add(fbPage);
            }
            else
            {
                if (fbAlreadyAdded.UserId == currentUserId)
                {
                    fbAlreadyAdded.Deleted = false;
                }
                else
                {
                    throw new LinkAlreadyExistException("Link is already added on this social network");
                }
            }
        }
        private void addYoutubeSubscriber(SocialPageFormViewModel model)
        {
            var    url          = Regex.Match(model.Url, @"http(s):\/\/(www\.)youtube\.com\/(user|channel)\/[^\/\s]+").ToString();
            string usernameOrId = Regex.Match(url, @"(?<=channel\/|user\/)[^\/\s]+").ToString();

            if (String.IsNullOrWhiteSpace(url) || String.IsNullOrWhiteSpace(usernameOrId))
            {
                throw new BadLinkException("This youtube link isn't good. Try to add something like this https://youtube.com/channel/youtube");
            }

            YoutubePage newYoutubePage = new YoutubePage()
            {
                Cpc  = model.Cpc,
                Name = model.Name,
                Url  = url
            };


            var youtubeService = new YouTubeService(new BaseClientService.Initializer()
            {
                ApiKey = "AIzaSyDp5rhMI0dW7uHIYhq0_iLS9vW5pgy1oy0",
            });

            var request = youtubeService.Channels.List("statistics");

            if (model.Url.Contains("channel"))
            {
                request.Id = usernameOrId;
            }
            else
            {
                request.ForUsername = usernameOrId;
            }

            var response = request.Execute();

            var userRetrieveFromYt = response.Items.SingleOrDefault();

            if (userRetrieveFromYt == null)
            {
                throw new BadLinkException("This user doesn't exist");
            }
            else
            {
                if (userRetrieveFromYt.Statistics.HiddenSubscriberCount == true)
                {
                    throw new BadLinkException("You must not hide the subscribers counter");
                }

                var currentUserId = User.Identity.GetUserId();
                newYoutubePage.UserId          = currentUserId;
                newYoutubePage.YoutubeUsername = userRetrieveFromYt.Id;
                var ytAlreadyAdded = _context.Youtubes.SingleOrDefault(y => y.YoutubeUsername == newYoutubePage.YoutubeUsername);


                if (ytAlreadyAdded == null)
                {
                    _context.Youtubes.Add(newYoutubePage);
                }
                else
                {
                    if (ytAlreadyAdded.UserId.Equals(currentUserId))
                    {
                        ytAlreadyAdded.Deleted = false;
                    }
                    else
                    {
                        throw new LinkAlreadyExistException("This channel is already added on this site");
                    }
                }
            }
        }