public ActionResult Poll(string url, bool embed = false)
        {
            PollService PService = PollService.INSTANCE;
            Poll poll = PService.getPollByUrl(url);
            if (poll == null)
            {
                return RedirectToAction("Index");
            }
            string userId = "";
            string cookieString = "";
            string codeString = "";

            Encoder encoder = new Encoder();
            bool validCookie = false;
            if (Request.Cookies["userId"] != null)
            {
                cookieString = Server.HtmlEncode(Request.Cookies["userId"].Value);
                string[] stringList = cookieString.Split(new string[] { "|" }, StringSplitOptions.None);
                if (stringList.Length > 1)
                {
                    if (encoder.verifyHash(stringList[0], stringList[1]))
                    {
                        userId = stringList[0];
                        codeString = stringList[1];
                        validCookie = true;
                    }
                }
            }
            if (!validCookie)
            {
                userId = PService.getNewUserId().ToString();
                codeString = encoder.getHash(userId);
                cookieString = userId + "|" + codeString;
                Response.Cookies["userId"].Value = cookieString;
                Response.Cookies["userId"].Expires = DateTime.Now.AddYears(10);
            }

            ViewBag.userId = userId;
            ViewBag.codeString = codeString;

            var json = new JavaScriptSerializer().Serialize(poll);
            ViewBag.poll = json;
            ViewBag.title = "PollerBear | " + poll.topic;
            ViewBag.description = poll.topic;
            ViewBag.home = false;
            ViewBag.embed = embed;
            return View();
        }
        public HttpResponseMessage saveVote(HttpRequestMessage request, string url, string id, string code, bool embed, [FromBody]List<Option> options)
        {
            try
            {
                PollService PService = PollService.INSTANCE;

                Poll poll = PService.getPollByUrl(url);
                if (poll == null) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "");
                if (poll.type != 1) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "");

                var validOptions = 0;
                foreach (var option in options)
                {
                    if (poll.options.Any(item => item.name == option.name))
                    {
                        validOptions++;
                    }
                }
                if (validOptions != poll.options.Count) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "");
                poll.options = options;

                Encoder encoder = new Encoder();
                string ip = GetClientIp(request);

                if (embed)
                {
                    if (!PService.checkIfVotedByIp(url, ip))
                    {
                        id = PService.getUserByIp(ip);
                        if (id == null)
                        {
                            id = PService.getNewUserId().ToString();
                            PService.saveIpUser(id, ip);
                        }
                        PService.saveVote(poll, id, ip);
                        return Request.CreateResponse(HttpStatusCode.OK);
                    }
                    else
                    {
                        return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Already voted");
                    }
                }
                else if (encoder.verifyHash(id, code))
                {
                    if (!PService.checkIfVoted(url, id))
                    {
                        PService.saveVote(poll, id, ip);
                        return Request.CreateResponse(HttpStatusCode.OK);
                    }
                    else
                    {
                        return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Already voted");
                    }
                }
                return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Invalid ID");
            }
            catch (Exception)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "");
            }

        }
        public HttpResponseMessage saveVoteMajority(HttpRequestMessage request, string url, int optionId, string id, string code, bool embed)
        {
            try
            {
                PollService PService = PollService.INSTANCE;

                Poll poll = PService.getPollByUrl(url);
                if (poll == null) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "");
                if (poll.type != 2) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "");

                if (!poll.options.Any(item => item.option_id == optionId)) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "");

                Encoder encoder = new Encoder();
                var ip = GetClientIp(request);

                if (embed)
                {
                    if (!PService.checkIfVotedByIp(url, ip))
                    {
                        id = PService.getUserByIp(ip);
                        if (id == null)
                        {
                            id = PService.getNewUserId().ToString();
                            PService.saveIpUser(id, ip);
                        }
                        PService.saveVoteMajority(poll, optionId, id, ip);
                        return Request.CreateResponse(HttpStatusCode.OK);
                    }
                    else
                    {
                        return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Already voted");
                    }             
                }
                else if (encoder.verifyHash(id, code))
                {
                    if (!PService.checkIfVoted(url, id))
                    {
                        PService.saveVoteMajority(poll, optionId, id, ip);
                        return Request.CreateResponse(HttpStatusCode.OK);
                    }
                    else
                    {
                        return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Already voted");
                    }
                }
                return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Invalid ID");
            }
            catch (Exception)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "");
            }

        }