private void ProcessRingingEvent(IAgentStatusEvent objRoutingEventAssignedEvent)
        {
            int    index;
            Agent  agent;
            string callID;

            try
            {
                if (objRoutingEventAssignedEvent != null)
                {
                    callID = objRoutingEventAssignedEvent.CallID;
                    _logger.Info("RoutingEvent Assigned ## CallID: " + callID + " AgentKey: " + objRoutingEventAssignedEvent.AgentKey + " AgentStation: " + objRoutingEventAssignedEvent.Extension);
                    callDetailGridUpdateEvent?.Invoke(false, callID, "assigned", "ringing");

                    if (AgentsListFromServer.Contains(objRoutingEventAssignedEvent.AgentKey.ToString()))
                    {
                        agent        = (Agent)AgentsListFromServer[objRoutingEventAssignedEvent.AgentKey.ToString()];
                        agent.Status = "Ringing";
                        agent.CallID = callID;
                        index        = listViewAgentsList.Items.IndexOfKey(agent.Name);
                        listViewAgentsList.Items[index].BackColor        = Color.OrangeRed;
                        listViewAgentsList.Items[index].SubItems[2].Text = agent.Status;
                        listViewAgentsList.Items[index].SubItems[5].Text = callID;

                        if (!agentsQueue.ContainsKey(agent.AgentID))
                        {
                            _logger.Info("Adding Time for Agent: " + agent.AgentID);
                            lock (agentsQueue)
                                agentsQueue.Add(agent.AgentID, agent);
                            if (agentsRingingTime.Contains(agent.AgentID))
                            {
                                lock (agentsRingingTime)
                                    agentsRingingTime[agent.AgentID] = DateTime.Now;
                            }
                            else
                            {
                                lock (agentsRingingTime)
                                    agentsRingingTime.Add(agent.AgentID, DateTime.Now);
                            }
                            agentsQueueWait.Set();
                        }
                        else
                        {
                            _logger.Info("Agent already present in Ringing Queue " + agent.AgentID);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error("Exception in ProcessRingingEvent " + ex);
            }
        }
        private void ProcessMediaEvent(MediaEvent mediaEvent)
        {
            switch (mediaEvent.ObjectType)
            {
            case enMediaEventObjectTypes.MediaEventObjectType_AgentStatus:
                IAgentStatusEvent statusEvent = (IAgentStatusEvent)mediaEvent;
                ProcessAgentStatusEvent(statusEvent);
                break;

            case enMediaEventObjectTypes.MediaEventObjectType_Delivered:
                var objDeliveredEvent = mediaEvent as DeliveredEvent;
                _logger.Info("MediaEventObjectType_Delivered callID: " + objDeliveredEvent.CallID);
                break;

            case enMediaEventObjectTypes.MediaEventObjectType_Established:
                var objEstablishedEvent = mediaEvent as EstablishedEvent;
                _logger.Info("MediaEventObjectType_Established " + objEstablishedEvent.CallID);
                break;

            case enMediaEventObjectTypes.MediaEventObjectType_Queued:
                var objQueuedEvent = mediaEvent as QueuedEvent;
                _logger.Info("MediaEventObjectType_Queued " + objQueuedEvent.CallID);
                break;

            case enMediaEventObjectTypes.MediaEventObjectType_Diverted:
                var objDivertedEvent = mediaEvent as DivertedEvent;
                _logger.Info("MediaEventObjectType_Diverted " + objDivertedEvent.CallID);
                break;

            case enMediaEventObjectTypes.MediaEventObjectType_Disconnected:
                var objDisconnectEvent = mediaEvent as DisconnectedEvent;
                _logger.Info("MediaEventObjectType_Disconnected CallID: " + objDisconnectEvent.CallID + " Reason " + objDisconnectEvent.Reason);
                callDetailGridUpdateEvent?.Invoke(true, objDisconnectEvent.CallID);
                lock (activeCallsDict)
                    activeCallsDict.Remove(objDisconnectEvent.CallID);
                break;

            case enMediaEventObjectTypes.MediaEventObjectType_ManagerStateChanged:
                IManagerStateChangedEvent stateEvent = (IManagerStateChangedEvent)mediaEvent;
                _logger.Info("MediaEvent ManagerStateChanged ## " + stateEvent.State);
                break;
            }
        }
        private void ProcessAgentStatusEvent(IAgentStatusEvent statusEvent)
        {
            int   index;
            Agent agent;

            try
            {
                if (AgentsListFromServer.Contains(statusEvent.AgentKey.ToString()))
                {
                    agent = (Agent)AgentsListFromServer[statusEvent.AgentKey.ToString()];
                    index = listViewAgentsList.Items.IndexOfKey(agent.Name);

                    switch (statusEvent.State)
                    {
                    case enAgentStates.AgentState_Unavailable:
                        _logger.Info("AgentStatusEvent " + statusEvent.AgentID + " is now UnAvailable on " + " Extension = " + statusEvent.Extension + "  " + statusEvent.AgentID);
                        UpdateAgentList(agent, "UnAvailable", Color.DarkGray, index);
                        break;

                    case enAgentStates.AgentState_Working:
                        _logger.Info("AgentStatusEvent " + statusEvent.AgentID + " is now on work on " + " Extension = " + statusEvent.Extension + "  " + statusEvent.AgentID);
                        UpdateAgentList(agent, "work", Color.Yellow, index);
                        break;

                    case enAgentStates.AgentState_LoggedOff:
                        _logger.Info("AgentStatusEvent " + statusEvent.AgentID + " is now on LoggedOFF " + " Extension = " + statusEvent.Extension + "  " + statusEvent.AgentID);
                        UpdateAgentList(agent, "LoggedOUT", Color.AliceBlue, index);
                        break;

                    case enAgentStates.AgentState_Ringing:
                        _logger.Info("AgentStatusEvent " + statusEvent.AgentID + " is now Ringing " + " Extension = " + statusEvent.Extension + "  " + statusEvent.AgentID);
                        ProcessRingingEvent(statusEvent);
                        break;

                    case enAgentStates.AgentState_Connected:
                        _logger.Info("AgentStatusEvent " + statusEvent.AgentID + " is on callID: " + statusEvent.CallID);
                        UpdateAgentList(agent, "On Call", Color.Orchid, index);
                        break;

                    case enAgentStates.AgentState_Available:
                        _logger.Info("AgentStatusEvent " + statusEvent.AgentID + " is now available on " + " Extension = " + statusEvent.Extension + "  " + statusEvent.AgentID);
                        ProcessAvailableAgentEvent(agent.AgentID);
                        UpdateAgentList(agent, "Available", Color.Aqua, index);
                        listViewAgentsList.Items[index].SubItems[5].Text = "";
                        break;

                    case enAgentStates.AgentState_Pending:
                        _logger.Info("AgentStatusEvent  Pending State " + statusEvent.ACDState);
                        break;

                    default:
                        _logger.Info("AgentStatusEvent  Unhandeled Event " + statusEvent.State);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error("Exception in ProcessAgentStatusEvent " + ex);
            }
        }