/// <summary>
        ///     Inicia sesion con las credenciales indicadas
        /// </summary>
        /// <param name="login">El objeto que contiene las credenciales del usuario</param>
        /// <param name="desdeLocal">
        ///     Inidica si se iniciara sesion con las credenciales proporcionadas por el usuario
        ///     o con credenciales almacenadas
        /// </param>
        /// <returns>Task</returns>
        private async Task InciarSesion(Login login, bool desdeLocal)
        {
            try
            {
                await ApiServiceLogin.GetServiceLogin().Login(login);

                var usuario = await UsuarioClient.GetUser();

                usuario.login = login;
                ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().InicioSesionUsuario(usuario);
                NavigationService?.Navigate(new Canciones());
            }
            catch (HttpRequestException)
            {
                if (!desdeLocal)
                {
                    new MensajeEmergente().MostrarMensajeError("No se puede conectar al servidor");
                }
                else
                {
                    NavigationService?.Navigate(new Canciones());
                }
            }
            catch (Exception exception)
            {
                if (exception.Message == "AuntenticacionFallida")
                {
                    new MensajeEmergente().MostrarMensajeError("No se pudo iniciar sesión, intentelo nuevamente");
                }
                new MensajeEmergente().MostrarMensajeAdvertencia(exception.Message);
            }
        }
        /// <summary>
        ///     Actualiza la lista de canciones pendientes por descargar del usuario
        /// </summary>
        private void ActualizarCancionesPendientesDeUsuario()
        {
            var usuario = ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado();

            usuario.canciones_pendientes_descarga = _colaCancionesSinConexion.ToList();
            OnActualizacionElementosCola?.Invoke();
        }
        /// <summary>
        ///     Se encarga de almacenar la cancion cuando ya se termino de descargar y de agregarla a la lista de canciones
        ///     descargadas
        /// </summary>
        private void TerminarDeRecibirCancion()
        {
            _songsClient.OnInitialRecivedSong    -= RecibirCancion;
            _songsClient.OnSongChunkRived        -= RecibirChunk;
            _songsClient.OnTerminatedRecivedSong -= TerminarDeRecibirCancion;
            _estadoManjadorDeCanciones            = EstadoManjadorDeCanciones.Guardando;
            var usuarioActual = ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado();
            var ruta          = CrearRutaParaGuardarCancion(usuarioActual.nombre_usuario, _seEncuentraDescargando.id,
                                                            _extensionCancion);
            var seGuardo = GuardarCancion(_bufferCancion, ruta);

            _bufferCancion.Dispose();
            if (seGuardo)
            {
                _seEncuentraDescargando.ruta_cancion    = ruta;
                _seEncuentraDescargando.estado_descarga = CancionSinConexion.EstadoDescarga.Descargado;
                usuarioActual.canciones_sin_conexion.Add(_seEncuentraDescargando);
            }
            else
            {
                _colaCancionesSinConexion.Enqueue(_seEncuentraDescargando);
                _seEncuentraDescargando.estado_descarga = CancionSinConexion.EstadoDescarga.Error;
            }

            _seEncuentraDescargando = null;
            ActualizarCancionesPendientesDeUsuario();
            IniciarDescarga();
        }
 /// <summary>
 ///     Revisa si el manejador de archivos no esta almancenando una cancion y guarda la informacion de los usuarios
 /// </summary>
 /// <param name="sender">El objeto que invoco el evento</param>
 /// <param name="e">El evento invocado</param>
 private void OnClose(object sender, EventArgs e)
 {
     while (!ManejadorCancionesSinConexion.GetManejadorDeCancionesSinConexion().SePuedeCerrarLaApp())
     {
         Thread.Sleep(1000);
     }
     ManejadorCancionesSinConexion.GetManejadorDeCancionesSinConexion().TerminarDeDescargarCanciones();
     ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().GuardarInformacionUsuarios();
 }
        /// <summary>
        ///     Obtiene el usuario que tiene la sesion inciada
        /// </summary>
        /// <returns>El objeto para logearse con el usuario que tiene la sesion iniciada</returns>
        private Login ObtenerUsuarioLogeado()
        {
            Login loginUsuario   = null;
            var   usuarioLogeado = ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado();

            if (usuarioLogeado != null)
            {
                loginUsuario = usuarioLogeado.login;
            }

            return(loginUsuario);
        }
 /// <summary>
 ///     Muestra el item de mi perfil
 /// </summary>
 public static void MostrarElementoMiPerfil()
 {
     if (_mainWindow != null)
     {
         if (ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado() != null)
         {
             if (ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado()
                 .tipo_usuario == TipoUsuario.CreadorDeContenido)
             {
                 _mainWindow.MiPerfilItem.Visibility = Visibility.Visible;
             }
         }
     }
 }
 public void OnClickCerrarSesion(object sender, RoutedEventArgs routedEventArgs)
 {
     LimpiarReproductor();
     LimpiarElementosReproductor();
     while (!ManejadorCancionesSinConexion.GetManejadorDeCancionesSinConexion().SePuedeCerrarLaApp())
     {
         Thread.Sleep(1000);
     }
     ManejadorCancionesSinConexion.GetManejadorDeCancionesSinConexion().TerminarDeDescargarCanciones();
     ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().CerrarSesionUsuario();
     OcultarMenu();
     OcultarReproductor();
     PantallaFrame.Navigate(new IniciarSesion());
 }
        /// <summary>
        ///     Recupera el creador de contenido del usuario logeado
        /// </summary>
        /// <returns>Task</returns>
        private async Task RecuperarCreadorDeContenido()
        {
            if (ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado() != null)
            {
                try
                {
                    _creadorContenido = await CreadorContenidoClient.GetCreadorContenidoFromActualUser();

                    DesactivarModoSinConexion();
                }
                catch (HttpRequestException)
                {
                    ActivarModoSinConexion();
                }
            }
        /// <summary>
        ///     Elimina la cancion de las canciones sin conexion
        /// </summary>
        /// <param name="sender">El objeto que invoco el evento</param>
        /// <param name="e">El evento invocado</param>
        private void OnClickEliminarCancion(object sender, RoutedEventArgs e)
        {
            var idCancion = (int)((Button)sender).Tag;
            var cancion   = BuscarCancionSinConexion(idCancion);

            if (cancion != null)
            {
                if (File.Exists(cancion.ruta_cancion))
                {
                    File.Delete(cancion.ruta_cancion);
                }
                var usuario = ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado();
                usuario.canciones_sin_conexion.Remove(cancion);
                ObtenerCancionesSinConexion();
            }
        }
        private ManejadorCancionesSinConexion()
        {
            var usuario = ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado();

            if (usuario != null)
            {
                var cancionesPendientes = usuario.canciones_pendientes_descarga;
                foreach (var cancionSinConexion in cancionesPendientes)
                {
                    _colaCancionesSinConexion.Enqueue(cancionSinConexion);
                }
                if (_colaCancionesSinConexion.Count > 0)
                {
                    IniciarDescarga();
                }
            }
        }
        /// <summary>
        ///     Valida si ya existe en las canciones sin conexion alguna cancion con el mismo id
        /// </summary>
        /// <param name="idCancion">El id de la cancion a validar si existe</param>
        /// <returns>True si ya se encuentra en la lista de las canciones sin conexion, False si no</returns>
        private bool SeEncuentraEnCancionesSinConexion(int idCancion)
        {
            var seEncuentra = false;
            var usuario     = ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado();

            if (usuario.canciones_sin_conexion != null)
            {
                foreach (var cancionSinConexion in usuario.canciones_sin_conexion)
                {
                    if (cancionSinConexion.id == idCancion)
                    {
                        seEncuentra = true;
                        break;
                    }
                }
            }

            return(seEncuentra);
        }
        /// <summary>
        ///     Recupera las canciones sin conexion del usuario y las pendientes de descarga y las coloca en los text view
        /// </summary>
        private void ObtenerCancionesSinConexion()
        {
            var usuarioActual      = ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado();
            var cancionDescargando = ManejadorCancionesSinConexion.GetManejadorDeCancionesSinConexion()
                                     .GetCancionDescargando();

            _cancionesPendientes = new List <CancionSinConexion>();
            if (cancionDescargando != null)
            {
                _cancionesPendientes.Add(cancionDescargando);
            }
            _cancionesPendientes.AddRange(usuarioActual.canciones_pendientes_descarga);
            _cancionesDescargadas = usuarioActual.canciones_sin_conexion;
            ListViewCancionesDescargadas.ItemsSource           = null;
            ListViewCancionesDescargadas.ItemsSource           = _cancionesDescargadas;
            ListViewCancionesSinConexionPendientes.ItemsSource = null;
            ListViewCancionesSinConexionPendientes.ItemsSource = _cancionesPendientes;
            ColocarInformacionCanciones();
        }
        /// <summary>
        ///     Coloca todas las canciones pendientes de descarga o descargando en la lista de canciones pendientes del usuario
        /// </summary>
        public void TerminarDeDescargarCanciones()
        {
            var usuario = ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().ObtenerUsuarioLogeado();

            if (usuario != null)
            {
                if (_seEncuentraDescargando != null)
                {
                    _colaCancionesSinConexion.Enqueue(_seEncuentraDescargando);
                }
                usuario.canciones_pendientes_descarga = _colaCancionesSinConexion.ToList();
                if (_songsClient != null)
                {
                    _songsClient.OnInitialRecivedSong    -= RecibirCancion;
                    _songsClient.OnSongChunkRived        -= RecibirChunk;
                    _songsClient.OnTerminatedRecivedSong -= TerminarDeRecibirCancion;
                    _songsClient = new SongsClient();
                }
                _extensionCancion          = "";
                _estadoManjadorDeCanciones = EstadoManjadorDeCanciones.Detenido;
                _colaCancionesSinConexion.Clear();
                _seEncuentraDescargando = null;
            }
        }
        /// <summary>
        ///     Registra un nuevo usuario
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void OnClickRegistrarButton(object sender, RoutedEventArgs e)
        {
            if (ValidarTextBoxNombre() && ValidarTextBoxCorreo() && ValidarTextBoxNombreUsuario() &&
                ValidarTextBoxContraseña())
            {
                cancelarButton.IsEnabled         = false;
                registrarUsuarioButton.IsEnabled = false;
                var usuario           = CrearUsuario();
                var usuarioRegistrado = false;
                try
                {
                    await UsuarioClient.RegisterUsuario(usuario);

                    usuarioRegistrado = true;
                    var usuarioLogin = new Login
                    {
                        Password = usuario.contrasena,
                        User     = usuario.nombre_usuario
                    };
                    await ApiServiceLogin.GetServiceLogin().Login(usuarioLogin);

                    var usuarioLogeado = await UsuarioClient.GetUser();

                    usuarioLogeado.login = usuarioLogin;
                    ManejadorDeUsuariosLogeados.GetManejadorDeUsuariosLogeados().InicioSesionUsuario(usuarioLogeado);
                    if (_rutaImagen != "")
                    {
                        var clientePortadas = new CoversClient();
                        clientePortadas.UploadUserCover(_rutaImagen);
                    }
                }
                catch (HttpRequestException)
                {
                    new MensajeEmergente().MostrarMensajeError("No se puede conectar al servidor");
                }
                catch (RpcException)
                {
                    new MensajeEmergente().MostrarMensajeError(
                        "No se pudo guardar la imagen de portada, puede subirla " +
                        "mas adelante");
                }
                catch (Exception exception)
                {
                    new MensajeEmergente().MostrarMensajeAdvertencia(exception.Message);
                }

                if (usuarioRegistrado)
                {
                    if (usuario.tipo_usuario == TipoUsuario.CreadorDeContenido)
                    {
                        NavigationService?.Navigate(new RegistrarCreadorContenido());
                    }
                    else
                    {
                        NavigationService?.Navigate(new Canciones());
                    }
                }

                cancelarButton.IsEnabled         = true;
                registrarUsuarioButton.IsEnabled = true;
            }
        }