public ActionResult Usuario(string id)
 {
     if (!string.IsNullOrEmpty(id))
     {
         var arquivoCaminho = Conversa.ObterCaminhoArquivo(id);
         var conversa = new Conversa(arquivoCaminho);
         conversa.AdicionarMensagemUsuarioOnline(true);
     }
     ViewBag.Id = id;
     return View();
 }
        public ActionResult Admin(string id)
        {
            if (!string.IsNullOrEmpty(id))
            {
                var arquivoCaminho = Conversa.ObterCaminhoArquivo(id);
                var conversa = new Conversa(arquivoCaminho);

                ViewBag.Id = id;
                ViewBag.Nome = conversa.Usuario;

                
            }
            return View();
        }
        /// <summary>
        /// Verifica se a chamada não está mais no status de aguardando
        /// </summary>
        /// <param name="id">identificador da conversa</param>
        /// <returns></returns>
        public bool ChamadaIniciada(string id)
        {
            try
            {
                FileSystemWatcher watcher = new FileSystemWatcher(MvcApplication.FolderLog);
                watcher.Filter = id + ".xml";
                watcher.EnableRaisingEvents = true;

                if (watcher.WaitForChanged(WatcherChangeTypes.Changed, 60000).ChangeType == WatcherChangeTypes.Changed)
                {
                    var conversa = new Conversa(Conversa.ObterCaminhoArquivo(id));
                    if (conversa.Estado != EstadoConversa.EmEspera)
                        return true;
                }
                return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 public ActionResult Visualizar(string id)
 {
     if (id != string.Empty)
     {
         int idChat = 0;
         
         if (Int32.TryParse(id, out idChat))
         {
             var conversa = new Conversa().ObterConversaFinalizada(idChat);
             return View(conversa);
         }
         else
         {
             var caminhoArquivo = Conversa.ObterCaminhoArquivo(id);
             var conversa = new Conversa(caminhoArquivo);
             return View(conversa);
         }
     }
     else
     {
         return null;
     }
 }
        /// <summary>
        /// Busca por chamadas pelos parâmetros e retorna uma lista
        /// </summary>
        /// <param name="inicio"></param>
        /// <param name="fim"></param>
        /// <param name="estado"></param>
        /// <returns></returns>
        public ActionResult PesquisarChamadas(int estado, int pagina)
        {
            var qtdPagina = 10;

            DateTime inicio = DateTime.MinValue;
            DateTime fim = DateTime.MaxValue;
            if (string.IsNullOrEmpty(Request.QueryString["inicio"]) == false)
                inicio = Convert.ToDateTime(Request.QueryString["inicio"]);
            if (string.IsNullOrEmpty(Request.QueryString["fim"]) == false)
                fim = Convert.ToDateTime(Request.QueryString["fim"]).AddDays(1);

            if ((EstadoConversa)estado == EstadoConversa.Finalizado)
            {
                //obtém uma lista de conversas
                var conversas = new Conversa().ObterConversasFinalizadas(inicio, fim);

                ViewBag.Paginas = Math.Ceiling(conversas.Count() / Convert.ToDecimal(qtdPagina));
                return PartialView("Chamadas", conversas.Skip((pagina * qtdPagina) - qtdPagina).Take(qtdPagina).OrderByDescending(x => x.Inicio).ToList());
            }
            else
            {
                //obtém uma lista de conversas
                var ids = Directory.GetFiles(MvcApplication.FolderLog);
                var conversas = new List<Conversa>();

                foreach (var id in ids)
                    conversas.Add(new Conversa(id));

                conversas = conversas.Where(x => x.Estado == (EstadoConversa)estado).ToList();
                conversas = conversas.Where(x => x.Inicio >= inicio).ToList();
                conversas = conversas.Where(x => x.Fim <= fim || x.Fim.HasValue == false).ToList();

                ViewBag.Paginas = Math.Ceiling(conversas.Count() / Convert.ToDecimal(qtdPagina));
                return PartialView("Chamadas", conversas.Skip((pagina * qtdPagina) - qtdPagina).Take(qtdPagina).OrderByDescending(x => x.Inicio).ToList());
            }
        }
        public ActionResult Mensagens(string id)
        {
            if (!string.IsNullOrEmpty(id))
            {
                int idChat = 0;

                if (Int32.TryParse(id, out idChat))
                {
                    var conversa = new Conversa().ObterConversaFinalizada(idChat);
                    return PartialView(conversa.Mensagens.ToList());
                }
                else
                {
                    var arquivoCaminho = Conversa.ObterCaminhoArquivo(id);
                    var conversa = new Conversa(arquivoCaminho);

                    return PartialView("~/Views/Conversa/Mensagens.cshtml", conversa.Mensagens);
                }
            }
            else
            {
                return null;
            }
        }
 /// <summary>
 /// Define o usuário administrador responsável pela chamada quando chamada é iniciada em sessão
 /// </summary>
 /// <param name="conversa"></param>
 /// <param name="administrador"></param>
 protected void DefinirAdminParaConversa(Conversa conversa, Administrador administrador)
 {
     conversa.Administrador = new Administrador(administrador.Usuario) { Id = administrador.Id, Nome = administrador.Nome };
     conversa.Estado = EstadoConversa.EmSessao;
     conversa.AdicionarMensagemAdminOnline(true);
 }
 /// <summary>
 /// Inicia uma nova conversa
 /// </summary>
 /// <param name="name"></param>
 /// <param name="question"></param>
 /// <param name="id"></param>
 private void NovaConversa(string nomeCliente, string pergunta, string id)
 {
     var arquivoCaminho = Conversa.ObterCaminhoArquivo(id);
     var conversa = new Conversa(arquivoCaminho, nomeCliente);
     conversa.EnviarMensagemUsuario(pergunta);
 }
        public ActionResult Atender(string id)
        {
            var adm = Racco.Loja.Internacional.Chat.Controllers.BaseController.ObterAdministradorAutenticado();
            if (adm != null)
            {
                var filePath = Conversa.ObterCaminhoArquivo(id);

                if (System.IO.File.Exists(filePath))
                {
                    //Get the Chat object and Validate the data
                    var chat = new Conversa(filePath);


                    if (chat.Administrador == null)
                    {
                        DefinirAdminParaConversa(chat, adm);
                        return Json(new JsonRequestResult() { ResultType = JsonRequestResultType.Success, ReturnUrl = Url.Content("~/Conversa/Admin/" + id) }, JsonRequestBehavior.AllowGet);
                    }
                    else if (chat.Administrador.Usuario == adm.Usuario)
                    {
                        return Json(new JsonRequestResult() { ResultType = JsonRequestResultType.Success, ReturnUrl = Url.Content("~/Conversa/Admin/" + id) }, JsonRequestBehavior.AllowGet);
                    }
                    else
                    {
                        return Json(new JsonRequestResult() { ResultType = JsonRequestResultType.Alert, Message = Resources.Resource.Mensagem_ChamadaAtendidaPorOutro }, JsonRequestBehavior.AllowGet);
                    }
                }
                else
                {
                    return Json(new JsonRequestResult() { ResultType = JsonRequestResultType.Alert, Message = Resources.Resource.Mensagem_ChatNaoEncontrado }, JsonRequestBehavior.AllowGet);
                }
            }
            else
            {
                Response.StatusCode = 401;
                throw new Exception(Resources.Resource.Mensagem_SessaoExpirada);
            }
        }
        public bool UsuarioEnviarMensagem(string id, string mensagem)
        {
            if (!string.IsNullOrEmpty(id))
            {
                var caminhoArquivo = Conversa.ObterCaminhoArquivo(id);
                var conversa = new Conversa(caminhoArquivo);

                conversa.EnviarMensagemUsuario(Util.EncodeMessage(mensagem));

                return true;
            }
            return false;
        }
        public bool AdminEnviarMensagem(string id, string message)
        {
            if (EstaAutenticado())
            {
                if (id != string.Empty)
                {
                    var filePath = Conversa.ObterCaminhoArquivo(id);
                    var objChat = new Conversa(filePath);

                    objChat.EnviarMensagemAdmin(Util.EncodeMessage(message));

                    return true;
                }
                return false;
            }
            else
            {
                System.Web.HttpContext.Current.Response.StatusCode = 401;
                return false;
            }
        }
        public bool Finalizar(string id)
        {
            if (!string.IsNullOrEmpty(id))
            {
                var filePath = Conversa.ObterCaminhoArquivo(id);

                var objChat = new Conversa(filePath);
                
                var adm =  Racco.Loja.Internacional.Chat.Controllers.BaseController.ObterAdministradorAutenticado();
                if (objChat.Administrador.Usuario == adm.Usuario)//id do usuario
                {
                    objChat.FinalizarConversaAdmin();
                    return true;
                }
            }
            return false;
        }
 public bool Cancelar(string id)
 {
     if (!string.IsNullOrEmpty(id))
     {
         var arquivoCaminho = Conversa.ObterCaminhoArquivo(id);
         var conversa = new Conversa(arquivoCaminho);
         conversa.FinalizarConversaUsuario();
         return true;
     }
     return false;
 }