public async Task<IHttpActionResult> GetMobileCustomerClientIncidentStatusRequest(string incidentGUID)
        {
            Services.Log.Info("Mobile Customer Current Incident [" + incidentGUID + "] Status Request [API]");

            IncidentStatusRequest generatedStatusRequest = new IncidentStatusRequest(incidentGUID);

            //Return Successful Response
            Services.Log.Info("Incident Status Request Generated and Returned [API]");
            return Ok(generatedStatusRequest);
        }
        public static void ProcessStatusRequestBehavior(IncidentStatusRequest statusRequest, Incident updateIncident, ApiServices Services)
        {
            IHubContext hubContext = Services.GetRealtime<IncidentHub>();

            switch (updateIncident.StatusCode)
            {
                case "PROVER-FOUND":

                    //Notify Particular Connected User through SignalR
                    hubContext.Clients.Group(updateIncident.ProviderUserID).updateMobileClientStatus(statusRequest.GetCustomerPushObject());
                    Services.Log.Info("Mobile Client [" + updateIncident.ProviderUserID + "] Status Update Payload Sent");

                    //Notifying Connect WebClients with IncidentInfo Package            
                    hubContext.Clients.All.updateIncidentStatusAdmin(new IncidentInfo(updateIncident));
                    Services.Log.Info("Connected Clients Updated");

                    RevokeProviderJobs(updateIncident, Services);
                    Services.Log.Info("Provider Jobs Revoked");

                    break;

                case "ARRIVED":
                    
                    //Notify Particular Connected User through SignalR
                    hubContext.Clients.Group(updateIncident.ProviderUserID).updateMobileClientStatus(statusRequest.GetCustomerPushObject());
                    Services.Log.Info("Mobile Client [" + updateIncident.ProviderUserID + "] Status Update Payload Sent");

                    //Notifying Connect WebClients with IncidentInfo Package            
                    hubContext.Clients.All.updateIncidentStatusAdmin(new IncidentInfo(updateIncident));
                    Services.Log.Info("Connected Clients Updated");

                    SendGridController.SendCurrentIncidentInvoiceEmail(updateIncident, Services);

                    break;

                case "COMPLETED":

                    //Notify Particular Connected User through SignalR
                    hubContext.Clients.Group(updateIncident.ProviderUserID).updateMobileClientStatus(statusRequest.GetCustomerPushObject());
                    Services.Log.Info("Mobile Client [" + updateIncident.ProviderUserID + "] Status Update Payload Sent");

                    //Notifying Connect WebClients with IncidentInfo Package            
                    hubContext.Clients.All.updateIncidentStatusAdmin(new IncidentInfo(updateIncident));
                    Services.Log.Info("Connected Clients Updated");
                    break;

                case "DECLINED":

                    //Notify Particular Connected User through SignalR
                    hubContext.Clients.Group(updateIncident.ProviderUserID).updateMobileClientStatus(statusRequest.GetCustomerPushObject());
                    Services.Log.Info("Mobile Client [" + updateIncident.ProviderUserID + "] Status Update Payload Sent");

                    //Notifying Connect WebClients with IncidentInfo Package            
                    hubContext.Clients.All.updateIncidentStatusAdmin(new IncidentInfo(updateIncident));
                    Services.Log.Info("Connected Clients Updated");

                    RevokeProviderJobs(updateIncident, Services);
                    Services.Log.Info("Provider Jobs Revoked");

                    break;

                case "CANCELLED":
                    //Notifying Connect WebClients with IncidentInfo Package            
                    hubContext.Clients.All.updateIncidentStatusCustomerCancel(new IncidentInfo(updateIncident));
                    Services.Log.Info("Connected Clients Updated");

                    RevokeProviderJobs(updateIncident, Services);
                    Services.Log.Info("Provider Jobs Revoked");

                    break;

                default:
                    //Notify Particular Connected User through SignalR
                    hubContext.Clients.Group(updateIncident.ProviderUserID).updateMobileClientStatus(statusRequest.GetCustomerPushObject());
                    Services.Log.Info("Mobile Client [" + updateIncident.ProviderUserID + "] Status Update Payload Sent");

                    //Notifying Connect WebClients with IncidentInfo Package            
                    hubContext.Clients.All.updateIncidentStatusAdmin(new IncidentInfo(updateIncident));
                    Services.Log.Info("Connected Clients Updated");

                    break;
            }
        }
        public async Task<HttpResponseMessage> CustomerCancel(IncidentStatusRequest statusRequest)
        {
            Services.Log.Info("Incident Cancellation Request [API]");
            string responseText;

            // Get the logged-in user.
            var currentUser = this.User as ServiceUser;

            stranddContext context = new stranddContext();

            //Retrieve Incident
            Incident updateIncident = await (from r in context.Incidents where (r.Id == statusRequest.IncidentGUID) select r).FirstOrDefaultAsync();

            //Find the Incident to Cancel and return Bad Response if not found
            if (updateIncident == null)
            {
                // Return Failed Response
                responseText = "Incident [" + statusRequest.IncidentGUID + "] is not found in the system";
                Services.Log.Warn(responseText);
                return this.Request.CreateResponse(HttpStatusCode.BadRequest, responseText);
            }
            else
            {

                updateIncident.StatusCode = "CANCELLED";
                updateIncident.StatusCustomerConfirm = true;
                updateIncident.StatusProviderConfirm = false;

                //Save record
                await context.SaveChangesAsync();
                responseText = "Incident [" + updateIncident.Id + "] Cancelled by Customer";
                Services.Log.Info(responseText);

                //Notifying Connect WebClients with IncidentInfo Package
                IHubContext hubContext = Services.GetRealtime<IncidentHub>();
                hubContext.Clients.All.updateIncidentStatusCustomerCancel(new IncidentInfo(updateIncident));
                Services.Log.Info("Connected Clients Updated");

                await HistoryEvent.logHistoryEventAsync("INCIDENT_CANCEL_CUSTOMER", null, updateIncident.Id, null, currentUser.Id, null);
                //Return Successful Response
                return this.Request.CreateResponse(HttpStatusCode.OK, responseText);
            }

        }
        public async Task<HttpResponseMessage> UpdateStatus(IncidentStatusRequest statusRequest)
        {
            Services.Log.Info("Incident Status Update Request [API]");
            string responseText;

            stranddContext context = new stranddContext();

            //Retrieve Incident
            Incident updateIncident = await (from r in context.Incidents where (r.Id == statusRequest.IncidentGUID) select r).FirstOrDefaultAsync();

            //Find the Incident to Edit and return Bad Response if not found
            if (updateIncident != null)
            {
                //Check for Submitted Status and Update
                if (statusRequest.NewStatusCode != null)
                {
                    updateIncident.StatusCode = statusRequest.NewStatusCode;
                    updateIncident.StatusCustomerConfirm = false;
                    updateIncident.StatusProviderConfirm = false;
                }

                //Check for Submitted Pricing and Update
                if (statusRequest.ServiceFee != 0)
                {
                    updateIncident.ServiceFee = statusRequest.ServiceFee;

                }

                //Check if ETA and Save Arrival Time
                if (statusRequest.ETA != 0)
                {
                    if (statusRequest.NewStatusCode == "ARRIVED")
                    {
                        updateIncident.ProviderArrivalTime = System.DateTime.Now;
                    }
                    else
                    {
                        DateTimeOffset? priorETA = updateIncident.ProviderArrivalTime;
                        updateIncident.ProviderArrivalTime = System.DateTime.Now.AddMinutes(statusRequest.ETA);

                        if (priorETA != null)
                        {
                            DateTimeOffset compareETA = (DateTimeOffset)priorETA;

                            compareETA = compareETA.AddMinutes(Convert.ToInt32(WebConfigurationManager.AppSettings["RZ_DelayMinuteBuffer"]));
                            if (DateTimeOffset.Compare(compareETA, (DateTimeOffset)updateIncident.ProviderArrivalTime) < 0) { statusRequest.Delayed = true; }
                        }
                    }
                }
            }
            else
            {
                // Return Failed Response
                responseText = "Incident [" + statusRequest.IncidentGUID + "] is not found in the system";
                Services.Log.Warn(responseText);
                return this.Request.CreateResponse(HttpStatusCode.BadRequest, responseText);
            }

            //Save record
            await context.SaveChangesAsync();
            responseText = "Incident [" + updateIncident.Id + "] Status Updated" + " to Code [" + updateIncident.StatusCode + "]";
            Services.Log.Info(responseText);

            ProcessStatusRequestBehavior(statusRequest, updateIncident, Services);

            //Return Successful Response
            return this.Request.CreateResponse(HttpStatusCode.OK, responseText);
        }
        public async Task<string> UpdateStatus(IncidentStatusRequest statusRequest)
        {
            Services.Log.Info("Incident Status Update Request [Hub]");
            string responseText;

            var currentUserID = ((ServiceUser)Context.User).Id;

            stranddContext context = new stranddContext();

            //Retrieve Incident
            Incident updateIncident = await (from r in context.Incidents where (r.Id == statusRequest.IncidentGUID) select r).FirstOrDefaultAsync();

            //Find the Incident to Edit and return Bad Response if not found
            if (updateIncident != null)
            {
                //Check for Submitted Status and Update
                if (statusRequest.NewStatusCode != null)
                {
                    updateIncident.StatusCode = statusRequest.NewStatusCode;
                    updateIncident.StatusCustomerConfirm = false;
                    updateIncident.StatusProviderConfirm = false;
                }

                //Check for Submitted Pricing and Update
                if (statusRequest.ServiceFee != 0)
                {
                    updateIncident.ServiceFee = statusRequest.ServiceFee;
                }

                //Check if ETA and Save Arrival Time
                if (statusRequest.ETA != 0)
                {
                    if (statusRequest.NewStatusCode == "ARRIVED")
                    {
                        updateIncident.ProviderArrivalTime = System.DateTime.Now;
                    }
                    else
                    {
                        DateTimeOffset? priorETA = updateIncident.ProviderArrivalTime;
                        updateIncident.ProviderArrivalTime = System.DateTime.Now.AddMinutes(statusRequest.ETA);

                        if (priorETA != null)
                        {
                            DateTimeOffset compareETA = (DateTimeOffset)priorETA;

                            compareETA = compareETA.AddMinutes(Convert.ToInt32(WebConfigurationManager.AppSettings["RZ_DelayMinuteBuffer"]));
                            if (DateTimeOffset.Compare(compareETA, (DateTimeOffset)updateIncident.ProviderArrivalTime) < 0) { statusRequest.Delayed = true; }
                        }
                    }


                }

            }
            else
            {
                // Return Failed Response
                responseText = "Incident not found [" + statusRequest.IncidentGUID + "] in the system";
                Services.Log.Warn(responseText);
                return responseText;
            }

            //Save record
            await context.SaveChangesAsync();
            Services.Log.Info("Incident [" + updateIncident.Id + "] Status Updated" + " to Code: " + updateIncident.StatusCode);

            await HistoryEvent.logHistoryEventAsync("INCIDENT_STATUS_ADMIN", updateIncident.StatusCode, updateIncident.Id, currentUserID, null, null);

            IncidentController.ProcessStatusRequestBehavior(statusRequest, updateIncident, Services);
            
            //Return Successful Response
            responseText = "Status Updated";
            return responseText;
        }