package io.delphiplatform.api.v3.model.spotify;

import com.fasterxml.jackson.annotation.JsonProperty;

import org.openapitools.jackson.nullable.JsonNullable;

import java.util.Objects;

/**
 * SpotifySource
 */
public class SpotifySource {

    @JsonProperty("album")
    private JsonNullable<Long> album = JsonNullable.undefined();

    @JsonProperty("artist")
    private JsonNullable<Long> artist = JsonNullable.undefined();

    @JsonProperty("chart")
    private JsonNullable<Long> chart = JsonNullable.undefined();

    @JsonProperty("collection")
    private JsonNullable<Long> collection = JsonNullable.undefined();

    @JsonProperty("other")
    private JsonNullable<Long> other = JsonNullable.undefined();

    @JsonProperty("others_playlist")
    private JsonNullable<Long> othersPlaylist = JsonNullable.undefined();

    @JsonProperty("play_queue")
    private JsonNullable<Long> playQueue = JsonNullable.undefined();

    @JsonProperty("radio")
    private JsonNullable<Long> radio = JsonNullable.undefined();

    @JsonProperty("search")
    private JsonNullable<Long> search = JsonNullable.undefined();

    @JsonProperty("daily_mix")
    private JsonNullable<Long> dailyMix = JsonNullable.undefined();

    @JsonProperty("discover_weekly")
    private JsonNullable<Long> discoverWeekly = JsonNullable.undefined();

    @JsonProperty("release_radar")
    private JsonNullable<Long> releaseRadar = JsonNullable.undefined();

    public SpotifySource album(Long album) {
        this.album = JsonNullable.of(album);
        return this;
    }

    /**
     * The number of streams, aggregated by provided filter parameters.
     *
     * @return album
     */
    public JsonNullable<Long> getAlbum() {
        return album;
    }

    public void setAlbum(JsonNullable<Long> album) {
        this.album = album;
    }

    public SpotifySource artist(Long artist) {
        this.artist = JsonNullable.of(artist);
        return this;
    }

    /**
     * The number of streams, aggregated by provided filter parameters.
     *
     * @return artist
     */
    public JsonNullable<Long> getArtist() {
        return artist;
    }

    public void setArtist(JsonNullable<Long> artist) {
        this.artist = artist;
    }

    public SpotifySource chart(Long chart) {
        this.chart = JsonNullable.of(chart);
        return this;
    }

    /**
     * The number of streams, aggregated by provided filter parameters.
     *
     * @return chart
     */
    public JsonNullable<Long> getChart() {
        return chart;
    }

    public void setChart(JsonNullable<Long> chart) {
        this.chart = chart;
    }

    public SpotifySource collection(Long collection) {
        this.collection = JsonNullable.of(collection);
        return this;
    }

    /**
     * The number of streams, aggregated by provided filter parameters.
     *
     * @return collection
     */
    public JsonNullable<Long> getCollection() {
        return collection;
    }

    public void setCollection(JsonNullable<Long> collection) {
        this.collection = collection;
    }

    public SpotifySource other(Long other) {
        this.other = JsonNullable.of(other);
        return this;
    }

    /**
     * The number of streams, aggregated by provided filter parameters.
     *
     * @return other
     */
    public JsonNullable<Long> getOther() {
        return other;
    }

    public void setOther(JsonNullable<Long> other) {
        this.other = other;
    }

    public SpotifySource othersPlaylist(Long othersPlaylist) {
        this.othersPlaylist = JsonNullable.of(othersPlaylist);
        return this;
    }

    /**
     * The number of streams, aggregated by provided filter parameters.
     *
     * @return othersPlaylist
     */
    public JsonNullable<Long> getOthersPlaylist() {
        return othersPlaylist;
    }

    public void setOthersPlaylist(JsonNullable<Long> othersPlaylist) {
        this.othersPlaylist = othersPlaylist;
    }

    public SpotifySource playQueue(Long playQueue) {
        this.playQueue = JsonNullable.of(playQueue);
        return this;
    }

