/// <summary>
        /// Obtiene una canción
        /// </summary>
        /// <param name="p_song_id">
        /// int que es el id de la canción
        /// </param>
        /// <returns>
        /// Objeto Song que contiene los parametros 
        /// de una canción
        /// </returns>
        public async Task<Song> getSongById(int p_song_id)
        {
            Song song = new Song();

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(server_url);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(format));

                HttpResponseMessage response = await client.GetAsync(songs_path + "/" + p_song_id);

                if (response.IsSuccessStatusCode)
                {
                    Console.WriteLine("\nHubo ok con el server");
                    song = await response.Content.ReadAsAsync<Song>();
                }
                else
                {
                    Console.WriteLine("\nAlgo salio mal D-: codigo {0}", response.StatusCode);
                    song = null;
                }
            }

            return song;
        }
        /// <summary>
        /// Le asigna una una metada a una canción
        /// </summary>
        /// <param name="p_song_id">
        /// id de la canción
        /// </param>
        /// <param name="p_version_id">
        /// id de la versión que se le va a asignar
        /// </param>
        /// <returns>
        /// bool true si se logra asignar, false en cualquier otro caso
        /// </returns>
        public async Task<bool> setMetadataSong(int p_song_id, int p_version_id)
        {
            bool flag = false;

            Song song = new Song();

            Version version = new Version();

            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(server_url);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(format));

                HttpResponseMessage song_res = await client.GetAsync(songs_path + "/" + p_song_id.ToString());
                song = await song_res.Content.ReadAsAsync<Song>();

                if (song_res.IsSuccessStatusCode)
                {
                    song.metadata_id = p_version_id;

                    HttpResponseMessage sng_upd = await client.PutAsJsonAsync<Song>(songs_path + "/" + song.song_id.ToString(), song);

                    if (sng_upd.IsSuccessStatusCode)
                    {
                        flag = true;
                    }
                    else
                    {
                        flag = false;
                    }
                }
                else
                {
                    flag = false;
                }
                
            }

            return flag;
        }
        /// <summary>
        /// Crea una version nueva pero con un objeto Song
        /// </summary>
        /// <param name="new_version">
        /// Version que se le va a agregar a la canción
        /// </param>
        /// <param name="song">
        /// Canción a la que se le asigna la version
        /// </param>
        /// <returns>
        /// Objeto Song que contiene los valores de la cancion
        /// y con una version asignada
        /// </returns>
        public async Task<Song> createVersion(List<string> new_version, Song song)
        {
            Version ver = new Version(new_version, song.song_id);

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(server_url);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(format));

                HttpResponseMessage response = await client.PostAsJsonAsync(versions_path, ver);

                if (response.IsSuccessStatusCode)
                {

                    ver = await response.Content.ReadAsAsync<Version>();

                    song.metadata_id = ver.version_id;

                    HttpResponseMessage updsng = await client.PutAsJsonAsync<Song>(songs_path + "/" + song.song_id, song);

                    if (updsng.IsSuccessStatusCode)
                    {
                        Console.WriteLine("\nSe creo correctamente, metadata_id {0}", song.metadata_id);
                    }
                    else
                    {
                        song = null;
                        Console.WriteLine("\nError {0}", updsng.StatusCode);
                    }
                }
                else
                {
                    song = null;
                }
            }

            return song;
        }
        /// <summary>
        /// Agrega una canción a un usuario
        /// </summary>
        /// <param name="p_user_name">
        /// Nombre del usaurio al que se le va a agregar 
        /// la canción
        /// </param>
        /// <param name="p_song_name">
        /// Nombre de la canción que se va a agregar
        /// </param>
        /// <param name="song">
        /// Objeto Song que tiene los parametros necearios 
        /// para unir las canciones
        /// </param>
        /// <returns>
        /// bool true si se logra crear el enlace, false en cualquier 
        /// otro caso
        /// </returns>
        public async Task<bool> addSong2user(string p_user_name, string p_song_name, Song song)
        {
            bool flag = false;

            Property prop = new Property() { user_name = p_user_name, song_name = p_song_name, song_id = song.song_id };

            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(server_url);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(format));

                HttpResponseMessage response = await client.PostAsJsonAsync<Property>(properties_path, prop);

                if (response.IsSuccessStatusCode)
                {
                    flag = true;
                    Console.WriteLine("\nSe agrego bien la cancion");
                }
                else
                {
                    flag = false;
                    Console.WriteLine("\nEl codigo de error: {0}", response.StatusCode);
                }
            }

            return flag;
        }
        /// <summary>
        /// Crea una nueva canción
        /// </summary>
        /// <param name="p_song_directory">
        /// Directorio donde se encuetra la canción.
        /// </param>
        /// <returns>
        /// Un objeto song con la información de la canción
        /// </returns>
        public async Task<Song> createSong(string p_song_directory)
        {

            Song result = new Song();

            Song song = new Song() { song_id = -1, metadata_id = -1, song_directory = p_song_directory };

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(server_url);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(format));

                HttpResponseMessage response = await client.PostAsJsonAsync(songs_path, song);

                if (response.IsSuccessStatusCode)
                {

                    result = await response.Content.ReadAsAsync<Song>();

                    bool res = await addMongoSong(result.song_id);

                    if (!res)
                    {
                        Console.WriteLine("No se puedo agregar a Mongo la cancion id {0}", result.song_id);
                    }

                }
                else
                {
                    result = null;
                    Console.WriteLine("\nCodigo de error {0}", response.StatusCode);
                }
            }

            return result;
        }