private void btnDone_Click(object sender, RoutedEventArgs e)
 {
     var emailHelper = new RegexUtilities();
     if (!emailHelper.IsValidEmail(txtFrom.Text))
     {
         MessageBox.Show("That is an invalid from email address!");
         return;
     }
     if (!string.IsNullOrWhiteSpace(txtDiagnostic.Text) && !emailHelper.IsValidEmail(txtDiagnostic.Text))
     {
         MessageBox.Show("That is an invalid diagnostic email address!");
         return;
     }
     Close();
 }
        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            var emailHelper = new RegexUtilities();
            if (!emailHelper.IsValidEmail(txtEmail.Text))
            {
                MessageBox.Show("That is an invalid email address!");
                return;
            }

            if (addClicked)
            {
                if (!santaSack.Participants.Any(participant => participant.EmailAddress.ToLower() == txtEmail.Text.ToLower()))
                {
                    var participant = new Participant { Name = txtName.Text, EmailAddress = txtEmail.Text };
                    santaSack.Participants.Add(participant);
                }
                else
                {
                    MessageBox.Show("Someone with this address exists already!");
                    return;
                }
            }
            else
            {
                if (!santaSack.Participants.Any(participant => participant != selectedParticipant && participant.EmailAddress.ToLower() == txtEmail.Text.ToLower()))
                {
                    selectedParticipant.EmailAddress = txtEmail.Text;
                    selectedParticipant.Name = txtName.Text;
                    selectedParticipant = null;
                }
                else
                {
                    MessageBox.Show("Someone with this address exists already!");
                    return;
                }
            }

            btnSendDetails.IsEnabled = true;
            btnAdd.IsEnabled = true;
            btnEdit.IsEnabled = true;
            btnRemove.IsEnabled = true;
            btnGo.IsEnabled = true;
            btnExport.IsEnabled = true;
            btnImport.IsEnabled = true;
            lstParticipants.IsEnabled = true;
            btnSave.IsEnabled = false;
            btnCancel.IsEnabled = false;
            txtEmail.IsEnabled = false;
            txtName.IsEnabled = false;
            txtEmail.Text = "";
            txtName.Text = "";

            lstParticipants.ItemsSource = null;
            lstParticipants.ItemsSource = from participant in santaSack.Participants select participant.DisplayValue();
            SantaSackSerializer.Serialize(santaSack);
        }
        private void btnGo_Click(object sender, RoutedEventArgs e)
        {
            SantaSackSerializer.Serialize(santaSack);

            if (santaSack.Participants.Count < 3)
            {
                MessageBox.Show("You Haven't Got Enough People!");
                return;
            }

            if (string.IsNullOrWhiteSpace(santaSack.Template.FromAddress))
            {
                MessageBox.Show("You Haven't Entered A From Address!");
                return;
            }

            if (string.IsNullOrWhiteSpace(santaSack.Template.Content))
            {
                MessageBox.Show("You Haven't Got Any Email Content!");
                return;
            }

            if (string.IsNullOrWhiteSpace(santaSack.Template.Subject))
            {
                MessageBox.Show("You Haven't Got An Email Subject!");
                return;
            }

            if (string.IsNullOrWhiteSpace(santaSack.Template.Host) || string.IsNullOrWhiteSpace(santaSack.Template.Port))
            {
                MessageBox.Show("You Haven't Got A Host Or Port For Sending!");
                return;
            }

            var emailHelper = new RegexUtilities();
            if (!emailHelper.IsValidEmail(santaSack.Template.FromAddress))
            {
                MessageBox.Show("You Haven't Entered A Valid From Address!");
                return;
            }

            foreach (var participant in santaSack.Participants)
            {
                if (!emailHelper.IsValidEmail(participant.EmailAddress))
                {
                    MessageBox.Show(participant.Name + " Does Not Have A Valid Email Address!");
                    return;
                }
            }

            var rsltMessageBox = MessageBox.Show("Are You Sure You Want To Send Now?", "Are You Sure?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (rsltMessageBox == System.Windows.Forms.DialogResult.No)
            {
                MessageBox.Show("Sending Cancelled!");
                return;
            }

            var participantsToPair = (from p in santaSack.Participants select p).ToList();
            var participantsToAssign = (from p in santaSack.Participants select p).ToList();
            var participantsToSend = new List<PairedParticipant>();
            var randomGenerator = new Random((int)DateTime.UtcNow.Ticks);

            while (participantsToPair.Count > 0)
            {
                if (participantsToAssign.Count == 1 && participantsToPair.Count == 1 && participantsToAssign.First().EmailAddress == participantsToPair.First().EmailAddress)
                {
                    participantsToPair = (from p in santaSack.Participants select p).ToList();
                    participantsToAssign = (from p in santaSack.Participants select p).ToList();
                    participantsToSend = new List<PairedParticipant>();
                }

                Participant pairParticipant = null;
                var assignIndex = randomGenerator.Next(0, participantsToAssign.Count);
                var assignParticipant = participantsToAssign[assignIndex];
                participantsToAssign.Remove(assignParticipant);
                var participantPairing = new PairedParticipant()
                                             {
                                                 EmailAddress = assignParticipant.EmailAddress,
                                                 Name = assignParticipant.Name
                                             };

                while (pairParticipant == null)
                {
                    var pairIndex = randomGenerator.Next(0, participantsToPair.Count);
                    pairParticipant = participantsToPair[pairIndex];
                    if (assignParticipant.EmailAddress == pairParticipant.EmailAddress)
                    {
                        pairParticipant = null;
                    }
                    else
                    {
                        participantsToPair.Remove(pairParticipant);
                        participantPairing.PairedWith = pairParticipant;
                        participantsToSend.Add(participantPairing);
                    }
                }

                var alreadyPaired =
                    participantsToSend.FirstOrDefault(p => p.PairedWith.EmailAddress == participantPairing.EmailAddress);
                if (alreadyPaired != null)
                {
                    if (alreadyPaired.EmailAddress == participantPairing.PairedWith.EmailAddress)
                    {
                        participantsToPair = (from p in santaSack.Participants select p).ToList();
                        participantsToAssign = (from p in santaSack.Participants select p).ToList();
                        participantsToSend = new List<PairedParticipant>();
                    }
                }

            }

            while (participantsToSend.Any(x => x.Sent == false))
            {
                if (participantsToSend.Any(x => x.SendAttempts > 5))
                {
                    foreach (var tooManyAttemptParticipant in participantsToSend.Where(x => x.SendAttempts > 5))
                    {
                        MessageBox.Show(
                            string.Format("Couldn't Send Email To {0}, They Drew {1}",
                                          tooManyAttemptParticipant.EmailAddress,
                                          tooManyAttemptParticipant.PairedWith.EmailAddress), "Couldn't Send",
                            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }

                foreach (var pairedParticipant in participantsToSend.Where(x => x.Sent == false))
                {
                    var message = new MailMessage();
                    message.From = new MailAddress(santaSack.Template.FromAddress);
                    message.To.Add(!string.IsNullOrWhiteSpace(santaSack.Template.DiagnosticDeliveryAddress)
                                       ? new MailAddress(santaSack.Template.DiagnosticDeliveryAddress)
                                       : new MailAddress(pairedParticipant.EmailAddress));

                    // send to a bcc if no diagnostic delivery is set
                    if (!string.IsNullOrWhiteSpace(santaSack.Template.BlindCarbonCopy)
                        && string.IsNullOrWhiteSpace(santaSack.Template.DiagnosticDeliveryAddress))
                    {
                        message.Bcc.Add(new MailAddress(santaSack.Template.BlindCarbonCopy));
                    }

                    message.BodyEncoding = Encoding.UTF8;
                    message.Subject = santaSack.Template.Subject;
                    message.Body = santaSack.Template.Content
                        .Replace("{{GiftFromName}}", pairedParticipant.Name)
                        .Replace("{{GiftFromEmail}}", pairedParticipant.EmailAddress)
                        .Replace("{{GiftForName}}", pairedParticipant.PairedWith.Name)
                        .Replace("{{GiftForEmail}}", pairedParticipant.PairedWith.EmailAddress);
                    var client = new SmtpClient { EnableSsl = santaSack.Template.EnableSsl };

                    if (!string.IsNullOrWhiteSpace(santaSack.Template.FromPassword))
                    {
                        client.UseDefaultCredentials = false;
                        client.Credentials = new NetworkCredential(santaSack.Template.FromAddress, santaSack.Template.FromPassword);
                        client.DeliveryMethod = SmtpDeliveryMethod.Network;
                        message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
                    }

                    client.Host = santaSack.Template.Host;

                    int port;
                    if (!int.TryParse(santaSack.Template.Port, out port))
                    {
                        port = 25;
                    }
                    client.Port = port;
                    try
                    {
                        client.Send(message);
                        pairedParticipant.Sent = true;
                    }
                    catch (Exception)
                    {
                        pairedParticipant.Sent = false;
                        pairedParticipant.SendAttempts++;
                    }
                }
            }

            MessageBox.Show("All Emails Have Been Sent!");
        }