public static string SortearAmigosSecretos(AmigoSecretoContext db, bool IsTest)
        {
            var pessoas = GetPessoasForSorteio(db);

            AddAmigosPossiveisToPessoas(pessoas, db);

            SorteiaAmigoSecreto(pessoas);


            if (ExistPessoaSemAmigoSecreto(pessoas))
            {
                return("Não foi possível sortear amigo secreto para todas as pessoas!");
            }
            else
            {
                if (IsTest)
                {
                    AtualizaMensagemAmigoSorteado(pessoas, db);
                }
                else
                {
                    EnviaMensagensDeResultadoDoSorteio(pessoas, db);
                }
            }

            return("OK");
        }
        private static void AddAmigosPossiveisToPessoa(Pessoa pessoa, AmigoSecretoContext db)
        {
            if (pessoa == null)
            {
                return;
            }

            pessoa.AmigosPossiveis  = new List <AmigoPossivel>();
            pessoa.NAmigosPossiveis = 0;

            var amigos = db.Amigos.Where(a => a.ID != pessoa.Id).ToList();

            if (amigos == null)
            {
                return;
            }

            foreach (var amigo in amigos)
            {
                if (!ExistsImpedimentoParaAmigo(pessoa.Impedimentos, amigo))
                {
                    pessoa.AmigosPossiveis.Add(new AmigoPossivel {
                        Id = amigo.ID, Nome = amigo.Nome
                    });
                    pessoa.NAmigosPossiveis++;
                }
            }
        }
        private static void AtualizaMensagemAmigoSorteadoInPessoa(Pessoa pessoa, AmigoSecretoContext db)
        {
            if (pessoa == null || db == null)
            {
                return;
            }

            var amigo = db.Amigos.SingleOrDefault(a => a.ID == pessoa.Id);

            amigo.ResultadoUltimoEnvioSMS = "Amigo secreto sorteado em testes: " + (pessoa.AmigoSorteado == null? "" : pessoa.AmigoSorteado.Nome);
            db.Entry(amigo).State         = EntityState.Modified;
        }
        private static void AddAmigosPossiveisToPessoas(IList <Pessoa> pessoas, AmigoSecretoContext db)
        {
            if (pessoas == null)
            {
                return;
            }

            foreach (var pessoa in pessoas)
            {
                AddAmigosPossiveisToPessoa(pessoa, db);
            }
        }
        private static void AtualizaMensagemAmigoSorteado(IList <Pessoa> pessoas, AmigoSecretoContext db)
        {
            if (pessoas == null || db == null)
            {
                return;
            }

            foreach (var pessoa in pessoas)
            {
                AtualizaMensagemAmigoSorteadoInPessoa(pessoa, db);
            }

            db.SaveChanges();
        }
        private static void AtualizaSMSResultInPessoa(string smsResult, int amigoId, AmigoSecretoContext db)
        {
            if (amigoId <= 0)
            {
                return;
            }

            var amigo = db.Amigos.SingleOrDefault(a => a.ID == amigoId);

            if (amigo == null)
            {
                return;
            }

            amigo.UltimoEnvioSMS          = DateTime.Now;
            amigo.ResultadoUltimoEnvioSMS = smsResult;
            db.Entry(amigo).State         = EntityState.Modified;
        }
        private static IList <Pessoa> GetPessoasForSorteio(AmigoSecretoContext db)
        {
            var pessoas = new List <Pessoa>();

            if (db == null)
            {
                return(pessoas);
            }

            var amigos = db.Amigos.ToList();

            if (amigos == null)
            {
                return(pessoas);
            }

            foreach (var amigo in amigos)
            {
                pessoas.Add(GetPessoaFromAmigo(amigo));
            }

            return(pessoas);
        }
        public static void EnviaMensagensDeResultadoDoSorteio(IList <Pessoa> pessoas, AmigoSecretoContext db)
        {
            if (pessoas == null)
            {
                return;
            }

            string smsResult;

            foreach (var pessoa in pessoas)
            {
                if (pessoa.AmigoSorteado != null &&
                    pessoa.AmigoSorteado.Nome != null &&
                    pessoa.AmigoSorteado.Nome.Length > 0)
                {
                    smsResult = SMSService.SendSMS(pessoa.Telemovel, GetMensagemAmigoSecreto(pessoa));

                    AtualizaSMSResultInPessoa(smsResult, pessoa.Id, db);
                }
            }

            db.SaveChanges();
        }