package com.github.felixgail.gplaymusic.model;

import com.github.felixgail.gplaymusic.model.enums.ResultType;
import com.github.felixgail.gplaymusic.model.responses.Result;
import com.github.felixgail.gplaymusic.model.snippets.ArtRef;
import com.github.felixgail.gplaymusic.model.snippets.Attribution;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.util.List;
import java.util.Optional;
import java.util.OptionalInt;
import javax.validation.constraints.NotNull;

public class Artist implements Result, Serializable {

  public final static ResultType RESULT_TYPE = ResultType.ARTIST;

  @Expose
  private String name;
  @Expose
  @SerializedName("artistArtRef")
  private String artistArtUrl;
  @Expose
  private List<ArtRef> artistArtRefs;
  @Expose
  private String artistId;
  @Expose
  @SerializedName("artist_bio_attribution")
  private Attribution artistBioAttribution;
  @Expose
  private String artistBio;
  @Expose
  @SerializedName("related_artists")
  private List<Artist> relatedArtists;
  @Expose
  @SerializedName("total_albums")
  private int totalAlbums;
  @Expose
  private List<Track> topTracks;
  @Expose
  private List<Album> albums;

  public Artist(@NotNull String name) {
    this.name = name;
  }

  public Optional<List<Artist>> getRelatedArtists() {
    return Optional.ofNullable(relatedArtists);
  }

  public OptionalInt getTotalAlbums() {
    return OptionalInt.of(totalAlbums);
  }

  public Optional<List<Track>> getTopTracks() {
    return Optional.ofNullable(topTracks);
  }

  public String getName() {
    return name;
  }

  public Optional<String> getArtistArtUrl() {
    return Optional.ofNullable(artistArtUrl);
  }

  public Optional<List<ArtRef>> getArtistArtRefs() {
    return Optional.ofNullable(artistArtRefs);
  }

  public Optional<String> getArtistId() {
    return Optional.ofNullable(artistId);
  }

  public Optional<Attribution> getArtistBioAttribution() {
    return Optional.ofNullable(artistBioAttribution);
  }

  public Optional<String> getArtistBio() {
    return Optional.ofNullable(artistBio);
  }

  public Optional<List<Album>> getAlbums() {
    return Optional.ofNullable(albums);
  }

  @Override
  public boolean equals(Object o) {
    return (o instanceof Artist) && ((Artist) o).getArtistId().equals(this.artistId);
  }

  @Override
  public ResultType getResultType() {
    return RESULT_TYPE;
  }
}