public MessageStatus UpdateMessageStatus(string codingID, string station, string status)
        {
            int lastackno = 0;
            string acktotal = "";

            //Update Message Status
            foreach (MessageStatus messagestatus in _MessageStatusList)
            {
                if (messagestatus.CodingID.Equals(codingID))
                {
                    //find latest ack no
                    lastackno = Math.Max(lastackno, Int32.Parse(messagestatus.AckNo));

                    //get ackTotal
                    acktotal = messagestatus.AckTotal;
                }
            }

            //Create new entry base on the coding ack message
            MessageStatus newMsgStatus = new MessageStatus();
            newMsgStatus.CodingID = codingID;
            DateTime currentdt = DateTime.Now;
            newMsgStatus.AckTimeStamp = String.Format("{0:g}", currentdt);
            newMsgStatus.AckFrom = station;
            newMsgStatus.AckStatus = status;
            newMsgStatus.AckNo = (lastackno + 1).ToString();
            newMsgStatus.AckTotal = acktotal;

            _MessageStatusList.Add(newMsgStatus);

            //Update on gateway tracker
            foreach (GatewayTracker gatewaytrack in _GatewayTrackerList)
            {
                //if match codingID and station name, update the station status
                if (gatewaytrack.CodingID.Equals(codingID) && gatewaytrack.StationStatus.ContainsKey(station))
                {
                    gatewaytrack.StationStatus[station] = status;
                }
            }

            return newMsgStatus;

        }
        //Retrieve Incident Coding Status base on Query
        public void IncidentCodingStatus(string querycodingID)
        {
            SendOrPostCallback callback =
                delegate (object state)
                {
                    //Gather incident coding status base on coding ID
                    int acktotal = 0;
                    int pendingno = 0;
                    DateTime currentdt = DateTime.Now;
                    bool validCodingID = false;

                    //Update coding status (received time)
                    foreach (CodingStatus codingstatus in _CodingStatusList)
                    {
                        if (codingstatus.CodingID.Equals(querycodingID))
                        {
                            //There is such codingID exist
                            validCodingID = true;

                            //Update the updated timestamp from Console
                            codingstatus.Updated = String.Format("{0:g}", currentdt);
                            acktotal = Int32.Parse(codingstatus.Pending) + Int32.Parse(codingstatus.Acknowledged)
                                + Int32.Parse(codingstatus.Rejected) + Int32.Parse(codingstatus.Failed);
                            pendingno = Int32.Parse(codingstatus.Pending);
                        }
                    }

                    if (validCodingID)
                    {
                        //Update message status (-1 in ack No)
                        //Create new entry base on the coding ack message
                        MessageStatus newMsgStatus = new MessageStatus();
                        newMsgStatus.CodingID = querycodingID;
                        newMsgStatus.AckTimeStamp = String.Format("{0:g}", currentdt);
                        newMsgStatus.AckFrom = "Gateway";
                        if (pendingno == 0)
                        {
                            newMsgStatus.AckStatus = "Completed";
                        }
                        else
                        {
                            newMsgStatus.AckStatus = "Pending";
                        }
                        newMsgStatus.AckNo = "-1";
                        newMsgStatus.AckTotal = acktotal.ToString();

                        _MessageStatusList.Add(newMsgStatus);

                        //Response back to CAD 
                        
                        List<Tracking> trackingList = new List<Tracking>();

                        foreach (GatewayTracker gatewaytrack in _GatewayTrackerList)
                        {
                            if (gatewaytrack.CodingID.Equals(querycodingID))
                            {
                                //Only take out the stations on the Current Station
                                foreach (KeyValuePair<string, string> station in gatewaytrack.StationStatus)
                                {
                                    Tracking newstation = new Tracking();
                                    newstation.Station = station.Key;
                                    newstation.Status = station.Value;

                                    List<string> unitcallsign = new List<string>();

                                    //To give relevant station units callsign
                                    foreach (CodingUnits unit in gatewaytrack.DispatchUnits)
                                    {
                                        if (unit.UnitCurrentStation.Equals(station.Key))
                                        {
                                            unitcallsign.Add(unit.Callsign);
                                        }
                                        
                                        //For Test message
                                        if (unit.UnitCurrentStation.Equals("Test"))
                                        {
                                            unitcallsign.Add(unit.Callsign);
                                        }
                                    }

                                    newstation.Unit = unitcallsign.ToArray();
                                    trackingList.Add(newstation); //Add into tracking list
                                }
                            }
                        }

                        CADIncidentAck codingQueryRsponse = new CADIncidentAck();
                        codingQueryRsponse.CodingID = newMsgStatus.CodingID;
                        codingQueryRsponse.AckTracking = trackingList.ToArray();
                        codingQueryRsponse.AckTimeStamp = currentdt;
                        codingQueryRsponse.AckNo = Int32.Parse(newMsgStatus.AckNo);
                        codingQueryRsponse.AckTotal = Int32.Parse(newMsgStatus.AckTotal);
                        Log("Respond to requested ad hoc request from simulate CAD");
                        _CallOut_CADService.IncidentCodingStatusResponse(codingQueryRsponse);
                    }
                };

            _uiSyncContext.Post(callback, "Request incident coding status");
        }
        private void CreateMessageEntry(CodingIncidentMessage codingIncidentMsg, string acktotal)
        {
            MessageStatus messagestatus = new MessageStatus();
            messagestatus.CodingID = codingIncidentMsg.CodingID;
            DateTime currentdt = DateTime.Now;
            messagestatus.AckTimeStamp = String.Format("{0:g}", currentdt);
            messagestatus.AckFrom = "Gateway";
            messagestatus.AckStatus = "Pending";
            messagestatus.AckNo = "0";
            messagestatus.AckTotal = acktotal;

            _MessageStatusList.Add(messagestatus);
        }
        public void SendBroadcastIncidentCoding(string console, string status, string[] unitcallsign, MessageStatus messagestatus)
        {
            //Get Station tracking
            Tracking stationTrack = new Tracking();
            stationTrack.Station = console;
            stationTrack.Status = status;
            stationTrack.Unit = unitcallsign;

            //Broadcast Coding status back to CAD (failed)
            CADIncidentCodingStatus incidentcodingstatus = new CADIncidentCodingStatus();
            incidentcodingstatus.CodingID = messagestatus.CodingID;
            incidentcodingstatus.AckTracking = stationTrack;
            incidentcodingstatus.AckFrom = messagestatus.AckFrom;
            incidentcodingstatus.AckStatus = messagestatus.AckStatus;
            DateTime currentdt = DateTime.Now;
            incidentcodingstatus.AckTimeStamp = currentdt;
            incidentcodingstatus.AckNo = Int32.Parse(messagestatus.AckNo);
            incidentcodingstatus.AckTotal = Int32.Parse(messagestatus.AckTotal);
            //incidentcodingstatus.AckTotal = string.IsNullOrEmpty(messagestatus.AckTotal) ? 0 : Int32.Parse(messagestatus.AckTotal);
            Log("Broadcast status back to CAD");
            _CallOut_CADService.BroadcastIncidentCodingStatus(incidentcodingstatus);
        }