public EmailExport(Uri APIUrl)
 {
     try
     {
         EndpointAddress endpoint = new EndpointAddress(APIUrl.ToString() + WSDL_LOCATION);
         client = new InvitationManagementServiceClient("BasicHttpBinding_IInvitationManagementService", endpoint);
     }
     catch (Exception e)
     {
         Console.WriteLine("Invalid URL");
     }
 }
        /// <summary>
        /// Add a user to an email list panel's access list with the specified permissions.  If the user is already
        /// on the access list, the user's permissions will be updated to match the passed-in permissions.
        /// </summary>
        /// <param name="authenticationToken">Authentication ticket identifying calling user.</param>
        /// <param name="emailListId">ID of the email list panel.</param>
        /// <param name="uniqueIdentifier">Unique identifier of the user to add to the access list.</param>
        /// <param name="permissions">Permissions to set on the access list for the user.</param>
        private static bool AddUserToEmailListPanelAccessList(string authenticationToken, int emailListId, string uniqueIdentifier, string[] permissions)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.AddUserToEmailListPanelAccessList(authenticationToken, emailListId, uniqueIdentifier, permissions);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return false;
            }

            return true;
        }
        /// <summary>
        /// Add the specified email addresses to an email list panel.
        /// </summary>
        /// <param name="authenticationToken"></param>
        /// <param name="emailListId">ID of the panel to add addresses to</param>
        /// <param name="emailAddresses">Addresses to add to the panel.</param>
        private static bool AddEmailAddressesToEmailListPanel(string authenticationToken, int emailListId, string[] emailAddresses)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.AddEmailAddressesToEmailListPanel(authenticationToken, emailListId, emailAddresses);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return false;
            }

            return true;
        }
        /// <summary>
        /// Create a new email list.
        /// </summary>
        /// <param name="authenticationToken"></param>
        /// <param name="id"></param>
        /// <param name="languageCode"></param>
        /// <returns></returns>
        private static int CopyEmailListPanel(string authenticationToken, int id, string languageCode = "en-US")
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.CopyEmailListPanel(authenticationToken, id, languageCode);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return -1;
            }

            return result.ResultData;
        }
        /// <summary>
        /// Retrieve the authentication token required to make web service requests.
        /// </summary>
        /// <param name="username">The name of the user to authenticate.</param>
        /// <param name="password">The user's password.</param>
        /// <returns></returns>
        private static string AuthenticateUser(string username, string password)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.AuthenticateUser(username, password);

            return result.ResultData;
        }
        /// <summary>
        /// Set the default policy permissions for an email list panel.
        /// </summary>
        /// <param name="authenticationToken">Authentication ticket identifying calling user.</param>
        /// <param name="emailListId">ID of the email list panel to set default policy permissions for.</param>
        /// <param name="permissions">Permissions to set on the default policy.</param>
        private static bool SetEmailListPanelDefaultPolicyPermissions(string authenticationToken, int emailListId, string[] permissions)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.SetEmailListPanelDefaultPolicyPermissions(authenticationToken, emailListId, permissions);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return false;
            }

            return true;
        }
        /// <summary>
        /// Remove a user group from an email list panel's access list.
        /// </summary>
        /// <param name="authenticationToken">Authentication ticket identifying calling user.</param>
        /// <param name="emailListId">ID of the email list panel.</param>
        /// <param name="userGroupId">ID of the user group to remove a user from.</param>
        private static bool RemoveGroupFromEmailListPanelAccessList(string authenticationToken, int emailListId, int userGroupId)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.RemoveGroupFromEmailListPanelAccessList(authenticationToken, emailListId, userGroupId);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return false;
            }

            return true;
        }
        /// <summary>
        /// Get a list of email
        /// </summary>
        /// <param name="authenticationToken"></param>
        /// <param name="permission">Permission to check for on the email lists.</param>
        /// <param name="pageNumber"></param>
        /// <param name="pageSize"></param>
        /// <param name="sortField"></param>
        /// <param name="sortAscending"></param>
        /// <param name="filterField"></param>
        /// <param name="filterValue"></param>
        /// <returns>List of email list panel info objects for the panels.</returns>
        private static IEnumerable<EmailListPanelData> ListEmailPanels(string authenticationToken, 
                                                            string permission,
                                                            int pageNumber = 0,
                                                            int pageSize = 0,
                                                            string sortField = "",
                                                            bool sortAscending = true,
                                                            string filterField = "",
                                                            string filterValue = "")
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.ListEmailPanels(authenticationToken, permission, pageNumber, pageSize, sortField, sortAscending, filterField, filterValue);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return null;
            }

            return result.ResultData.ResultPage;
        }
        /// <summary>
        /// Get a list of permissions set on the default policy of an email list panel.
        /// </summary>
        /// <param name="authenticationToken">Authentication ticket identifying calling user.</param>
        /// <param name="emailListId">ID of the email list panel to get the default policy permissions for.</param>
        /// <returns>List of permissions on the email list panel's default policy.</returns>
        private static string[] ListEmailListPanelDefaultPolicyPermissions(string authenticationToken, int emailListId)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.ListEmailListPanelDefaultPolicyPermissions(authenticationToken, emailListId);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return null;
            }

            return result.ResultData;
        }
        /// <summary>
        /// List the email addresses contained in an email list panel.
        /// </summary>
        /// <param name="authenticationToken">Authentication ticket identifying calling user.</param>
        /// <param name="emailListId">ID of the email list panel.</param>
        /// <returns>List of email addresses in the panel.</returns>
        private static IEnumerable<string> ListEmailListPanelAddresses(string authenticationToken, int emailListId)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.ListEmailListPanelAddresses(authenticationToken, emailListId, -1, -1);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return null;
            }

            return result.ResultData.ResultPage;
        }
        /// <summary>
        /// List the ACL permissions that a given user has on an email list panel.
        /// </summary>
        /// <param name="authenticationToken">Authentication ticket identifying calling user.</param>
        /// <param name="emailListId">ID of the email list panel.</param>
        /// <param name="uniqueIdentifier">Unique identifier of the user get the permissions list for.</param>
        private static IEnumerable<string> ListEmailListPanelAccessListPermissionsForUser(string authenticationToken, int emailListId, string uniqueIdentifier)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.ListEmailListPanelAccessListPermissionsForUser(authenticationToken, emailListId, uniqueIdentifier);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return null;
            }

            return result.ResultData;
        }
        /// <summary>
        /// Get a lightweight information object for the specified email list panel.
        /// </summary>
        /// <param name="authenticationToken">Authentication ticket identifying calling user.</param>
        /// <param name="id">ID of the email list panel to get.</param>
        private static EmailListPanelData GetEmailListPanelInfo(string authenticationToken, int id)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.GetEmailListPanelInfo(authenticationToken, id);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return null;
            }

            return result.ResultData;
        }
        /// <summary>
        /// Create a new email list.
        /// </summary>
        /// <param name="authenticationToken"></param>
        /// <param name="name">The name of the email list.</param>
        /// <param name="description">The new email list's description.</param>
        /// <returns></returns>
        private static int CreateEmailList(string authenticationToken, string name, string description)
        {
            var proxy = new InvitationManagementServiceClient();
            var result = proxy.CreateEmailListPanel(authenticationToken, name, description);

            // Handle exceptions
            if (!result.CallSuccess)
            {
                Console.WriteLine(result.FailureMessage);
                return -1;
            }

            return result.ResultData.DatabaseId;
        }