/// <summary>
        /// Implementación de Contrato para obtener datos de un jugador
        /// </summary>
        /// <param name="actualPlayer"></param>
        public void GetActualPlayer(Jugador actualPlayer)
        {
            DataObtainedResult dataObtainedResult = DataObtainedResult.ErrorObtainingData;

            DataAccess.Jugador searchedPlayer = jugadorDataManager.GetPlayerByNickname(actualPlayer.Apodo);

            if (searchedPlayer != null)
            {
                Dominio.Jugador domainSearchedPlayer = new Dominio.Jugador
                {
                    IdJugador            = searchedPlayer.idJugador,
                    Apodo                = searchedPlayer.apodo,
                    CorreoElectronico    = searchedPlayer.correoElectronico,
                    Status               = searchedPlayer.status,
                    PreguntaRecuperacion = searchedPlayer.preguntaRecuperacion,
                    IdLenguaje           = searchedPlayer.idioma
                };
                dataObtainedResult = DataObtainedResult.DataObtained;
                PlayerCallback.SendActualPlayer(dataObtainedResult, domainSearchedPlayer);
            }
            else
            {
                Dominio.Jugador emptyPlayer = new Jugador();
                PlayerCallback.SendActualPlayer(dataObtainedResult, emptyPlayer);
            }
        }
        /// <summary>
        /// Implementación de Contrato para verificar un jugador antes de ser otorgado acceso al sistema
        /// </summary>
        /// <param name="player"></param>
        public void VerifyPlayer(Dominio.Jugador player)
        {
            VerificationResult resultado = VerificationResult.NoExisteJugador;

            JugadorDataManager jugadorManager = new JugadorDataManager();

            if (jugadorManager.CheckNickname(player.Apodo))
            {
                if (jugadorManager.PinCorrecto(player.Apodo, player.PinConfirmacion))
                {
                    int result = jugadorManager.VerifyNewPlayer(new DataAccess.Jugador
                    {
                        apodo           = player.Apodo,
                        pinConfirmacion = player.PinConfirmacion,
                    });

                    if (result > 0)
                    {
                        resultado = VerificationResult.VerificacionExistosa;
                    }
                }
                else
                {
                    resultado = VerificationResult.PinIncorrecto;
                }
            }
            else
            {
                resultado = VerificationResult.NoExisteJugador;
            }

            PlayerCallback.GetVerifyResult(resultado);
        }
        /// <summary>
        /// Implementación de Contrato para guardar un jugador registrado a la base de datos
        /// </summary>
        /// <param name="player"></param>
        /// <exception>
        /// Este metodo puede retornar una excepcion tipo SmtpException
        /// </exception>
        public void SavePlayer(Dominio.Jugador player)
        {
            JugadorDataManager playerDataManager = new JugadorDataManager();

            SaveResult saveResult;
            MailResult mailResult;

            bool nicknameExists = playerDataManager.CheckNickname(player.Apodo);

            if (!nicknameExists)
            {
                bool emailExists = playerDataManager.CheckEmail(player.CorreoElectronico);

                if (!emailExists)
                {
                    System.Net.Mail.MailMessage mensaje = new System.Net.Mail.MailMessage();

                    mensaje.To.Add(player.CorreoElectronico);
                    mensaje.Subject = "Account creation confirmation" + player.Apodo;
                    mensaje.Body    = "Hello " + player.Apodo + " you are one step away from verifying your account!, " +
                                      "the account verification code is as follows: " + player.PinConfirmacion;
                    mensaje.From = new System.Net.Mail.MailAddress("*****@*****.**", "Checkers Game Proyect");

                    System.Net.Mail.SmtpClient cliente = new System.Net.Mail.SmtpClient
                    {
                        Credentials = new System.Net.NetworkCredential(mailUser, mailPassword),
                        Port        = 587,
                        EnableSsl   = true,
                        Host        = "smtp.gmail.com",
                    };
                    try
                    {
                        mailResult = MailResult.MailSend;
                        cliente.Send(mensaje);
                    }
                    catch (System.Net.Mail.SmtpException)
                    {
                        mailResult = MailResult.SendError;
                        PlayerCallback.GetResendMailResult(mailResult, player.Apodo);
                    }
                    if (mailResult == MailResult.MailSend)
                    {
                        SaveNewPlayer(player);
                    }
                }
                else
                {
                    saveResult = SaveResult.CorreoExistente;
                    PlayerCallback.GetSaveResult(saveResult, player);
                }
            }
            else
            {
                saveResult = SaveResult.NicknameExistente;
                PlayerCallback.GetSaveResult(saveResult, player);
            }
        }
        /// <summary>
        /// Actualiza el ranking de los dos jugadores que participan en una <c>Partida</c> de un juego de checkers
        /// </summary>
        /// <param name="playerOne"></param>
        /// <param name="playerOneCheckers"></param>
        /// <param name="playerTwo"></param>
        /// <param name="playerTwoCheckers"></param>
        /// <param name="playerNumberWinner"></param>
        /// <exception>
        /// Esta excepcion puede retornar una excepcion tipo DBUpdateException
        /// </exception>
        public void UpdateMatchResults(Dominio.Jugador playerOne, int playerOneCheckers,
                                       Dominio.Jugador playerTwo, int playerTwoCheckers, int playerNumberWinner)
        {
            try
            {
                if (playerNumberWinner == 1)
                {
                    var winnerRankingChange =
                        context.Ranking.Where(ranking => playerOne.IdJugador == ranking.idDuenio).FirstOrDefault <Ranking>();
                    winnerRankingChange.rank            += (playerOneCheckers * 10) + 10;
                    winnerRankingChange.numeroVictorias += 1;
                    winnerRankingChange.partidasJugadas++;

                    var loserRankingChange =
                        context.Ranking.Where(ranking => playerTwo.IdJugador == ranking.idDuenio).FirstOrDefault <Ranking>();
                    loserRankingChange.rank           += CHECKER_POINT_VALUE;
                    loserRankingChange.numeroPerdidas += 1;
                    loserRankingChange.partidasJugadas++;
                    context.SaveChanges();
                }
                else
                {
                    var winnerRankingChange =
                        context.Ranking.Where(ranking => playerTwo.IdJugador == ranking.idDuenio).FirstOrDefault <Ranking>();
                    winnerRankingChange.rank            += (playerTwoCheckers * 10) + 10;
                    winnerRankingChange.numeroVictorias += 1;
                    winnerRankingChange.partidasJugadas++;

                    var loserRankingChange =
                        context.Ranking.Where(ranking => playerOne.IdJugador == ranking.idDuenio).FirstOrDefault <Ranking>();
                    loserRankingChange.rank           += CHECKER_POINT_VALUE;
                    loserRankingChange.rank           += CHECKER_POINT_VALUE;
                    loserRankingChange.numeroPerdidas += 1;
                    loserRankingChange.partidasJugadas++;
                    context.SaveChanges();
                }
            }
            catch (DbUpdateException)
            {
                throw new DbUpdateException();
            }
        }