public bool SendEmail(Guid apiKey, string fromAddress, string toAddress, string subject, string body)
        {
            _logger.Log(LogLevel.Info, String.Format("{0} - Send Email to {1} from {2}; +", apiKey, toAddress, fromAddress));

            //Create Email Log
            var application = _applicationService.GetApplication(apiKey.ToString());

            var emailLog = _emailLogService.AddEmailLog(application.ApiKey, fromAddress, toAddress, subject, body, null);

            //Send Email
            SmtpClient sc = new SmtpClient();

            sc.EnableSsl = true;
            try
            {
                _logger.Log(LogLevel.Info, String.Format("Sending Email {0} {1}", sc.Host, sc.Port));

                sc.Send(fromAddress, toAddress, subject, body);

                _logger.Log(LogLevel.Info, String.Format("I am Here"));

                emailLog.EmailStatus = EmailStatus.Sent;
                emailLog.SentDate    = System.DateTime.Now;

                //Update Email Status
                _emailLogService.UpdateEmailLog(emailLog);

                _logger.Log(LogLevel.Info, String.Format("Email Sent  to {0}", toAddress));
            }
            catch (Exception ex)
            {
                _logger.Log(LogLevel.Error, String.Format("Exception Sending Email to {0}. {1}", toAddress, ex.Message));

                emailLog.EmailStatus = EmailStatus.Failed;
                //Update Email Status
                _emailLogService.UpdateEmailLog(emailLog);

                return(false);
            }

            return(true);
        }
        public Message AddMessage(string apiKey, string senderUri, string recipientUri, string senderAccountId, double amount, string comments, string messageType,
                                  string securityPin, double latitude, double longitude, string recipientFirstName, string recipientLastName, string recipientImageUri)
        {
            User sender = null;

            URIType recipientUriType = GetURIType(recipientUri);
            URIType senderUriType    = GetURIType(senderUri);

            if (recipientUriType == URIType.MobileNumber)
            {
                recipientUri = _formattingServices.RemoveFormattingFromMobileNumber(recipientUri);
            }

            if (senderUriType == URIType.MobileNumber)
            {
                senderUri = _formattingServices.RemoveFormattingFromMobileNumber(senderUri);
            }

            if (!(messageType.ToUpper() == "PAYMENT" || messageType.ToUpper() == "PAYMENTREQUEST"))
            {
                throw new ArgumentException(String.Format("Invalid Message Type.  Message Type must be Payment or PaymentRequest"));
            }

            MessageType type = MessageType.Payment;

            if (messageType.ToUpper() == "PAYMENT")
            {
                type = MessageType.Payment;
            }

            if (messageType.ToUpper() == "PAYMENTREQUEST")
            {
                type = MessageType.PaymentRequest;
            }

            try
            {
                sender = _userServices.GetUser(senderUri);
            }
            catch (Exception ex)
            {
                _logger.Log(LogLevel.Debug, String.Format("Exception getting Sender {0}. {1}", senderUri, ex.Message));

                throw new ArgumentException(String.Format("Sender {0} Not Found", senderUri));
            }

            if (sender == null)
            {
                var message = String.Format("Unable to find sender {0}", senderUri);
                _logger.Log(LogLevel.Debug, message);

                throw new Exception(message);
            }

            if (!sender.SetupSecurityPin || !(sender.SecurityPin.Equals(_securityServices.Encrypt(securityPin))))
            {
                var message = String.Format("Invalid Security Pin");
                _logger.Log(LogLevel.Info, message);
                _logger.Log(LogLevel.Info, String.Format("{0} - {1}", sender.SecurityPin, _securityServices.Encrypt(securityPin)));

                throw new Exception(message);
            }

            if (recipientUriType == URIType.MobileNumber && _validationService.AreMobileNumbersEqual(sender.MobileNumber, recipientUri))
            {
                var message = String.Format("Sender and Recipient are the same");
                _logger.Log(LogLevel.Debug, message);

                throw new InvalidOperationException(message);
            }

            PaymentAccount senderAccount = null;

            try
            {
                senderAccount = GetAccount(sender, senderAccountId);
            }
            catch (Exception ex)
            {
                var message = String.Format("Exception getting Sender Account {0}. {1}", senderAccountId, ex.Message);

                _logger.Log(LogLevel.Debug, message);

                throw new Exception(message);
            }

            if (senderAccount == null)
            {
                var message = String.Format("The senderAccountId is invalid.");
                _logger.Log(LogLevel.Debug, message);

                throw new ArgumentException(message);
            }

            //TODO: validate application in request
            Application application = null;

            try
            {
                application = _applicationServices.GetApplication(apiKey);;
            }
            catch (Exception ex)
            {
                _logger.Log(LogLevel.Debug, String.Format("Exception getting application {0}. {1}", apiKey, ex.Message));

                throw ex;
            }

            if (application == null)
            {
                var message = String.Format("Application {0} was not found.", apiKey);

                _logger.Log(LogLevel.Debug, String.Format("Exception getting application {0}. {1}", apiKey, message));

                throw new InvalidOperationException(message);
            }

            Domain.User recipient = null;
            if (recipientUriType == URIType.MECode)
            {
                var meCode = _context.MECodes
                             .FirstOrDefault(m => m.MeCode.Equals(recipientUri));

                if (meCode == null)
                {
                    throw new ArgumentException("MECode not found.");
                }

                recipient = meCode.User;
            }

            if (recipientUriType == URIType.EmailAddress)
            {
                recipient = _userServices.FindUserByEmailAddress(recipientUri);
            }
            if (recipientUriType == URIType.MobileNumber)
            {
                recipient = _userServices.FindUserByMobileNumber(recipientUri);
            }
            if (recipientUriType == URIType.FacebookAccount)
            {
                recipient = _userServices.GetUser(recipientUri);
            }
            //TODO: confirm recipient is valid???

            //TODO: confirm amount is within payment limits

            //TODO: try to add message
            Domain.Message messageItem;

            _logger.Log(LogLevel.Info, "Adding Message");

            if (sender == null || senderAccount == null)
            {
                _logger.Log(LogLevel.Info, "Sender or Sender Account Not Set");
                throw new Exception("Sender or Sender Account Not Set");
            }

            try
            {
                MessageStatus messageStatus = MessageStatus.Submitted;

                messageItem = _context.Messages.Add(new Message()
                {
                    Amount             = amount,
                    Application        = application,
                    ApiKey             = application.ApiKey,
                    Comments           = comments,
                    CreateDate         = System.DateTime.Now,
                    Id                 = Guid.NewGuid(),
                    MessageStatus      = MessageStatus.Pending,
                    MessageStatusValue = (int)messageStatus,
                    MessageType        = type,
                    MessageTypeValue   = (int)type,
                    RecipientUri       = recipientUri,
                    SenderUri          = senderUri,
                    Sender             = sender,
                    SenderId           = sender.UserId,
                    SenderAccount      = senderAccount,
                    SenderAccountId    = senderAccount.Id,
                    Latitude           = latitude,
                    Longitude          = longitude,
                    recipientFirstName = (recipient != null && !String.IsNullOrEmpty(recipient.FirstName) ? recipient.FirstName : recipientFirstName),
                    recipientLastName  = (recipient != null && !String.IsNullOrEmpty(recipient.LastName) ? recipient.LastName : recipientLastName),
                    recipientImageUri  = recipientImageUri
                });

                _context.SaveChanges();
            }
            catch (Exception ex)
            {
                var message = String.Format("Exception adding message. {0}", ex.Message);

                throw new Exception(message);
            }

            return(messageItem);
        }
        public void SendSMS(Guid apiKey, string mobileNumber, string message)
        {
            if (apiKey == null || String.IsNullOrEmpty(mobileNumber) || String.IsNullOrEmpty(message))
            {
                throw new ArgumentNullException(String.Format("You must specify an APIKey, mobile number and Message to send an SMS"));
            }

            var application = _applicationService.GetApplication(apiKey.ToString());

            //Log Request
            var smsLog = _smsLogService.AddSMSLog(apiKey, mobileNumber, message, Domain.SMSStatus.Pending, null);

            // SMSified API endpoint.
            string webTarget = "https://api.smsified.com/v1/smsmessaging/outbound/{0}/requests";

            // Parameters to send with API request.
            string webPost = "address={0}&message={1}";

            // SMSified credentials.
            string userName     = "******";
            string password     = "******";
            string senderNumber = "2892100266";

            //format to number
            string toMobileNumber = _formattingServices.RemoveFormattingFromMobileNumber(mobileNumber);

            //var aliases = _ctx.MobileDeviceAliases
            //    .FirstOrDefault(m => m.MobileNumber == mobileNumber);

            //if (aliases != null)
            //{
            //    _logger.Log(LogLevel.Info, String.Format("Alias found for {0}", mobileNumber));
            //    toMobileNumber = String.Format("{0}{1}", "1", aliases.MobileNumberAlias.Replace(@"-", @""));
            //}

            _logger.Log(LogLevel.Info, String.Format("Sending SMS Message to {0}", toMobileNumber));

            // Create new HTTP request.
            string         url = String.Format(webTarget, senderNumber);
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

            req.Method      = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            byte[] postData = Encoding.ASCII.GetBytes(String.Format(webPost, toMobileNumber, message));
            req.ContentLength = postData.Length;

            // Set HTTP authorization header.
            string authInfo = userName + ":" + password;

            authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
            req.Headers["Authorization"] = "Basic " + authInfo;

            // Send HTTP request.
            Stream PostStream = req.GetRequestStream();

            PostStream.Write(postData, 0, postData.Length);
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();

            // Evaluate result of HTTP request.
            if (res.StatusCode == HttpStatusCode.Created)
            {
                smsLog.SMSStatus = Domain.SMSStatus.Sent;
                smsLog.SentDate  = System.DateTime.Now;

                _smsLogService.UpdateSMSLog(smsLog);
            }
            else
            {
                smsLog.SMSStatus = Domain.SMSStatus.Failed;

                _smsLogService.UpdateSMSLog(smsLog);
            }
        }