/// <summary>
        /// http://apidocs.mailchimp.com/api/2.0/helper/chimp-chatter.php
        /// </summary>
        /// <returns></returns>
        public Task<MailChimpServiceResponse> ChimpChatterAsync(Email email, string listID = null)
        {
            var url = Urls.Helper + "/chimp-chatter.json";

            var request = new
            {
                email = email,
                options = new
                {
                    list_id = listID
                }
            };

            return Execute(url, request);
        }
        /// <summary>
        /// http://apidocs.mailchimp.com/api/2.0/helper/campaigns-for-email.php
        /// </summary>
        /// <returns></returns>
        public Task<MailChimpServiceResponse> CampaignsForEmailAsync(Email email, string listID = null)
        {
            var url = Urls.Helper + "/campaigns-for-email.json";

            var request = new
            {
                email = email,
                options = new
                {
                    list_id = listID
                }
            };

            return Execute(url, request);
        }
        private ServiceResponse SubscribeWithMergeVars(string email, dynamic mergeVars, bool enableDoubleOptIn)
        {
            ServiceResponse serviceResponse = new ServiceResponse();
            var urlTemplate = String.Format("{0}{1}/subscribe.json/", MailChimpServiceConfiguration.Settings.ServiceUrl,
                                            MailChimpServiceConfiguration.Settings.ListsRelatedSection);

            var subscriber = new Subscriber();
            subscriber.DoubleOptIn = enableDoubleOptIn;
            subscriber.ApiKey = _apiKey;
            subscriber.ListId = MailChimpServiceConfiguration.Settings.SubscriberListId;
            var emailObject = new Email { EmailValue = email };
            subscriber.Email = emailObject;
            subscriber.UpdateExisting = true;

            if (mergeVars != null)
            {
                subscriber.MergeVars = mergeVars;
            }
            try
            {
                var responseData = PostHelpers.PostJson(urlTemplate, subscriber.ToString());
                var deserializedData = JsonConvert.DeserializeObject<Email>(responseData);
                _log.DebugFormat("MailChimpService Call : {0}, response json : {1}", subscriber, deserializedData);
                serviceResponse.IsSuccesful = deserializedData.EmailValue != null && deserializedData.Euid != null &&
                       deserializedData.Leid != null;
                serviceResponse.ResponseJson = responseData;
            }
            catch (WebException exception)
            {
                using (Stream stream = exception.Response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                    String responseString = reader.ReadToEnd();
                    serviceResponse.ResponseJson = responseString;
                    _log.Error(responseString);
                }
                _log.Error(exception);
                serviceResponse.IsSuccesful = false;
            }
            return serviceResponse;
        }
        /// <summary>
        /// http://apidocs.mailchimp.com/api/2.0/helper/lists-for-email.php
        /// </summary>
        /// <returns></returns>
        public Task<MailChimpServiceResponse> ListsForEmailAsync(Email email)
        {
            var url = Urls.Helper + "/lists-for-email.json";

            var request = new
            {
                email = email
            };

            return Execute(url, request);
        }
        /// <summary>
        /// http://apidocs.mailchimp.com/api/2.0/lists/update-member.php
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        public Task<MailChimpServiceResponse> UpdateMemberAsync(string id, Email email, Dictionary<string, List<string>> mergeVars, EmailType type, bool replaceInterests)
        {
            var url = Urls.List + "/update-member.json";

            var request = new
            {
                id = id,
                email = email,
                merge_vars = mergeVars,
                email_type = type,
                replace_interests = replaceInterests
            };

            return Execute(url, request);
        }
 public MailChimpServiceResponse UpdateMember(string id, Email email, Dictionary<string, List<string>> mergeVars, EmailType type, bool replaceInterests)
 {
     return WaitForServiceResponse(UpdateMemberAsync(id, email, mergeVars, type, replaceInterests));
 }
        public Task<MailChimpServiceResponse<Email>> UnsubscribeAsync(Email email, string listID)
        {
            var url = Urls.List + "/unsubscribe.json";

            var subscriber = new
            {
                id = listID,
                delete_member = false,
                email = email,
                send_goodbye = true,
                send_notify = true
            };

            return Execute<Email>(url, subscriber).ContinueWith(t =>
            {
                if (t.Result.IsSuccesful)
                    t.Result.IsSuccesful = t.Result.Value.EmailValue != null &&
                                           t.Result.Value.Euid != null &&
                                           t.Result.Value.Leid != null;

                return t.Result;
            });
        }
 public MailChimpServiceResponse<Email> Unsubscribe(Email email, string listID)
 {
     return WaitForServiceResponse(UnsubscribeAsync(email, listID));
 }
        /// <summary>
        /// http://apidocs.mailchimp.com/api/2.0/reports/bounce-message.php
        /// </summary>
        /// <returns></returns>
        public Task<MailChimpServiceResponse> BounceMessageAsync(string campaignID, Email email)
        {
            var url = Urls.Report + "/bounce-message.json";

            var request = new
            {
                cid = campaignID,
                email = email
            };

            return Execute(url, request);
        }