private void btnUpdate_Click(object sender, RoutedEventArgs e)
        {
            ServerCommandProxy serverProxy = null;
            OperationTypeEnum  operation   = OperationTypeEnum.Update;

            txtblockOutput.Inlines.Clear();

            try
            {
                ValidationResult result = ValidateInput(operation);

                if (result.IsValid)
                {
                    string ppcHostname = txtboxPpcServer.Text;
                    string ppcAdminPw  = pwdboxPpcAdminPw.Password;

                    serverProxy = new ServerCommandProxy(ppcHostname, 9191, ppcAdminPw);

                    if (PaperCutProxyWrapper.IsConnectionEstablished(serverProxy))
                    {
                        txtblockOutput.Inlines.Add(Constants.PaperCut.Messages.PaperCutConnectionEstablished);

                        int totalUsers = serverProxy.GetTotalUsers();

                        Console.WriteLine(string.Format(Constants.PaperCut.Messages.NumberOfUsersRetrievedFromPaperCut, totalUsers));
                        Console.WriteLine(Constants.ConsoleSpacing.HashesWithNewLine);

                        PaperCutHelper paperCutHelper = new PaperCutHelper(serverProxy);

                        if (paperCutHelper != null)
                        {
                            int  targetIdField     = cmboxTargetIDField.SelectedIndex;
                            int  numberOfChars     = int.Parse(txtboxIDLength.Text.ToString());
                            bool updateOnlyIfBlank = chckboxUpdateIfBlank.IsChecked.Value;

                            bool mustTargetSpecificUsername = chckboxTargetSpecificUser.IsChecked.Value;

                            if (mustTargetSpecificUsername)
                            {
                                string specificUsername = txtboxTargetSpecificUser.Text;

                                paperCutHelper.UpdateSingleCardNumber(updateOnlyIfBlank, targetIdField, specificUsername, numberOfChars);
                            }
                            else
                            {
                                paperCutHelper.UpdateAllCardNumbers(updateOnlyIfBlank, targetIdField, numberOfChars);
                            }
                        }
                    }
                    else
                    {
                        txtblockOutput.Inlines.Add(Constants.PaperCut.Messages.PaperCutConnectionNotEstablished);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        /// <summary>
        /// Updates a single users card number.
        /// </summary>
        /// <param name="updateOnlyIfBlank"></param>
        /// <param name="targetIdField"></param>
        /// <param name="targetUsername"></param>
        /// <param name="numberOfChars"></param>
        public void UpdateSingleCardNumber(bool updateOnlyIfBlank, int targetIdField, string targetUsername, int numberOfChars)
        {
            try
            {
                if (!string.IsNullOrEmpty(targetUsername) &&
                    numberOfChars >= Common.Constants.PaperCut.Constants.MinimumNumberOfCharacters &&
                    numberOfChars <= Common.Constants.PaperCut.Constants.MaximumNumberOfCharacters)
                {
                    string newCardNumber = SecurityStringHelper.GenerateIdentifier(numberOfChars);

                    if (!string.IsNullOrEmpty(newCardNumber))
                    {
                        if (updateOnlyIfBlank)
                        {
                            string existingCardNumber = PaperCutProxyWrapper.GetCardNumber(_serverProxy, targetUsername, targetIdField);

                            if (string.IsNullOrEmpty(existingCardNumber))
                            {
                                PaperCutProxyWrapper.SetCardNumber(_serverProxy, targetUsername, newCardNumber, targetIdField);
                                Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.UpdatedUserWithNewCardNumber,
                                                                targetUsername, newCardNumber));
                                Console.WriteLine(Common.Constants.ConsoleSpacing.HashesWithNewLine);
                            }
                            else
                            {
                                Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.CannotUpdateUserDueToExistingCardNumber,
                                                                targetUsername, existingCardNumber));
                                Console.WriteLine(Common.Constants.ConsoleSpacing.HashesWithNewLine);
                            }
                        }
                        else
                        {
                            PaperCutProxyWrapper.SetCardNumber(_serverProxy, targetUsername, newCardNumber, targetIdField);
                            Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.UpdatedUserWithNewCardNumber,
                                                            targetUsername, newCardNumber));
                            Console.WriteLine(Common.Constants.ConsoleSpacing.HashesWithNewLine);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
        }
        /// <summary>
        /// Sends an email notification
        /// with the card number to a single user.
        /// </summary>
        /// <param name="smtpHostname"></param>
        /// <param name="targetUsername"></param>
        /// <param name="senderAddress"></param>
        /// <param name="targetIdField"></param>
        public void SendSingleEmail(string smtpHostname, string targetUsername, string senderAddress, int targetIdField)
        {
            string resolvedIdField = PaperCutProxyWrapper.ResolveCardField(targetIdField);
            string targetEmail     = _serverProxy.GetUserProperty(targetUsername, Common.Constants.PaperCut.Properties.Email);
            string retrievedId     = _serverProxy.GetUserProperty(targetUsername, resolvedIdField);

            try
            {
                SmtpClient smtpClient = new SmtpClient();
                smtpClient.Host                  = smtpHostname;
                smtpClient.Port                  = 25;
                smtpClient.DeliveryMethod        = SmtpDeliveryMethod.Network;
                smtpClient.UseDefaultCredentials = false;

                SendEmail(smtpClient, senderAddress, targetEmail, retrievedId);
            }
            catch (Exception)
            {
                Console.WriteLine(Common.Constants.Smtp.Email.UnableToSend);
            }
        }
        /// <summary>
        /// Sends an email notification
        /// with the card number to all users.
        /// </summary>
        /// <param name="smtpHostname"></param>
        /// <param name="senderAddress"></param>
        /// <param name="targetIdField"></param>
        public void SendEmailsToAllUsers(string smtpHostname, string senderAddress, int targetIdField)
        {
            try
            {
                if (!string.IsNullOrEmpty(smtpHostname) && !string.IsNullOrEmpty(senderAddress))
                {
                    string   resolvedIdField = PaperCutProxyWrapper.ResolveCardField(targetIdField);
                    string[] usernames       = PaperCutProxyWrapper.GetUserAccounts(_serverProxy);

                    List <string> emails    = null;
                    List <string> idNumbers = null;

                    for (int i = 0; i < usernames.Length; i++)
                    {
                        string[] retrievedProperties = _serverProxy.GetUserProperties(usernames[i],
                                                                                      new string[] { Common.Constants.PaperCut.Properties.Email, resolvedIdField });

                        emails.Add(retrievedProperties[0]);
                        idNumbers.Add(retrievedProperties[1]);
                    }

                    SmtpClient smtpClient = new SmtpClient();
                    smtpClient.Host                  = smtpHostname;
                    smtpClient.Port                  = 25;
                    smtpClient.DeliveryMethod        = SmtpDeliveryMethod.Network;
                    smtpClient.UseDefaultCredentials = false;

                    for (int i = 0; i < usernames.Length; i++)
                    {
                        SendEmail(smtpClient, senderAddress, emails[i], idNumbers[i]);
                    }
                }
            }
            catch
            {
                Console.WriteLine(Common.Constants.Smtp.Email.UnableToSend);
            }
        }
        private void btnClearDept_Click(object sender, RoutedEventArgs e)
        {
            ServerCommandProxy serverProxy;
            OperationTypeEnum  operation = OperationTypeEnum.ClearDepartment;

            txtblockOutput.Inlines.Clear();

            try
            {
                ValidationResult result = ValidateInput(operation);

                if (result.IsValid)
                {
                    string ppcHostname = txtboxPpcServer.Text;
                    string ppcAdminPw  = pwdboxPpcAdminPw.Password;

                    serverProxy = new ServerCommandProxy(ppcHostname, 9191, ppcAdminPw);

                    if (PaperCutProxyWrapper.IsConnectionEstablished(serverProxy))
                    {
                        txtblockOutput.Inlines.Add(Constants.PaperCut.Messages.PaperCutConnectionEstablished);

                        int targetDeptField = cmboxTargetDeptField.SelectedIndex;

                        PaperCutProxyWrapper.ClearUsersDepartmentInfo(serverProxy, targetDeptField);
                    }
                    else
                    {
                        txtblockOutput.Inlines.Add(Constants.PaperCut.Messages.PaperCutConnectionNotEstablished);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        private void btnSendEmail_Click(object sender, RoutedEventArgs e)
        {
            ServerCommandProxy serverProxy = null;
            OperationTypeEnum  operation   = OperationTypeEnum.SendEmail;

            txtblockOutput.Inlines.Clear();

            try
            {
                ValidationResult result = ValidateInput(operation);

                if (result.IsValid)
                {
                    string ppcHostname = txtboxPpcServer.Text;
                    string ppcAdminPw  = pwdboxPpcAdminPw.Password;

                    serverProxy = new ServerCommandProxy(ppcHostname, 9191, ppcAdminPw);

                    if (PaperCutProxyWrapper.IsConnectionEstablished(serverProxy))
                    {
                        txtblockOutput.Inlines.Add(Constants.PaperCut.Messages.PaperCutConnectionEstablished);

                        int totalUsers = serverProxy.GetTotalUsers();

                        Console.WriteLine(string.Format(Constants.PaperCut.Messages.NumberOfUsersRetrievedFromPaperCut, totalUsers));
                        Console.WriteLine(Constants.ConsoleSpacing.HashesWithNewLine);

                        PaperCutHelper paperCutHelper = new PaperCutHelper(serverProxy);

                        if (paperCutHelper != null)
                        {
                            int    targetIdField = cmboxTargetIDField.SelectedIndex;
                            string smtpHostname  = txtboxSmtpServer.Text;
                            string senderAddress = txtboxSenderAddress.Text;

                            bool mustTargetSpecificUsername = chckboxTargetSpecificUser.IsChecked.Value;

                            if (mustTargetSpecificUsername)
                            {
                                string specificUsername = txtboxTargetSpecificUser.Text;

                                paperCutHelper.SendSingleEmail(smtpHostname, specificUsername, senderAddress, targetIdField);

                                Console.WriteLine(string.Format(Constants.Smtp.Messages.NotificationEmailSentToSingleUser, specificUsername));
                                Console.WriteLine(Constants.ConsoleSpacing.HashesWithNewLine);
                            }
                            else
                            {
                                paperCutHelper.SendEmailsToAllUsers(smtpHostname, senderAddress, targetIdField);

                                Console.WriteLine(string.Format(Constants.Smtp.Messages.NotificationEmailsSentToMultipleUsers, totalUsers));
                                Console.WriteLine(Constants.ConsoleSpacing.HashesWithNewLine);
                            }
                        }
                    }
                    else
                    {
                        txtblockOutput.Inlines.Add(Constants.PaperCut.Messages.PaperCutConnectionNotEstablished);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(Constants.Smtp.Messages.UnableToSendEmail);
            }
        }
        private void btnSyncDept_Click(object sender, RoutedEventArgs e)
        {
            ServerCommandProxy serverProxy;
            OperationTypeEnum  operation = OperationTypeEnum.SyncDepartment;

            txtblockOutput.Inlines.Clear();

            try
            {
                ValidationResult result = ValidateInput(operation);

                if (result.IsValid)
                {
                    string ppcHostname = txtboxPpcServer.Text;
                    string ppcAdminPw  = pwdboxPpcAdminPw.Password;

                    serverProxy = new ServerCommandProxy(ppcHostname, 9191, ppcAdminPw);

                    if (PaperCutProxyWrapper.IsConnectionEstablished(serverProxy))
                    {
                        txtblockOutput.Inlines.Add(Constants.PaperCut.Messages.PaperCutConnectionEstablished);

                        string domainName    = txtboxDomainName.Text;
                        string ldapRoot      = txtboxLdapRoot.Text;
                        string domainUser    = txtboxDomainUser.Text;
                        string domainUserPwd = pwdboxDomainUserPwd.Password;

                        LdapHelper ldapHelper = new LdapHelper(domainName, ldapRoot, domainUser, domainUserPwd);

                        if (ldapHelper.IsConnectionEstablished(domainUser))
                        {
                            txtblockOutput.Inlines.Add(Constants.Ldap.Messages.LdapConnectionEstablished);

                            PaperCutUser[] ppcUsers = PaperCutProxyWrapper.GetUsersDepartmentInfo(serverProxy);

                            int    targetDeptField         = cmboxTargetDeptField.SelectedIndex;
                            string departmentNameADField   = txtboxDeptNameADField.Text;
                            string departmentNumberADField = txtboxDeptNumberADField.Text;

                            bool areBothAdFieldsEntered = !string.IsNullOrEmpty(departmentNameADField) &&
                                                          !string.IsNullOrEmpty(departmentNumberADField);

                            if (areBothAdFieldsEntered)
                            {
                                LdapUser[] ldapUsers = ldapHelper.RetrieveDepartmentInformation(ppcUsers, departmentNameADField, departmentNumberADField);
                                PaperCutProxyWrapper.SetUsersMultipleDepartmentInfo(serverProxy, ldapUsers, targetDeptField);
                            }
                            else
                            {
                                LdapUser[] ldapUsers = ldapHelper.RetrieveDepartmentInformation(ppcUsers, string.IsNullOrEmpty(departmentNameADField) ?
                                                                                                departmentNumberADField : departmentNameADField);
                                PaperCutProxyWrapper.SetUsersSingleDepartmentInfo(serverProxy, ldapUsers, targetDeptField);
                            }
                        }
                        else
                        {
                            txtblockOutput.Inlines.Add(Constants.Ldap.Messages.LdapConnectionNotEstablished);
                        }
                    }
                    else
                    {
                        txtblockOutput.Inlines.Add(Constants.PaperCut.Messages.PaperCutConnectionNotEstablished);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        /// <summary>
        /// Updates the card numbers for all users.
        /// </summary>
        /// <param name="updateOnlyIfBlank"></param>
        /// <param name="targetIdField"></param>
        /// <param name="numberOfChars"></param>
        public void UpdateAllCardNumbers(bool updateOnlyIfBlank, int targetIdField, int numberOfChars)
        {
            try
            {
                if (numberOfChars >= Common.Constants.PaperCut.Constants.MinimumNumberOfCharacters &&
                    numberOfChars <= Common.Constants.PaperCut.Constants.MaximumNumberOfCharacters)
                {
                    string[] existingUsers  = PaperCutProxyWrapper.GetUserAccounts(_serverProxy);
                    string[] newCardNumbers = new string[existingUsers.Length];
                    newCardNumbers = SecurityStringHelper.GenerateIdentifiers(numberOfChars, newCardNumbers.Length).ToArray();

                    if (updateOnlyIfBlank)
                    {
                        int      updatedCount = 0;
                        int      skippedCount = 0;
                        string[] existingCardNumbers;

                        existingCardNumbers = PaperCutProxyWrapper.GetCardNumbers(_serverProxy, existingUsers, targetIdField);

                        Console.WriteLine(Common.Constants.PaperCut.Messages.UpdatingOnlyUsersWithBlankCardNumbers);
                        Console.WriteLine(Common.Constants.ConsoleSpacing.HashesWithNewLine);

                        for (int i = 0; i < existingUsers.Length; i++)
                        {
                            if (string.IsNullOrEmpty(existingCardNumbers[i]))
                            {
                                PaperCutProxyWrapper.SetCardNumber(_serverProxy, existingUsers[i], newCardNumbers[i], targetIdField);

                                updatedCount++;

                                if (updatedCount > 0 && updatedCount % 100 == 0)
                                {
                                    Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.UpdatedNUsersSoFar, updatedCount));
                                }
                            }
                            else
                            {
                                skippedCount++;

                                if (skippedCount > 0 && skippedCount % 100 == 0)
                                {
                                    Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.SkippedNUsersSoFar, skippedCount));
                                }
                            }
                        }

                        Console.WriteLine();
                        Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.UpdatedAndSkippedNUsers, updatedCount, skippedCount));
                        Console.WriteLine(Common.Constants.ConsoleSpacing.Hashes);
                    }
                    else
                    {
                        PaperCutProxyWrapper.SetCardNumbers(_serverProxy, existingUsers, newCardNumbers, targetIdField);

                        Console.WriteLine();
                        Console.WriteLine(string.Format(Common.Constants.PaperCut.Messages.UpdatedNUsers, existingUsers.Length));
                        Console.WriteLine(Common.Constants.ConsoleSpacing.HashesWithNewLine);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
        }