/// <summary>
 /// Remove this user from the lobby and inform others that he logged off
 /// </summary>
 /// <param name="user"></param>
 public void LogOffUser(ChatModel.ChatUser user)
 {
     chatModel.users.Remove(user);
     chatModel.chatHistory.Add(new ChatModel.ChatMessage()
     {
         message = "User '" + user.userName + "' logged off.",
         when    = DateTime.Now
     });
 }
        //static async void Getvalues()
        //{
        //    using (var client = new HttpClient())
        //    {
        //        client.BaseAddress = new Uri("http://localhost:8080/sm/sentiment/prasanna");
        //        client.DefaultRequestHeaders.Accept.Clear();
        //        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

        //        HttpResponseMessage response = await client.GetAsync();
        //        if(response.IsSuccessStatusCode)
        //        {

        //        }

        //    }

        //}

        /// <summary>
        /// Remove this user from the lobby and inform others that he logged off
        /// </summary>
        /// <param name="user"></param>
        public void LogOffUser(ChatModel.ChatUser user)
        {
            chatModel.Users.Remove(user);
            //chatModel.ChatHistory.Add(new ChatModel.ChatMessage()
            //{
            //    Message = "User '" + user.NickName + "' logged off.",
            //    When = DateTime.Now
            //});
        }
        public ActionResult Index(string user, bool?logOn, bool?logOff, string chatMessage)
        {
            try
            {
                if (chatModel == null)
                {
                    chatModel = new ChatModel();
                }

                //trim chat history if needed
                if (chatModel.chatHistory.Count > 100)
                {
                    chatModel.chatHistory.RemoveRange(0, 90);
                }

                if (!Request.IsAjaxRequest())
                {
                    //first time loading
                    return(View(chatModel));
                }
                else if (logOn != null && (bool)logOn)
                {
                    //check if nickname already exists
                    if (chatModel.users.FirstOrDefault(u => u.userName == user) != null)
                    {
                        throw new Exception("This nickname already exists");
                    }
                    else if (chatModel.users.Count > 10)
                    {
                        throw new Exception("The room is full!");
                    }
                    else
                    {
                        #region create new user and add to lobby
                        chatModel.users.Add(new ChatModel.ChatUser()
                        {
                            userName     = user,
                            loggedOnTime = DateTime.Now,
                            lastPing     = DateTime.Now
                        });

                        //inform lobby of new user
                        chatModel.chatHistory.Add(new ChatModel.ChatMessage()
                        {
                            message = "User '" + user + "' logged on.",
                            when    = DateTime.Now
                        });
                        #endregion
                    }

                    return(PartialView("Lobby", chatModel));
                }
                else if (logOff != null && (bool)logOff)
                {
                    LogOffUser(chatModel.users.FirstOrDefault(u => u.userName == user));
                    return(PartialView("Lobby", chatModel));
                }
                else
                {
                    ChatModel.ChatUser currentUser = chatModel.users.FirstOrDefault(u => u.userName == user);

                    //remember each user's last ping time
                    currentUser.lastPing = DateTime.Now;

                    #region remove inactive users
                    List <ChatModel.ChatUser> removeThese = new List <ChatModel.ChatUser>();
                    foreach (Models.ChatModel.ChatUser usr in chatModel.users)
                    {
                        TimeSpan span = DateTime.Now - usr.lastPing;
                        if (span.TotalSeconds > 15)
                        {
                            removeThese.Add(usr);
                        }
                    }
                    foreach (ChatModel.ChatUser usr in removeThese)
                    {
                        LogOffUser(usr);
                    }
                    #endregion

                    #region if there is a new message, append it to the chat
                    if (!string.IsNullOrEmpty(chatMessage))
                    {
                        chatModel.chatHistory.Add(new ChatModel.ChatMessage()
                        {
                            byUser  = currentUser,
                            message = chatMessage,
                            when    = DateTime.Now
                        });
                    }
                    #endregion

                    return(PartialView("ChatHistory", chatModel));
                }
            }
            catch (Exception ex)
            {
                //return error to AJAX function
                Response.StatusCode = 500;
                return(Content(ex.Message));
            }
        }
        /// <summary>
        /// When the method is called with no arguments, just return the view
        /// When argument logOn is true, a user logged on
        /// When argument logOff is true, a user closed their browser or navigated away (log off)
        /// When argument chatMessage is specified, the user typed something in the chat
        /// </summary>
        public ActionResult Index(string user, string Asset, bool?logOn, bool?logOff, string chatMessage)
        {
            try
            {
                if (chatModel == null)
                {
                    chatModel = new ChatModel();
                }

                //trim chat history if needed
                if (chatModel.ChatHistory.Count > 100)
                {
                    chatModel.ChatHistory.RemoveRange(0, 90);
                }

                if (!Request.IsAjaxRequest())
                {
                    //first time loading
                    return(View(chatModel));
                }
                else if (logOn != null && (bool)logOn)
                {
                    //check if nickname already exists
                    if (chatModel.Users.FirstOrDefault(u => u.NickName == user) != null)
                    {
                        throw new Exception("This nickname already exists");
                    }
                    else if (chatModel.Users.Count > 10)
                    {
                        throw new Exception("The room is full!");
                    }
                    else
                    {
                        #region create new user and add to lobby
                        chatModel.Users.Add(new ChatModel.ChatUser()
                        {
                            NickName     = user,
                            assetid      = Asset,
                            LoggedOnTime = DateTime.Now,
                            LastPing     = DateTime.Now
                        });

                        //inform lobby of new user
                        //chatModel.ChatHistory.Add(new ChatModel.ChatMessage()
                        //{
                        //    //Message = "User '" + user + "' logged on.",
                        //    //When = DateTime.Now
                        //});
                        #endregion
                    }

                    return(PartialView("Lobby", chatModel));
                }
                else if (logOff != null && (bool)logOff)
                {
                    LogOffUser(chatModel.Users.FirstOrDefault(u => u.NickName == user));
                    return(PartialView("Lobby", chatModel));
                }
                else
                {
                    ChatModel.ChatUser currentUser = chatModel.Users.FirstOrDefault(u => u.NickName == user);
                    //remember each user's last ping time
                    currentUser.LastPing = DateTime.Now;

                    #region remove inactive users
                    List <ChatModel.ChatUser> removeThese = new List <ChatModel.ChatUser>();
                    foreach (Models.ChatModel.ChatUser usr in chatModel.Users)
                    {
                        TimeSpan span = DateTime.Now - usr.LastPing;
                        if (span.TotalSeconds > 15)
                        {
                            removeThese.Add(usr);
                        }
                    }
                    foreach (ChatModel.ChatUser usr in removeThese)
                    {
                        LogOffUser(usr);
                    }
                    #endregion

                    #region if there is a new message, append it to the chat
                    if (!string.IsNullOrEmpty(chatMessage))
                    {
                        decimal?positivityOutput = 0;
                        int     sentimeterOutput = 0;

                        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
                        request.Method        = "POST";
                        request.ContentType   = "application/json";
                        request.ContentLength = chatMessage.Length;
                        //request.ProtocolVersion = HttpVersion.Version10; // fix 1
                        //request.KeepAlive = false; // fix 2
                        //request.Timeout = 1000000000; // fix 3
                        //request.ReadWriteTimeout = 1000000000; // fix 4
                        using (Stream webStream = request.GetRequestStream())
                            using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
                            {
                                requestWriter.Write(chatMessage);
                            }

                        try
                        {
                            WebResponse webResponse = request.GetResponse();
                            using (Stream webStream = webResponse.GetResponseStream())
                            {
                                if (webStream != null)
                                {
                                    using (StreamReader responseReader = new StreamReader(webStream))
                                    {
                                        string response = responseReader.ReadToEnd();
                                        var    data     = (JObject)JsonConvert.DeserializeObject(response);

                                        positivityOutput = data["positivity"].Value <decimal>();
                                        sentimeterOutput = data["sentimeter"].Value <int>();
                                    }
                                }
                            }

                            using (SentiAnalysisTable context = new SentiAnalysisTable())
                            {
                                SentiAnalysi dataModel = new SentiAnalysi();

                                dataModel.positivity           = positivityOutput;
                                dataModel.AnalysisCode         = sentimeterOutput;
                                dataModel.Comment              = chatMessage;
                                dataModel.Assetid              = currentUser.assetid;
                                context.Entry(dataModel).State = EntityState.Added;
                                context.SaveChanges();
                            }
                        }
                        catch (Exception e)
                        {
                            Console.Out.WriteLine("-----------------");
                            Console.Out.WriteLine(e.Message);
                        }
                        // Getvalues();
                        chatModel.ChatHistory.Add(new ChatModel.ChatMessage()
                        {
                            ByUser     = currentUser,
                            Message    = chatMessage,
                            When       = DateTime.Now,
                            positivity = positivityOutput,
                            sentimeter = sentimeterOutput
                        });
                    }
                    #endregion

                    return(PartialView("ChatHistory", chatModel));
                }
            }
            catch (Exception ex)
            {
                //return error to AJAX function
                Response.StatusCode = 500;
                return(Content(ex.Message));
            }
        }