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("[email protected]"),
Subject = "Nuevo caso"
};
message.To.Add("[email protected]");
_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
}