package com.simplecity.amp_library.model;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.WorkerThread;
import com.simplecity.amp_library.ShuttleApplication;
import com.simplecity.amp_library.http.HttpClient;
import com.simplecity.amp_library.lastfm.ItunesResult;
import com.simplecity.amp_library.lastfm.LastFmResult;
import com.simplecity.amp_library.utils.ArtworkUtils;
import com.simplecity.amp_library.utils.ComparisonUtils;
import com.simplecity.amp_library.utils.DataManager;
import com.simplecity.amp_library.utils.StringUtils;
import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import rx.Observable;
public class Album implements
Serializable,
ArtworkProvider,
Comparable<Album>,
Sortable {
public long id;
public String name;
public List<Artist> artists = new ArrayList<>();
public String albumArtistName;
public int year;
public int numSongs;
public int numDiscs;
public long lastPlayed;
public long dateAdded;
public List<String> paths = new ArrayList<>();
public int songPlayCount;
private String artworkKey;
private String sortKey;
public Album(long id, String name, List<Artist> artists, String albumArtistName, int numSongs, int numDiscs, int year, long lastPlayed, long dateAdded, List<String> paths, int songPlayCount) {
this.id = id;
this.name = name;
this.artists = artists;
this.albumArtistName = albumArtistName;
this.numSongs = numSongs;
this.numDiscs = numDiscs;
this.year = year;
this.lastPlayed = lastPlayed;
this.dateAdded = dateAdded;
this.paths = paths;
this.songPlayCount = songPlayCount;
//Populate the artwork key & sort key properties if null.
setSortKey();
setArtworkKey();
}
public Observable<List<Song>> getSongsObservable() {
return DataManager.getInstance().getSongsObservable(song -> song.albumId == id);
}
public static class Builder {
private long id;
private String name;
private List<Artist> artists = new ArrayList<>();
private String albumArtistName;
private int numSongs;
private int numDiscs;
private int year;
private long lastPlayed;
private long dateAdded;
private List<String> paths = new ArrayList<>();
private int songPlayCount;
public Builder id(long id) {
this.id = id;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder addArtist(Artist artist) {
if (!this.artists.contains(artist)) {
this.artists.add(artist);
}
return this;
}
public Builder albumArtist(String albumArtistName) {
this.albumArtistName = albumArtistName;
return this;
}
public Builder numSongs(int numSongs) {
this.numSongs = numSongs;
return this;
}
public Builder numDiscs(int numDiscs) {
this.numDiscs = numDiscs;
return this;
}
public Builder year(int year) {
this.year = year;
return this;
}
public Builder lastPlayed(long lastPlayed) {
if (lastPlayed > this.lastPlayed) {
this.lastPlayed = lastPlayed;
}
return this;
}
public Builder dateAdded(long dateAdded) {
if (dateAdded > this.dateAdded) {
this.dateAdded = dateAdded;
}
return this;
}
public Builder path(String path) {
if (!this.paths.contains(path)) {
this.paths.add(path);
}
return this;
}
public Builder songPlayCount(int playCount) {
songPlayCount = playCount;
return this;
}
public Album build() {
return new Album(id, name, artists, albumArtistName, numSongs, numDiscs, year, lastPlayed, dateAdded, paths, songPlayCount);
}
}
public String getNumSongsLabel() {
return StringUtils.makeAlbumsLabel(ShuttleApplication.getInstance(), 0, numSongs, true);
}
public AlbumArtist getAlbumArtist() {
return new AlbumArtist.Builder()
.name(albumArtistName)
.album(this)
.build();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Album album = (Album) o;
if (id != album.id) return false;
if (year != album.year) return false;
if (numSongs != album.numSongs) return false;
if (lastPlayed != album.lastPlayed) return false;
if (dateAdded != album.dateAdded) return false;
if (name != null ? !name.equals(album.name) : album.name != null) return false;
if (artists != null ? !artists.equals(album.artists) : album.artists != null) return false;
if (albumArtistName != null ? !albumArtistName.equals(album.albumArtistName) : album.albumArtistName != null)
return false;
return paths != null ? paths.equals(album.paths) : album.paths == null;
}
@Override
public int hashCode() {
int result = (int) (id ^ (id >>> 32));
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (artists != null ? artists.hashCode() : 0);
result = 31 * result + (albumArtistName != null ? albumArtistName.hashCode() : 0);
result = 31 * result + year;
result = 31 * result + numSongs;
result = 31 * result + (int) (lastPlayed ^ (lastPlayed >>> 32));
result = 31 * result + (int) (dateAdded ^ (dateAdded >>> 32));
result = 31 * result + (paths != null ? paths.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "Album{" +
"id=" + id +
", name='" + name + '\'' +
", artists=" + artists +
", albumArtistName='" + albumArtistName + '\'' +
", year=" + year +
", numSongs=" + numSongs +
", lastPlayed=" + lastPlayed +
", dateAdded=" + dateAdded +
", paths=" + paths +
'}';
}
@Override
public String getSortKey() {
if (sortKey == null) {
setSortKey();
}
return sortKey;
}
@Override
public void setSortKey() {
sortKey = StringUtils.keyFor(name);
}
@Override
public String getArtworkKey() {
if (artworkKey == null) setArtworkKey();
return artworkKey;
}
private void setArtworkKey() {
artworkKey = String.format("%s_%s", albumArtistName, name);
}
@Override
public Call<? extends LastFmResult> getLastFmArtwork() {
return HttpClient.getInstance().lastFmService.getLastFmAlbumResult(albumArtistName, name);
}
@Override
public Call<ItunesResult> getItunesArtwork() {
return HttpClient.getInstance().itunesService.getItunesAlbumResult(String.format("%s %s", albumArtistName, name));
}
@Override
public InputStream getMediaStoreArtwork() {
return ArtworkUtils.getMediaStoreArtwork(this);
}
@Nullable
@Override
public InputStream getFolderArtwork() {
return ArtworkUtils.getFolderArtwork(getArtworkPath());
}
@Override
public InputStream getTagArtwork() {
return ArtworkUtils.getTagArtwork(getArtworkPath());
}
@Override
public List<File> getFolderArtworkFiles() {
return ArtworkUtils.getAllFolderArtwork(getArtworkPath());
}
@Nullable
@WorkerThread
private String getArtworkPath() {
if (paths != null && !paths.isEmpty()) {
return paths.get(0);
}
return null;
}
@Override
public int compareTo(@NonNull Album album) {
return ComparisonUtils.compare(getSortKey(), album.getSortKey());
}
}