IEnumerable <PlaylistSong> IPlaylistRequestHandler.LoadPlaylist(string title)
        {
            List <PlaylistSong> newSongList = new List <PlaylistSong>();

            Database.Playlist loadingPlaylist = GetPlaylistClone(title);

            if (loadingPlaylist == null)
            {
                Console.WriteLine($"Tried to load Playlist \"{title}\"... Not found!");
                return(newSongList);
            }

            if (_currentPlaylist == null)
            {
                GetCurrentPlaylist();
            }

            foreach (PlaylistSong song in loadingPlaylist.PlaylistSongs)
            {
                song.Playlist = _currentPlaylist;
                db.PlaylistSongs.Add(song);
                newSongList.Add(song);
            }

            db.SaveChanges();

            newSongList.Sort((a, b) => a.Number.CompareTo(b.Number));

            return(newSongList);
        }
        PlaylistSong GetSongData(
            Song song,
            Artist exclusiveArtist       = null,
            Recording exclusiveRecording = null)
        {
            Database.Playlist currentPlaylist = GetCurrentPlaylist();

            string playlistName;

            if (exclusiveRecording != null)
            {
                playlistName = $"{exclusiveRecording.Artist.Name} - {exclusiveRecording.Song.Title}";
            }
            else if (exclusiveArtist != null)
            {
                playlistName = $"{exclusiveArtist.Name} - {song.Title}";
            }
            else
            {
                List <Artist> artists = new List <Artist>(
                    (from recording in song.Recordings
                     select recording.Artist).Distinct());

                if (artists.Count == 1)
                {
                    playlistName = $"{artists[0].Name} - {song.Title}";
                }
                else
                {
                    playlistName = $"Various - {song.Title}";
                }
            }

            PlaylistSong newSong = new PlaylistSong(
                song: song,
                title: playlistName)
            {
                Playlist = currentPlaylist,
                Weight   = song.Weight
            };

            db.PlaylistSongs.Add(newSong);

            foreach (PlaylistRecording recording in GetRecordingList(
                         song: song,
                         exclusiveArtist: exclusiveArtist,
                         exclusiveRecording: exclusiveRecording))
            {
                recording.PlaylistSong = newSong;
                db.PlaylistRecordings.Add(recording);
            }

            return(newSong);
        }
        void IPlaylistRequestHandler.DeletePlaylist(string title)
        {
            Database.Playlist playlist =
                (from pl in db.Playlists
                 where pl.Title == title
                 select pl).FirstOrDefault();

            if (playlist == null)
            {
                return;
            }

            db.Playlists.Remove(playlist);
            db.SaveChanges();
        }
        void IPlaylistRequestHandler.SavePlaylistAs(string title, IEnumerable <PlaylistSong> songs)
        {
            //Let's just do the easy thing - kill the whole record and start over
            db.Playlists.RemoveRange(from playlist in db.Playlists
                                     where playlist.Title == title
                                     select playlist);

            Database.Playlist savePlaylist = new Database.Playlist()
            {
                Title = title
            };

            int index = 0;

            foreach (PlaylistSong song in songs)
            {
                PlaylistSong songCopy = new PlaylistSong()
                {
                    Number   = index++,
                    Song     = song.Song,
                    Weight   = song.Weight,
                    Title    = song.Title,
                    Playlist = savePlaylist
                };
                db.PlaylistSongs.Add(songCopy);

                foreach (PlaylistRecording recording in song.PlaylistRecordings)
                {
                    PlaylistRecording recordingCopy = new PlaylistRecording()
                    {
                        Title        = recording.Title,
                        Recording    = recording.Recording,
                        Weight       = recording.Weight,
                        PlaylistSong = songCopy
                    };

                    db.PlaylistRecordings.Add(recordingCopy);
                }
            }

            db.Playlists.Add(savePlaylist);
            db.SaveChanges();
        }
        private Database.Playlist GetCurrentPlaylist()
        {
            if (_currentPlaylist != null)
            {
                return(_currentPlaylist);
            }

            _currentPlaylist =
                (from playlist in db.Playlists
                 where playlist.Title == "Default"
                 select playlist).FirstOrDefault();

            if (_currentPlaylist == null)
            {
                _currentPlaylist = new Database.Playlist()
                {
                    Title = "Default"
                };
                db.Playlists.Add(_currentPlaylist);
                db.SaveChanges();
            }

            return(_currentPlaylist);
        }
        IEnumerable <PlaylistSong> IPlaylistTransferRequestHandler.GetAlbumData(
            Album album,
            bool deep)
        {
            List <PlaylistSong> songData = new List <PlaylistSong>();

            try
            {
                db.Configuration.AutoDetectChangesEnabled = false;

                if (deep)
                {
                    foreach (Song song in
                             (from recording in album.Recordings
                              orderby recording.DiscNumber, recording.TrackNumber
                              select recording.Song).Distinct())
                    {
                        songData.Add(GetSongData(song: song));
                    }
                }
                else
                {
                    Database.Playlist currentPlaylist = GetCurrentPlaylist();

                    foreach (Recording recording in
                             from recording in album.Recordings
                             orderby recording.DiscNumber, recording.TrackNumber
                             select recording)
                    {
                        PlaylistSong newSong = new PlaylistSong(
                            song: recording.Song,
                            title: $"{recording.Artist.Name} - {recording.Song.Title}")
                        {
                            Playlist = currentPlaylist,
                            Weight   = recording.Weight
                        };

                        db.PlaylistSongs.Add(newSong);

                        PlaylistRecording newRecording = new PlaylistRecording(
                            recording: recording,
                            title: $"{recording.Artist.Name} - {recording.Album.Title} - {recording.Title}")
                        {
                            Weight = 1.0
                        };

                        newRecording.PlaylistSong = newSong;
                        db.PlaylistRecordings.Add(newRecording);

                        songData.Add(newSong);
                    }
                }
            }
            finally
            {
                db.Configuration.AutoDetectChangesEnabled = true;
            }

            db.SaveChanges();

            return(songData);
        }
        IEnumerable <PlaylistSong> IPlaylistTransferRequestHandler.GetArtistData(
            Artist artist,
            bool deep)
        {
            List <PlaylistSong> artistData = new List <PlaylistSong>();

            try
            {
                db.Configuration.AutoDetectChangesEnabled = false;

                Database.Playlist currentPlaylist = GetCurrentPlaylist();

                foreach (Song song in
                         (from recording in artist.Recordings
                          orderby recording.Song.Title ascending
                          select recording.Song).Distinct())
                {
                    string playlistName;

                    if (deep)
                    {
                        List <Artist> artists = new List <Artist>(
                            (from recording in song.Recordings
                             select recording.Artist).Distinct());

                        if (artists.Count == 1)
                        {
                            playlistName = $"{artists[0].Name} - {song.Title}";
                        }
                        else
                        {
                            playlistName = $"Various - {song.Title}";
                        }
                    }
                    else
                    {
                        playlistName = $"{artist.Name} - {song.Title}";
                    }

                    PlaylistSong newSong = new PlaylistSong(
                        song: song,
                        title: playlistName)
                    {
                        Playlist = currentPlaylist,
                        Weight   = song.Weight
                    };
                    db.PlaylistSongs.Add(newSong);

                    foreach (PlaylistRecording recording in GetRecordingList(
                                 song: song,
                                 exclusiveArtist: deep ? null : artist))
                    {
                        recording.PlaylistSong = newSong;
                        db.PlaylistRecordings.Add(recording);
                    }

                    artistData.Add(newSong);
                }
            }
            finally
            {
                db.Configuration.AutoDetectChangesEnabled = true;
            }

            db.SaveChanges();

            return(artistData);
        }