    /**
     * The number of streams, aggregated by provided filter parameters.
     *
     * @return playQueue
     */
    public JsonNullable<Long> getPlayQueue() {
        return playQueue;
    }

    public void setPlayQueue(JsonNullable<Long> playQueue) {
        this.playQueue = playQueue;
    }

    public SpotifySource radio(Long radio) {
        this.radio = JsonNullable.of(radio);
        return this;
    }

    /**
     * The number of streams, aggregated by provided filter parameters.
     *
     * @return radio
     */
    public JsonNullable<Long> getRadio() {
        return radio;
    }

    public void setRadio(JsonNullable<Long> radio) {
        this.radio = radio;
    }

    public SpotifySource search(Long search) {
        this.search = JsonNullable.of(search);
        return this;
    }

    /**
     * The number of streams, aggregated by provided filter parameters.
     *
     * @return search
     */
    public JsonNullable<Long> getSearch() {
        return search;
    }

    public void setSearch(JsonNullable<Long> search) {
        this.search = search;
    }

    public SpotifySource dailyMix(Long dailyMix) {
        this.dailyMix = JsonNullable.of(dailyMix);
        return this;
    }

    public JsonNullable<Long> getDailyMix() {
        return dailyMix;
    }

    public void setDailyMix(JsonNullable<Long> dailyMix) {
        this.dailyMix = dailyMix;
    }

    public SpotifySource discoverWeekly(Long discoverWeekly) {
        this.discoverWeekly = JsonNullable.of(discoverWeekly);
        return this;
    }

    public JsonNullable<Long> getDiscoverWeekly() {
        return discoverWeekly;
    }

    public void setDiscoverWeekly(JsonNullable<Long> discoverWeekly) {
        this.discoverWeekly = discoverWeekly;
    }

    public SpotifySource releaseRadar(Long releaseRadar) {
        this.releaseRadar = JsonNullable.of(releaseRadar);
        return this;
    }

    public JsonNullable<Long> getReleaseRadar() {
        return releaseRadar;
    }

    public void setReleaseRadar(JsonNullable<Long> releaseRadar) {
        this.releaseRadar = releaseRadar;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        SpotifySource spotifySource = (SpotifySource) o;
        return Objects.equals(this.album, spotifySource.album) &&
            Objects.equals(this.artist, spotifySource.artist) &&
            Objects.equals(this.chart, spotifySource.chart) &&
            Objects.equals(this.collection, spotifySource.collection) &&
            Objects.equals(this.other, spotifySource.other) &&
            Objects.equals(this.othersPlaylist, spotifySource.othersPlaylist) &&
            Objects.equals(this.playQueue, spotifySource.playQueue) &&
            Objects.equals(this.radio, spotifySource.radio) &&
            Objects.equals(this.search, spotifySource.search);
    }

    @Override
    public int hashCode() {
        return Objects.hash(album, artist, chart, collection, other, othersPlaylist, playQueue, radio, search);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("class SpotifySource {\n");

        sb.append("    album: ").append(toIndentedString(album)).append("\n");
        sb.append("    artist: ").append(toIndentedString(artist)).append("\n");
        sb.append("    chart: ").append(toIndentedString(chart)).append("\n");
        sb.append("    collection: ").append(toIndentedString(collection)).append("\n");
        sb.append("    other: ").append(toIndentedString(other)).append("\n");
        sb.append("    othersPlaylist: ").append(toIndentedString(othersPlaylist)).append("\n");
        sb.append("    playQueue: ").append(toIndentedString(playQueue)).append("\n");
        sb.append("    radio: ").append(toIndentedString(radio)).append("\n");
        sb.append("    search: ").append(toIndentedString(search)).append("\n");
        sb.append("}");
        return sb.toString();
    }

    /**
     * Convert the given object to string with each line indented by 4 spaces (except the first line).
     */
    private String toIndentedString(Object o) {
        if (o == null) {
            return "null";
        }
        return o.toString().replace("\n", "\n    ");
    }
}

