public void AddCustomerWithMultiaddress()
        {
            string preferenceName = ConfigurationManager.AppSettings["MultiaddressName"];
            HttpStatusCode status;
            string statusMessage;
            BrickStreetConnect brickStreetConnect = makeClient();

            BrickStAPI.Connect.Attribute attrDef = brickStreetConnect.GetCustomerAttribute(preferenceName, out status,
                out statusMessage);
            if (status != HttpStatusCode.OK)
            {
                Console.WriteLine("ERROR: STATUS:" + status.ToString() + " " + statusMessage);
            }

            Assert.IsNotNull(attrDef);
            string attrType = attrDef.Type;
            //create new customer
            Random r = new Random();
            long val = r.Next();
            if (val < 0)
            {
                val *= -1;
            }

            String custVal = "cmaeda+" + val + "@cmaeda.com";

            Customer c = new Customer();
            c.EmailAddress = custVal;
            c.AltCustomerId = custVal;
            c.AddressLine1 = "215 S Broadway 241";
            c.City = "Salem";
            c.State = "NH";
            c.Country = "USA";

            Customer c2 = brickStreetConnect.AddCustomer(c, out status, out statusMessage);
            if (status != HttpStatusCode.OK)
            {
                Console.WriteLine("ERROR: STATUS:" + status.ToString() + " " + statusMessage);
            }

            Assert.IsNotNull(c2, "Customer is null");
            Assert.IsNotNull(c2.Id, "Customer ID is null");
            Assert.AreEqual(c2.EmailAddress, custVal);
            Assert.AreEqual(c2.AltCustomerId, custVal);

            c = c2;

            //
            //add preference
            //

            CustomerAttribute attr = null;
            if (string.Compare("preference", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                attr = c.GetAttribute(preferenceName);
                if (attr == null)
                {
                    attr = new CustomerAttribute();
                    attr.Name = attrDef.Name;
                    attr.Type = attrDef.Type;
                    attr.DataType = attrDef.DataType;

                    //start with 1 value
                    attr.PreferenceValues = new string[1];
                    attr.PreferenceValues[0] = "pval" + val;
                    c.Attributes.Add(attr);
                }
                else
                {
                    string[] vals = attr.PreferenceValues;
                    string[] newVals = new string[vals.Length + 1];
                    Array.Copy(vals, 0, newVals, 0, vals.Length);
                    newVals[newVals.Length - 1] = "pval" + val;
                    attr.PreferenceValues = newVals;
                }
            }
            else if (string.Compare("multiaddress", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                //add a channel address
                attr = c.GetChannelAddress(preferenceName);
                if (attr == null)
                {
                    attr = new CustomerAttribute();
                    attr.Name = attrDef.Name;
                    attr.Type = attrDef.Type;
                    attr.DataType = attrDef.DataType;

                    //start with 1 value
                    attr.PreferenceValues = new string[1];
                    attr.PreferenceValues[0] = "pval" + val;
                    c.ChannelAddresses.Add(attr);
                }
                else
                {
                    string[] vals = attr.PreferenceValues;
                    string[] newVals = new string[vals.Length + 1];
                    Array.Copy(vals, 0, newVals, 0, vals.Length);
                    newVals[newVals.Length - 1] = "pval" + val;
                    attr.PreferenceValues = newVals;
                }

            }
            else
            {
                Assert.IsTrue(false, "Unknown pref type " + attrType);
            }

            //save orig value
            string[] prefVals = attr.PreferenceValues;

            c2 = brickStreetConnect.UpdateCustomer(c, out status, out statusMessage);
            if (status != HttpStatusCode.OK)
            {
                Console.WriteLine("ERROR: STATUS:" + status.ToString() + " " + statusMessage);
            }

            Assert.IsNotNull(c2, "Customer 2 is null");

            //check saved data
            CustomerAttribute c2attr = null;
            if (string.Compare("preference", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                c2attr = c2.GetAttribute(preferenceName);
            }
            else if (string.Compare("multiaddress", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                c2attr = c2.GetChannelAddress(preferenceName);
            }

            Assert.IsNotNull(c2attr);
            CollectionAssert.AreEquivalent(prefVals, c2attr.PreferenceValues);

            c = c2;

            //
            //add a second pref value
            //

            //new random value
            val = r.Next();
            if (val < 0)
            {
                val *= -1;
            }

            if (string.Compare("preference", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                attr = c.GetAttribute(preferenceName);
                Assert.IsNotNull(attr);

                //add a value
                string[] vals = attr.PreferenceValues;
                string[] newVals = new string[vals.Length + 1];
                Array.Copy(vals, 0, newVals, 0, vals.Length);
                newVals[newVals.Length - 1] = "pval" + val;
                attr.PreferenceValues = newVals;

            }
            else if (string.Compare("multiaddress", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                //add a channel
                attr = c.GetChannelAddress(preferenceName);
                Assert.IsNotNull(attr);

                string[] vals = attr.PreferenceValues;
                string[] newVals = new string[vals.Length + 1];
                Array.Copy(vals, 0, newVals, 0, vals.Length);
                newVals[newVals.Length - 1] = "pval" + val;
                attr.PreferenceValues = newVals;
            }
            else
            {
                Assert.IsTrue(false, "Unknown pref type " + attrType);
            }

            prefVals = attr.PreferenceValues;
            c2 = brickStreetConnect.UpdateCustomer(c, out status, out statusMessage);
            Assert.IsNotNull(c2, "Customer 2 is null");

            //check saved data
            c2attr = null;
            if (string.Compare("preference", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                c2attr = c2.GetAttribute(preferenceName);
            }
            else if (string.Compare("multiaddress", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                c2attr = c2.GetChannelAddress(preferenceName);
            }

            Assert.IsNotNull(c2attr);
            CollectionAssert.AreEquivalent(prefVals, c2attr.PreferenceValues);

            c = c2;

            //
            //remove a preference
            //
            if (string.Compare("preference", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                attr = c2.GetAttribute(preferenceName);
            }
            else if (string.Compare("multiaddress", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                attr = c2.GetChannelAddress(preferenceName);
            }

            Assert.IsNotNull(attr);

            //remove first value
            string[] oldVals = attr.PreferenceValues;
            string[] newVals1 = new string[oldVals.Length - 1];
            Array.Copy(oldVals, 1, newVals1, 0, newVals1.Length);
            attr.PreferenceValues = newVals1;

            prefVals = attr.PreferenceValues;
            c2 = brickStreetConnect.UpdateCustomer(c, out status, out statusMessage);
            Assert.AreNotEqual(c2, "Customer 2 is null");

            //check saved data
            c2attr = null;
            if (string.Compare("preference", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                c2attr = c2.GetAttribute(preferenceName);
            }
            else if (string.Compare("multiaddress", attrType, StringComparison.OrdinalIgnoreCase) == 0)
            {
                c2attr = c2.GetChannelAddress(preferenceName);
            }

            Assert.IsNotNull(c2attr);
            CollectionAssert.AreEquivalent(prefVals, c2attr.PreferenceValues);
        }
        public void ExistingEventCampaign()
        {
            //
            //Test Parameters
            //
            string altCustId = ConfigurationManager.AppSettings["AltCustId"];
            string eventName = ConfigurationManager.AppSettings["EventName"];
            string tokenName = ConfigurationManager.AppSettings["TokenName"];
            string tokenValue = ConfigurationManager.AppSettings["TokenValue"];
            //

            BrickStreetConnect brickst = makeClient();
            HttpStatusCode status;
            string statusMessage;
            string timecode = DateTime.Now.ToLongTimeString();

            Customer customer = brickst.GetCustomerByAltId(altCustId, out status, out statusMessage);

            if (customer == null)
            {
                string randomEmail = "user" + timecode + "@example.com";
                customer = new Customer();
                customer.EmailAddress = randomEmail;
                customer.AltCustomerId = altCustId;

                Customer cust2 = brickst.AddCustomer(customer, out status, out statusMessage);
                if (status != HttpStatusCode.OK)
                {
                    Console.WriteLine("ERROR: STATUS:" + status.ToString() + " " + statusMessage);
                    throw new Exception("null customer received from add customer");
                }
            }

            long custId = Convert.ToInt32(customer.Id);

            if (!string.IsNullOrEmpty(tokenName) && !string.IsNullOrEmpty(tokenValue))
            {
                //fetch attribute metadata
                BrickStAPI.Connect.Attribute attrDef = brickst.GetCustomerAttribute(tokenName, out status, out statusMessage);
                if (status != HttpStatusCode.OK)
                {
                    Console.WriteLine("ERROR: STATUS:" + status.ToString() + " " + statusMessage);
                }

                string attrType = attrDef.Type;
                bool doupdate = false;

                CustomerAttribute attr = customer.GetChannelAddress(tokenName);

                if (string.Compare("attribute", attrType, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    if (attr == null)
                    {
                        attr = new CustomerAttribute();
                        attr.Name = attrDef.Name;
                        attr.Type = attrDef.Type;
                        attr.DataType = attrDef.DataType;
                        attr.Value = tokenValue;
                        customer.Attributes.Add(attr);
                        doupdate = true;
                    }
                    else
                    {
                        // update if new
                        if (!tokenValue.Equals(attr.Value))
                        {
                            attr.Value = tokenValue;
                            doupdate = true;
                        }
                    }
                }
                else if (string.Compare("preference", attrType, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    if (attr == null)
                    {
                        attr = new CustomerAttribute();
                        attr.Name = attrDef.Name;
                        attr.Type = attrDef.Type;
                        attr.DataType = attrDef.DataType;
                        // start with 1 value
                        attr.PreferenceValues = new String[1];
                        attr.PreferenceValues[0] = tokenValue;
                        customer.ChannelAddresses.Add(attr);
                        doupdate = true;
                    }
                    else
                    {
                        // existing preference record
                        // add the token value if it is not already there
                        // the push channel code will automatically remove invalid device tokens
                        String[] vals = attr.PreferenceValues;
                        bool valuefound = false;
                        for (int i = 0; i < vals.Length; i++)
                        {
                            String val = vals[i];
                            if (tokenValue.Equals(val))
                            {
                                valuefound = true;
                                break;
                            }
                        }

                        if (!valuefound)
                        {
                            String[] newVals = new String[vals.Length + 1];
                            Array.Copy(vals, 0, newVals, 0, vals.Length);
                            newVals[newVals.Length - 1] = tokenValue;
                            attr.PreferenceValues = newVals;
                            doupdate = true;
                        }
                    }
                }

                // save updated customer record if necessary
                if (doupdate)
                {
                    Customer custSave2 = brickst.UpdateCustomer(customer, out status, out statusMessage);
                    if (custSave2 == null)
                    {
                        throw new Exception("null customer received from updateCustomer");
                    }
                    customer = custSave2;
                }
            }

            //
            //create an event record
            //
            BrickStreetAPI.Connect.Event eventObj = new BrickStreetAPI.Connect.Event();
            eventObj.EventName = eventName;
            eventObj.CustomerId = custId;
            eventObj.Subscribe = true;
            eventObj.Parameters = new List<EventParameter>();

            DateTime now = new DateTime();

            //event parameter: Message
            EventParameter ep1 = new EventParameter();
            ep1.ParameterName = "Message";
            ep1.ParameterValue = "Test at " + now.ToString();
            ep1.Encrypted = false;
            eventObj.Parameters.Add(ep1);

            //event parameter:Badge
            EventParameter ep2 = new EventParameter();
            ep2.ParameterName = "Badge";
            ep2.ParameterValue = "42";
            ep2.Encrypted = false;
            eventObj.Parameters.Add(ep2);

            //event parameter: AlertID
            EventParameter ep3 = new EventParameter();
            ep3.ParameterName = "AlertID";
            ep3.ParameterValue = timecode;
            ep3.Encrypted = false;
            eventObj.Parameters.Add(ep3);

            //
            //submit event to connect
            //
            BrickStreetAPI.Connect.Event posted = brickst.AddEvent(eventObj, out status, out statusMessage);

            if (status != HttpStatusCode.OK)
            {
                Console.WriteLine("ERROR: STATUS:" + status.ToString() + " " + statusMessage);
                throw new Exception("addEvent returned null");
            }

            long eventQueueId = Convert.ToInt32(posted.Id);
            long eventId = Convert.ToInt32(posted.EventId);

            Console.WriteLine("Posted Event;ID=" + eventQueueId + " for CustomerID=" + custId + " and Event ID=" + eventId);
        }
        public void AddCustomerWithAttribute()
        {
            String attributeName = ConfigurationManager.AppSettings["AttrName"];//this will be probably fetched from app.config
            String attributeValue = ConfigurationManager.AppSettings["AttrValue"];
            HttpStatusCode status;
            string statusMessage;
            BrickStreetConnect brickStreetConnect = makeClient();
            var attrDef = brickStreetConnect.GetCustomerAttribute(attributeName, out status, out statusMessage);
            Assert.AreNotEqual(attrDef, "Attribute Not Found");

            //create new customer
            Random r = new Random();
            long val = r.Next();
            if (val < 0)
            {
                val *= -1;
            }

            String custVal = "cmaeda" + val + "@cmaeda.com";

            Customer c = new Customer();
            c.EmailAddress = custVal;
            c.AltCustomerId = custVal;
            c.AddressLine1 = "215 S Broadway 241";
            c.City = "Salem";
            c.State = "NH";
            c.Country = "USA";

            Customer c2 = brickStreetConnect.AddCustomer(c, out status, out statusMessage);
            if (status != HttpStatusCode.OK)
            {
                Console.WriteLine("ERROR: STATUS:" + status.ToString() + " " + statusMessage);
            }

            Assert.IsNotNull(c2);
            Assert.IsNotNull(c2.Id);
            Assert.AreEqual(c2.EmailAddress, custVal);
            Assert.AreEqual(c2.AltCustomerId, custVal);

            CustomerAttribute attr = c2.GetAttribute(attributeName);
            if (attr == null)
            {
                attr = new CustomerAttribute();
                attr.Name = attrDef.Name;
                attr.Type = attrDef.Type;
                attr.DataType = attrDef.DataType;
                attr.Value = attributeValue;

                c2.Attributes.Add(attr);
            }
            else
            {
                attr.Value = attributeValue;
            }

            Customer c3 = brickStreetConnect.UpdateCustomer(c2, out status, out statusMessage);
            if (status != HttpStatusCode.OK)
            {
                Console.WriteLine("ERROR: STATUS:" + status.ToString() + " " + statusMessage);
            }

            Assert.IsNotNull(c3, "Customer 3 is null");

            CustomerAttribute c3attr = c3.GetAttribute(attributeName);
            Assert.IsNotNull(c3attr);
            Assert.AreEqual(c3attr.Value, attributeValue);
        }