/// <summary>
        /// Send a new outbound message.
        /// </summary>
        /// <param name="text">Message text</param>
        /// <param name="phone">Destination phone number in international E.164 format</param>
        /// <returns></returns>
        public SendingResult SendMessage(string text, string phone)
        {
            string[] phones = { phone };
            var options = new SendingOptions
            {
                Text = text,
                Phones = phones
            };

            return SendMessage(options);
        }
        /// <summary>
        /// Convert SendingOptions to RestRequest parameters
        /// </summary>
        /// <param name="request"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        protected RestRequest _makeSendingRequest(RestRequest request, SendingOptions options)
        {
            request.Resource = "messages";
            if (!string.IsNullOrEmpty(options.Text)) request.AddParameter("text", options.Text);
            if (options.Phones != null && options.Phones.Length > 0) request.AddParameter("phones", string.Join(",", options.Phones));
            if (options.ContactIds != null && options.ContactIds.Length > 0) request.AddParameter("contacts", string.Join(",", options.ContactIds));
            if (options.ListIds != null && options.ListIds.Length > 0) request.AddParameter("lists", string.Join(",", options.ListIds));
            if (options.CutExtra.HasValue) request.AddParameter("cutExtra", (bool)options.CutExtra ? "1" : "0");
            if (options.PartsCount.HasValue) request.AddParameter("partsCount", options.PartsCount.ToString());
            if (!string.IsNullOrEmpty(options.ReferenceId)) request.AddParameter("referenceId", options.ReferenceId);
            if (!string.IsNullOrEmpty(options.From)) request.AddParameter("from", options.From);
            if (!string.IsNullOrEmpty(options.Rrule)) request.AddParameter("rrule", options.Rrule);
            if (options.SendingTime.HasValue) request.AddParameter("sendingTime", DateTimeToTimestamp((DateTime)options.SendingTime).ToString());
            if (options.TemplateId.HasValue) request.AddParameter("templateId", options.TemplateId.ToString());

            return request;
        }
        /// <summary>
        /// Check pricing for a new outbound message.
        /// </summary>
        /// <param name="options"></param>
        /// <returns></returns>
        public Pricing GetPrice(SendingOptions options)
        {
            var request = new RestRequest(Method.POST);
            request = _makeSendingRequest(request, options);
            request.Method = Method.GET;
            request.Resource = "messages/price";
            request.AddParameter("dummy", "1");

            return Execute<Pricing>(request);
        }
        /// <summary>
        /// Send a new outbound message.
        /// </summary>
        /// <param name="options">Message sending options</param>
        /// <returns></returns>
        public SendingResult SendMessage(SendingOptions options)
        {
            var request = new RestRequest(Method.POST);
            request = _makeSendingRequest(request, options);

            return Execute<SendingResult>(request);
        }
        public void ShouldSendScheduledMessage()
        {
            IRestRequest savedRequest = null;
            mockClient.Setup(trc => trc.Execute<SendingResult>(It.IsAny<IRestRequest>()))
                .Callback<IRestRequest>((request) => savedRequest = request)
                .Returns(new SendingResult());
            var client = mockClient.Object;

            var options = new SendingOptions
            {
                Phones = messageReceivers,
                Text = messageText,
                SendingTime = messageTime
            };
            var link = client.SendMessage(options);

            mockClient.Verify(trc => trc.Execute<SendingResult>(It.IsAny<IRestRequest>()), Times.Once);
            Assert.IsNotNull(savedRequest);
            Assert.AreEqual("messages", savedRequest.Resource);
            Assert.AreEqual(Method.POST, savedRequest.Method);
            Assert.AreEqual(3, savedRequest.Parameters.Count);
            Assert.AreEqual(messageText, savedRequest.Parameters.Find(x => x.Name == "text").Value);
            Assert.AreEqual(string.Join(",", messageReceivers), savedRequest.Parameters.Find(x => x.Name == "phones").Value);
            Assert.AreEqual(Client.DateTimeToTimestamp(messageTime).ToString(), savedRequest.Parameters.Find(x => x.Name == "sendingTime").Value);
        }
        public void ShouldSendMessage()
        {
            IRestRequest savedRequest = null;
            mockClient.Setup(trc => trc.Execute<SendingResult>(It.IsAny<IRestRequest>()))
                .Callback<IRestRequest>((request) => savedRequest = request)
                .Returns(new SendingResult());
            var client = mockClient.Object;

            int[] contactIds = { 321 };
            int[] listIds = { 5436 };
            string[] phones = { "55443322" };

            SendingOptions sendingOptions = new SendingOptions();
            sendingOptions.ContactIds = contactIds;
            sendingOptions.ListIds = listIds;
            sendingOptions.Phones = phones;
            sendingOptions.TemplateId = null;
            sendingOptions.Text = "Hello My Message";

            client.SendMessage(sendingOptions);

            mockClient.Verify(trc => trc.Execute<SendingResult>(It.IsAny<IRestRequest>()), Times.Once);
            Assert.IsNotNull(savedRequest);
            Assert.AreEqual("messages", savedRequest.Resource);
            Assert.AreEqual(Method.POST, savedRequest.Method);
            Assert.AreEqual(4, savedRequest.Parameters.Count);

            var content = "{ \"type\": \"session\", \"sessionId\": 1, \"bulkId\": 2,"
                + "\"messageId\": 3, \"scheduleId\": 4 }";

            var testClient = Common.CreateClient<SendingResult>(content, null, null);
            client = new Client(testClient);

            var messageSent = client.SendMessage(sendingOptions);

            Assert.IsTrue(messageSent.Success);
            Assert.AreEqual("session", messageSent.Type);
            Assert.AreEqual(1, messageSent.SessionId);
            Assert.AreEqual(2, messageSent.BulkId);
            Assert.AreEqual(3, messageSent.MessageId);
            Assert.AreEqual(4, messageSent.ScheduleId);
        }
        public void ShouldSendAllSetParameters()
        {
            int[] contactIds = { 385, 15 };
            int[] listIds = { 424, 454, 223 };

            IRestRequest savedRequest = null;
            mockClient.Setup(trc => trc.Execute<SendingResult>(It.IsAny<IRestRequest>()))
                .Callback<IRestRequest>((request) => savedRequest = request)
                .Returns(new SendingResult());
            var client = mockClient.Object;

            var options = new SendingOptions
            {
                Phones = messageReceivers,
                Text = messageText,
                SendingTime = messageTime,
                ContactIds = contactIds,
                ListIds = listIds,
                From = messageSender,
                CutExtra = messageCutExtra,
                PartsCount = messagePartsCount,
                ReferenceId = sessionReferenceId,
                Rrule = messageRrule
            };
            var link = client.SendMessage(options);

            mockClient.Verify(trc => trc.Execute<SendingResult>(It.IsAny<IRestRequest>()), Times.Once);
            Assert.IsNotNull(savedRequest);
            Assert.AreEqual("messages", savedRequest.Resource);
            Assert.AreEqual(Method.POST, savedRequest.Method);
            Assert.AreEqual(10, savedRequest.Parameters.Count);
            Assert.AreEqual(messageText, savedRequest.Parameters.Find(x => x.Name == "text").Value);
            Assert.AreEqual(string.Join(",", messageReceivers), savedRequest.Parameters.Find(x => x.Name == "phones").Value);
            Assert.AreEqual(string.Join(",", contactIds), savedRequest.Parameters.Find(x => x.Name == "contacts").Value);
            Assert.AreEqual(string.Join(",", listIds), savedRequest.Parameters.Find(x => x.Name == "lists").Value);
            Assert.AreEqual(Client.DateTimeToTimestamp(messageTime).ToString(), savedRequest.Parameters.Find(x => x.Name == "sendingTime").Value);
            Assert.AreEqual(messageSender, savedRequest.Parameters.Find(x => x.Name == "from").Value);
            Assert.AreEqual(messageCutExtra ? "1" : "0", savedRequest.Parameters.Find(x => x.Name == "cutExtra").Value);
            Assert.AreEqual(messagePartsCount.ToString(), savedRequest.Parameters.Find(x => x.Name == "partsCount").Value);
            Assert.AreEqual(sessionReferenceId, savedRequest.Parameters.Find(x => x.Name == "referenceId").Value);
            Assert.AreEqual(messageRrule, savedRequest.Parameters.Find(x => x.Name == "rrule").Value);
        }
        public void ShouldGetPrice()
        {
            IRestRequest savedRequest = null;
            mockClient.Setup(trc => trc.Execute<Pricing>(It.IsAny<IRestRequest>()))
                .Callback<IRestRequest>((request) => savedRequest = request)
                .Returns(new Pricing());
            var client = mockClient.Object;

            int[] contactIds = { 321 };
            int[] listIds = { 5436 };
            string[] phones = { "55443322" };

            SendingOptions sendingOptions = new SendingOptions();
            sendingOptions.ContactIds = contactIds;
            sendingOptions.ListIds = listIds;
            sendingOptions.Phones = phones;
            sendingOptions.TemplateId = null;
            sendingOptions.Text = "Hello My Message";

            client.GetPrice(sendingOptions);

            mockClient.Verify(trc => trc.Execute<Pricing>(It.IsAny<IRestRequest>()), Times.Once);
            Assert.IsNotNull(savedRequest);
            Assert.AreEqual("messages/price", savedRequest.Resource);
            Assert.AreEqual(Method.GET, savedRequest.Method);
            Assert.AreEqual(5, savedRequest.Parameters.Count);

            var content = "{ \"total\": 0.056, \"parts\": 1, \"countries\": { \"CH\": {"
                + "\"country\": \"CH\", \"count\": \"1\", \"max\": 0.056 } } }";

            var testClient = Common.CreateClient<Pricing>(content, null, null);
            client = new Client(testClient);

            var messagePricing = client.GetPrice(sendingOptions);

            Assert.IsTrue(messagePricing.Success);
            Assert.AreEqual("CH", messagePricing.Countries["CH"].Country);
            Assert.AreEqual(1, messagePricing.Countries["CH"].Count);
            Assert.AreEqual(0.056f, messagePricing.Countries["CH"].Price);
            Assert.AreEqual(1, messagePricing.Parts);
            Assert.AreEqual(0.056f, messagePricing.Total);
        }
        public void ShouldSendTemplate()
        {
            var templateId = 318;

            IRestRequest savedRequest = null;
            mockClient.Setup(trc => trc.Execute<SendingResult>(It.IsAny<IRestRequest>()))
                .Callback<IRestRequest>((request) => savedRequest = request)
                .Returns(new SendingResult());
            var client = mockClient.Object;

            var options = new SendingOptions
            {
                Phones = messageReceivers,
                TemplateId = templateId
            };
            var link = client.SendMessage(options);

            mockClient.Verify(trc => trc.Execute<SendingResult>(It.IsAny<IRestRequest>()), Times.Once);
            Assert.IsNotNull(savedRequest);
            Assert.AreEqual("messages", savedRequest.Resource);
            Assert.AreEqual(Method.POST, savedRequest.Method);
            Assert.AreEqual(2, savedRequest.Parameters.Count);
            Assert.AreEqual(string.Join(",", messageReceivers), savedRequest.Parameters.Find(x => x.Name == "phones").Value);
            Assert.AreEqual(templateId.ToString(), savedRequest.Parameters.Find(x => x.Name == "templateId").Value);
        }