public async Task<JsonResult> Hire(Offer question)
        {
            var userId = User.Identity.GetUserId();
            var sessionId = question.SessionId;
            var session = db.sessions.Where(c => c.SessionID == sessionId && c.question.StudentID == new Guid(userId)).First();
            var user = session.question.student;
            if(user.CurrentBalance < session.OfferedFees)
            {
                return new JsonResult()
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new { result = "You donot have enough funds to hire the expert.Go to Account Settings and add funds first." }
                };
            }
            else if(session.Status == Status.Offered)
            {
                session.Status = Status.Hired;
                var quest = session.question;
                quest.Status = Status.Hired;
                user.CurrentBalance = user.CurrentBalance - (float)session.OfferedFees;
                db.Entry(user).State = EntityState.Modified; 
                db.Entry(quest).State = EntityState.Modified;
                db.Entry(session).State = EntityState.Modified;

                //hire transaction
                DBEntities.Transaction tran = new DBEntities.Transaction();
                tran.TransactionID = Guid.NewGuid();
                tran.SessionID = sessionId;
                tran.Status = Status.Hired;
                tran.OfferedFees = question.amount;
                tran.PostedTime = DateTime.Now;
                db.transcations.Add(tran);

                Reply obj = new Reply();
                obj.ReplyID = Guid.NewGuid();
                obj.ReplierID = new Guid(User.Identity.GetUserId());
                obj.SessionID = sessionId;
                obj.PostedTime = DateTime.Now;
                obj.Details = " Automatically Generated Message: I have Hired you for $" + session.OfferedFees + ". You can start working on task." ;
                session.Replies.Add(obj);

                

                db.SaveChanges();

           
                var context = GlobalHost.ConnectionManager.GetHubContext<TutorStudentChat>();
                var username = User.Identity.Name;
                var imgsrc = db.Students.Where(c => c.Username == username).FirstOrDefault().ProfileImage;
                string message = generateMessage(username, obj.Details, imgsrc, obj.PostedTime.ToString(), obj.ReplyID.ToString(),false);
                SendChatMessageStudentReciever(obj.SessionID.ToString(), username, message, context); //send message to urself 
                var tutor = db.sessions.Where(c => c.SessionID == obj.SessionID).FirstOrDefault().tutor;
                var username2 = tutor.Username;
                SendChatMessageTutorReciever(obj.SessionID.ToString(), username2, message, context); //send message to other person 

                //send button
               
                var message2 = "  <button type=\"button\" id=\"hire\" class=\"btn btn-primary\" data-toggle=\"modal\" data-target=\"#invoiceNewModal\">Send Invoice</button>";
                                                                                       
                SendButtonStudent(sessionId.ToString(), username2, message2, context); //send message to other person 
                SendNotification(username2, username,imgsrc, "I have hired you for $"+session.OfferedFees,true,"Tutors","Sessions", "SessionId="+sessionId);

                var email = db.Users.Where(c => c.Id == quest.TutorID.ToString()).FirstOrDefault().Email;
                String subject = "Hired on MezoExperts.com";
                String bodyText = username + " has hired you for the job.";
                string fileTemplate = "passwordreset.html";
                await sendEmail(email, subject, bodyText,fileTemplate,"");
                
                return new JsonResult()
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new { result = "success" }
                };

            }
            else
            {
                return new JsonResult()
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new { result = "fail" }
                };

            }
        }
        public async Task<JsonResult> Invoice(Offer question)
        {
            var user = User.Identity.GetUserId();
            var sessionId = question.SessionId;
            var session = db.sessions.Where(c => c.SessionID == sessionId && c.TutorID.Value == new Guid(user)).First();
            if (session.Status == Status.Hired || session.Status==Status.Invoiced)
            {
                session.OfferedFees = question.amount;
                session.Status = Status.Invoiced;
                db.Entry(session).State = EntityState.Modified;

                DBEntities.Transaction tran = new DBEntities.Transaction();
                tran.TransactionID = Guid.NewGuid();
                tran.SessionID = sessionId;
                tran.Status = Status.Invoiced;
                tran.OfferedFees = question.amount;
                tran.PostedTime = DateTime.Now;
                db.transcations.Add(tran);

                Reply obj = new Reply();
                obj.ReplyID = Guid.NewGuid();
                obj.ReplierID = new Guid(User.Identity.GetUserId());
                obj.SessionID = sessionId;
                obj.PostedTime = DateTime.Now;
                obj.Details = " Automatically Generated Message: I have sent Invoice for the work for $" + question.amount + ". Press Accept Button if you are satisfied with the services and pay to tutor. Pressing Reject button will cause the admin to decide the dispute.";
                session.Replies.Add(obj);

                db.SaveChanges();

                var context = GlobalHost.ConnectionManager.GetHubContext<TutorStudentChat>();
                //send message reply
                var username = User.Identity.Name;
                var imgsrc = db.Tutors.Where(c => c.Username == username).FirstOrDefault().ProfileImage;
                string message = generateMessage(username, obj.Details, imgsrc, obj.PostedTime.ToString(), obj.ReplyID.ToString(),false);
                SendChatTutorReciever(obj.SessionID.ToString(), username, message, context); //send message to urself 

                var student = db.sessions.Where(c => c.SessionID == obj.SessionID).FirstOrDefault().question.student;
                var username2 = student.Username;
                SendChatStudentReiever(obj.SessionID.ToString(), username2, message, context); //send message to other person 

                //send button
                
                var message2 = "<button type =\"button\" id=\"accept\" class=\"btn btn-primary\" data-toggle=\"modal\" data-target=\"#approveNewModal\" style=\"margin-right:5px\">Accept </button>";
                message2 = message2 + "<button type =\"button\" id=\"reject\" class=\"btn  btn-primary\" data-toggle=\"modal\" data-target=\"#rejectNewModal\">Reject </button>";

                   SendButtonStudent(sessionId.ToString(), username2, message2, context); //send message to other person 
                   SendNotification(username2, username, imgsrc, "I have sent Invoice of $" + question.amount,true, "Students", "Sessions", "SessionId=" + sessionId);
                
                //send email
                var email = db.Users.Where(c => c.Id == session.question.StudentID.ToString()).FirstOrDefault().Email;
                String subject = "Tutor sent Invoice on MezoExperts.com";
                String bodyText = username + " has sent invoice for $" + question.amount;
                string fileTemplate = "passwordreset.html";
                await sendEmail(email, subject, bodyText, fileTemplate, "");

                
                return new JsonResult()
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new { result = question.amount }
                };
            }
            else
            {
                return new JsonResult()
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new { result = "" }
                };
            }

        }
        public async Task<JsonResult> ApprovePayment(Offer question)
        {
            var user = User.Identity.GetUserId();
            var sessionId = question.SessionId;
            var session = db.sessions.Where(c => c.SessionID == sessionId && c.question.StudentID == new Guid(user)).First();
            if (session.Status == Status.Invoiced)
            {
                session.Status = Status.Approved;
                session.isClosed = true;
                var quest = session.question;
                quest.Status = Status.Approved;
                db.Entry(quest).State = EntityState.Modified;
                db.Entry(session).State = EntityState.Modified;

                DBEntities.Transaction tran = new DBEntities.Transaction();
                tran.TransactionID = Guid.NewGuid();
                tran.SessionID = sessionId;
                tran.Status = Status.Approved;
                tran.OfferedFees = question.amount;
                tran.PostedTime = DateTime.Now;
                db.transcations.Add(tran);

                Reply obj = new Reply();
                obj.ReplyID = Guid.NewGuid();
                obj.ReplierID = new Guid(User.Identity.GetUserId());
                obj.SessionID = sessionId;
                obj.PostedTime = DateTime.Now;
                obj.Details = " Automatically Generated Message: I have Approved the payment for " + session.OfferedFees + "$. ";
                session.Replies.Add(obj);

                var tutor = db.sessions.Where(c => c.SessionID == obj.SessionID).FirstOrDefault().tutor;
                tutor.CurrentEarning = tutor.CurrentEarning + (float)session.OfferedFees;
                db.Entry(tutor).State = EntityState.Modified; 

                db.SaveChanges();


                var context = GlobalHost.ConnectionManager.GetHubContext<TutorStudentChat>();
                var username = User.Identity.Name;
                var imgsrc = db.Students.Where(c => c.Username == username).FirstOrDefault().ProfileImage;
                string message = generateMessage(username, obj.Details, imgsrc, obj.PostedTime.ToString(), obj.ReplyID.ToString(),false);
                SendChatMessageStudentReciever(obj.SessionID.ToString(), username, message, context); //send messageFp to urself 
                //var tutor = db.sessions.Where(c => c.SessionID == obj.SessionID).FirstOrDefault().tutor;
                var username2 = tutor.Username;
                SendChatMessageTutorReciever(obj.SessionID.ToString(), username2, message, context); //send message to other person 

                var message2 = " <button type=\"button\" id=\"accepted\" disabled class=\"btn btn-primary\">Accepted Invoice</button>";

                SendButtonStudent(sessionId.ToString(), username2, message2, context); //send message to other person 
                SendNotification(username2, session.question.student.Username, session.question.student.ProfileImage, "I have approved the payment of $" + session.OfferedFees,true, "Tutors", "Sessions", "SessionId=" + sessionId);
                //close sessions
                DeleteSessionMessageTutor(sessionId.ToString(), username2, "", context);
                DeleteSessionMessageTutor(sessionId.ToString(), username, "", context);

                var email = db.Users.Where(c => c.Id == quest.TutorID.ToString()).FirstOrDefault().Email;
                String subject = "Invoice Approved on MezoExperts.com";
                String bodyText = username + " approved the Invoice.";
                string FileTemplate = "passwordreset.html";
                await sendEmail(email, subject, bodyText, FileTemplate, "");


                return new JsonResult()
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new { result = "success" }
                };

            }
            else
            {
                return new JsonResult()
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new { result = "fail" }
                };

            }
        }