public void Process(IncomingMessage incomingMessage)
        {
            //save the incoming message to history
            _repository.Create(new LoggedIncomingMessage
                                   {
                                       FromNumber = incomingMessage.From,
                                       Body = incomingMessage.Body,
                                       LoggedOn = SystemDateTime.Now()
                                   });

            LoggedOutgoingMessage lastSendedMessage =
                _repository.GetAll<LoggedOutgoingMessage>().ToList().FindLast(x => x.ToNumber == incomingMessage.From);
            if (lastSendedMessage != null && lastSendedMessage.Body.Equals("¿En qué ciudad se encuentra en este momento?"))
            {
                HelpCenter helpCenter =
                    _repository.GetAll<HelpCenter>().FirstOrDefault(x => x.City == incomingMessage.Body);
                if (helpCenter != null)
                    _messageSender.Send(new OutgoingMessage(incomingMessage.From,
                                                            string.Format("Dirección: {0} | Teléfono: {1}",
                                                                          helpCenter.Address, helpCenter.PhoneNumber)));

                else
                {
                    _messageSender.Send(new OutgoingMessage(incomingMessage.From,
                                                            "No existe centro de ayuda para esa ciudad"));
                }
                return;
            }


            if (incomingMessage.Body.ToLower().Equals("centroayuda"))
            {
                _messageSender.Send(new OutgoingMessage(incomingMessage.From, "¿En qué ciudad se encuentra en este momento?"));
            }
            else
            {
                Case _case = _caseRepository.GetLastByCellPhoneNumber(incomingMessage.From);
                if (_case == null)
                {
                    //create undetermined case
                    _caseRepository.Create(incomingMessage.From);
                    
                    _messageSender.Send(new OutgoingMessage(incomingMessage.From, "¿Es una emergencia?"));
                }
                else
                {
                    _caseRepository.UpdateLatestActivity(_case.Id);
                    switch (_case.Status)
                    {
                        case CaseStatus.Undetermined:

                            _caseRepository.MarkCaseAsEmergency(_case);

                            _messageSender.Send(new OutgoingMessage(incomingMessage.From,
                                                                    "¿Podemos contactarlo por teléfono?"));

                            //send email to caseworker
                            var message = new MailMessage
                                              {
                                                  Body = "Hay un nuevo caso que necesita su atención",
                                                  From = new MailAddress("*****@*****.**"),
                                                  Subject = "Nuevo caso"
                                              };
                            message.To.Add("*****@*****.**");
                            _emailSender.Send(message);
                            break;
                        case CaseStatus.Emergency:
                            //nothing happens because the message was already added to the loggedIncomingMessages

                            break;

                            case CaseStatus.Inactive:
                            
                            //should set the case as active again

                            break;
                    }
                }


                //is it part of an existing case or session? (it's part of an existing session if the last activity was less than 10 minutes ago)

                //if it's part of an existing session, need to update the session with a new "LastActivity"
                //if there is already a case for this number, need to update the case with a new "LastActivity"

                //here we decide what to do with the incoming message

                //if new session, check if this is an emergency

                //if emergency, check if we can call by phone

                //if we can call by phone or not, notify the caseworker to view the case in the workflow

                //if not emergency, ask more questions

                //need a "ScriptProvider" here to help decide which script to follow (a script is a guided, automated conversation)

                //once we find a matching script, run the script

                //if no script is found, start a case and notify caseworker


                //TEMPORARY: for now, we'll just tell them that the message was received (testing only)
                //_messageSender.Send(new OutgoingMessage(incomingMessage.From, "Is this an emergency?"));
            }

            #endregion
        }