using ErsPos.Service.UserRepository;
using ErsPos.Service.ViewModels;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace BeachOrder.Controllers
{
    public class SignalRController : ApiController
    {
        [Route("api/SendToClientById")]
        [HttpGet]
        public JObject SendToClientById(string connectionId="",string senderName = "", string message = "",string garsonMsgId ="" )
        {
            if (string.IsNullOrEmpty(connectionId))
            {
                return JObject.FromObject(new { Process = false, Message = "Mesajınız iletilemedi connectionId boş olamaz" });
            }
            if (string.IsNullOrEmpty(senderName))
            {
                return JObject.FromObject(new { Process = false, Message = "Mesajınız iletilemedi senderName boş olamaz" });
            }
            if (string.IsNullOrEmpty(message))
            {
                return JObject.FromObject(new { Process = false, Message = "Mesajınız iletilemedi message boş olamaz" });
            }
            if (string.IsNullOrEmpty(garsonMsgId))
            {
                return JObject.FromObject(new { Process = false, Message = "Mesajınız iletilemedi garsonMsgId boş olamaz" });
            }
            else
            {
                using (var signalR = new BeachOrder.Hub.Notification())
                {
                    try
                    {
                        var result = signalR.SendToClient(senderName, message, connectionId, garsonMsgId);
                        if (result)
                        {
                            return JObject.FromObject(new { Process = true, Message = connectionId + " 'id li kullanıcıya mesajınız iletildi." });
                        }
                        else
                        {
                            return JObject.FromObject(new { Process = false, Message = connectionId + " 'id li kullanıcıya mesajınız iletilemedi." });
                        }
                    }
                    catch (Exception ex)
                    {
                        return JObject.FromObject(new { Process = false, Message = "Mesajınız iletilemedi" });
                    }
                }
            }
                
        }

        [Route("api/SendToAllClients")]
        [HttpGet]
        public JObject SendToAllClients(string senderName, string message, string garsonMsgId = "")
        {
            if (string.IsNullOrEmpty(message) && string.IsNullOrEmpty(senderName))
                return JObject.FromObject(new { Process = false, Message = "invalid parameters" });

            using (var signalR = new BeachOrder.Hub.Notification())
            {
                try
                {
                    signalR.SendToAllClients(senderName, message,garsonMsgId);
                    return JObject.FromObject(new { Process = true, Message = "Mesajınız iletildi." });
                }
                catch (Exception ex)
                {
                    return JObject.FromObject(new { Process = false, Message = "Mesajınız iletilemedi" });
                }

            }
        }

        [Route("api/modifySignalR")]
        [HttpGet]
        public JObject ModifySignalR(string signalRId, string garsonId)
        {
            if (string.IsNullOrEmpty(signalRId) && string.IsNullOrEmpty(garsonId))
                return JObject.FromObject(new Result { Error = "invalid parameters"});

            using (UserRepository repo = new UserRepository())
            {
                var result = repo.ModifySignalRId(signalRId, garsonId);
                if (result == true)
                {
                    return JObject.FromObject(new Result { Message = "OK" });
                }
                else
                {
                    return JObject.FromObject(new Result { Error = "NOK" });
                }
            }
        }

        [Route("api/ChangeStateNotification")]
        [HttpGet]
        public JObject ChangeStateNotification(string model="")
        {
            if (string.IsNullOrEmpty(model))
            {
                return JObject.FromObject(new Result { Error = "invalid parameters" });
            }
            else
            {
                var data = Newtonsoft.Json.JsonConvert.DeserializeObject<NotificationStateModel>(model);
                if (data != null)
                {
                    using (UserRepository repo = new UserRepository())
                    {
                        try
                        {
                            repo.UpdateNotification(data);
                            return JObject.FromObject(new Result { Message = "OK" });
                        }
                        catch (Exception ex)
                        {
                            return JObject.FromObject(new Result { Error = "NOK" });
                        }
                    }
                }
                else
                {
                    return JObject.FromObject(new Result { Error = "NOK" });
                }
            }
              

        }

        [Route("api/RefreshCacheAllClients")]
        [HttpGet]
        public JObject RefreshCacheAllClients()
        {
            using (var signalR = new BeachOrder.Hub.Notification())
            {
                try
                {
                    signalR.RefreshCache();
                    return JObject.FromObject(new { Process = true, Message = "Tüm kullanıcıların önbelleği silindi." });
                }
                catch (Exception ex)
                {
                    return JObject.FromObject(new { Process = false, Message = "işlem sırasında hata oluştu önbellek silinemedi" });
                }

            }
        }
        [Route("api/RefreshCacheByUser")]
        [HttpGet]
        public JObject RefreshCacheByUser(string connId)
        {
            if (string.IsNullOrEmpty(connId))
                return JObject.FromObject(new { Process = false, Message = "SignalR Id boş olamaz" });

            using (var signalR = new BeachOrder.Hub.Notification())
            {
                try
                {
                    signalR.RefreshCacheByUserId(connId);
                    return JObject.FromObject(new { Process = true, Message = "Tüm kullanıcıların önbelleği silindi." });
                }
                catch (Exception ex)
                {
                    return JObject.FromObject(new { Process = false, Message = "işlem sırasında hata oluştu önbellek silinemedi" });
                }

            }
        }

        [Route("api/GetMessages")]
        [HttpGet]
        public JObject GetMessages(string garsonId)
        {
            if (string.IsNullOrEmpty(garsonId))
                return JObject.FromObject(new { Process = false, Message = "SignalR Id boş olamaz" });

            using (UserRepository repo = new UserRepository())
            {
                try
                {
                    int id = int.Parse(garsonId);
                    var list = repo.GetMessages(id);
                    return JObject.FromObject(new { list });
                }
                catch (Exception ex)
                {
                    return JObject.FromObject(new Result { Error = "Hata oluştu"});
                }

            }
        }
    }
}
