package io.delphiplatform.api.v3.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;
import java.util.Objects;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;

/**
 * ArtistFollower
 */
public class ArtistFollower {

    @JsonIgnore
    private String artistId;

    @JsonProperty("apple_followers")
    private Long appleFollowers;

    @JsonProperty("date")
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate date;

    @JsonProperty("facebook_likes")
    private Long facebookLikes;

    @JsonProperty("facebook_storytellers")
    private Long facebookStorytellers;

    @JsonProperty("instagram_followers")
    private Long instagramFollowers;

    @JsonProperty("spotify_followers")
    private Long spotifyFollowers;

    @JsonProperty("spotify_popularity")
    private Long spotifyPopularity;

    @JsonProperty("twitter_followers")
    private Long twitterFollowers;

    @JsonProperty("youtube_channel_subscribers")
    private Long youtubeChannelSubscribers;

    @JsonProperty("youtube_channel_views")
    private Long youtubeChannelViews;

    public ArtistFollower date(LocalDate date) {
        this.date = date;
        return this;
    }

    /**
     * ISO 8601 date in format `YYYY-MM-DD`
     *
     * @return date
     */
    @Valid
    @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$")
    public LocalDate getDate() {
        return date;
    }

    public void setDate(LocalDate date) {
        this.date = date;
    }

    public ArtistFollower appleFollowers(Long appleFollowers) {
        this.appleFollowers = appleFollowers;
        return this;
    }

    /**
     * Get appleFollowers
     *
     * @return appleFollowers
     */
    public Long getAppleFollowers() {
        return appleFollowers;
    }

    public void setAppleFollowers(Long appleFollowers) {
        this.appleFollowers = appleFollowers;
    }

    public ArtistFollower facebookLikes(Long facebookLikes) {
        this.facebookLikes = facebookLikes;
        return this;
    }

    /**
     * Get facebookLikes
     *
     * @return facebookLikes
     */
    public Long getFacebookLikes() {
        return facebookLikes;
    }

    public void setFacebookLikes(Long facebookLikes) {
        this.facebookLikes = facebookLikes;
    }

    public ArtistFollower facebookStorytellers(Long facebookStorytellers) {
        this.facebookStorytellers = facebookStorytellers;
        return this;
    }

    /**
     * Get facebookStorytellers
     *
     * @return facebookStorytellers
     */
    public Long getFacebookStorytellers() {
        return facebookStorytellers;
    }

    public void setFacebookStorytellers(Long facebookStorytellers) {
        this.facebookStorytellers = facebookStorytellers;
    }

    public ArtistFollower instagramFollowers(Long instagramFollowers) {
        this.instagramFollowers = instagramFollowers;
        return this;
    }

    /**
     * Get instagramFollowers
     *
     * @return instagramFollowers
     */
    public Long getInstagramFollowers() {
        return instagramFollowers;
    }

    public void setInstagramFollowers(Long instagramFollowers) {
        this.instagramFollowers = instagramFollowers;
    }

    public ArtistFollower spotifyFollowers(Long spotifyFollowers) {
        this.spotifyFollowers = spotifyFollowers;
        return this;
    }

    /**
     * Get spotifyFollowers
     *
     * @return spotifyFollowers
     */
    public Long getSpotifyFollowers() {
        return spotifyFollowers;
    }

    public void setSpotifyFollowers(Long spotifyFollowers) {
        this.spotifyFollowers = spotifyFollowers;
    }

    public ArtistFollower spotifyPopularity(Long spotifyPopularity) {
        this.spotifyPopularity = spotifyPopularity;
        return this;
    }

    /**
     * The popularity of a track is a value between 0 and 100, with 100 being the most popular. The popularity is
     * calculated by algorithm and is based, in the most part, on the total number of plays the track has had and how
     * recent those plays are. Generally speaking, songs that are being played a lot now will have a higher popularity
     * than songs that were played a lot in the past. Duplicate tracks (e.g. the same track from a single and an
     * product) are rated independently. Artist and album popularity is derived mathematically from track popularity.
     * Note that the popularity value may lag actual popularity by a few days: the value is not updated in real time.
     *
     * @return spotifyPopularity
     */
    public Long getSpotifyPopularity() {
        return spotifyPopularity;
    }

    public void setSpotifyPopularity(Long spotifyPopularity) {
        this.spotifyPopularity = spotifyPopularity;
    }

    public ArtistFollower twitterFollowers(Long twitterFollowers) {
        this.twitterFollowers = twitterFollowers;
        return this;
    }

    /**
     * Get twitterFollowers
     *
     * @return twitterFollowers
     */
    public Long getTwitterFollowers() {
        return twitterFollowers;
    }

    public void setTwitterFollowers(Long twitterFollowers) {
        this.twitterFollowers = twitterFollowers;
    }

    public ArtistFollower youtubeChannelSubscribers(Long youtubeChannelSubscribers) {
        this.youtubeChannelSubscribers = youtubeChannelSubscribers;
        return this;
    }

    /**
     * Get youtubeChannelSubscribers
     *
     * @return youtubeChannelSubscribers
     */
    public Long getYoutubeChannelSubscribers() {
        return youtubeChannelSubscribers;
    }

    public void setYoutubeChannelSubscribers(Long youtubeChannelSubscribers) {
        this.youtubeChannelSubscribers = youtubeChannelSubscribers;
    }

    public ArtistFollower youtubeChannelViews(Long youtubeChannelViews) {
        this.youtubeChannelViews = youtubeChannelViews;
        return this;
    }

    /**
     * Get youtubeChannelViews
     *
     * @return youtubeChannelViews
     */
    public Long getYoutubeChannelViews() {
        return youtubeChannelViews;
    }

    public void setYoutubeChannelViews(Long youtubeChannelViews) {
        this.youtubeChannelViews = youtubeChannelViews;
    }

    public String getArtistId() {
        return artistId;
    }

    public void setArtistId(String artistId) {
        this.artistId = artistId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        ArtistFollower artistFollower = (ArtistFollower) o;
        return Objects.equals(this.date, artistFollower.date) &&
            Objects.equals(this.appleFollowers, artistFollower.appleFollowers) &&
            Objects.equals(this.facebookLikes, artistFollower.facebookLikes) &&
            Objects.equals(this.facebookStorytellers, artistFollower.facebookStorytellers) &&
            Objects.equals(this.instagramFollowers, artistFollower.instagramFollowers) &&
            Objects.equals(this.spotifyFollowers, artistFollower.spotifyFollowers) &&
            Objects.equals(this.spotifyPopularity, artistFollower.spotifyPopularity) &&
            Objects.equals(this.twitterFollowers, artistFollower.twitterFollowers) &&
            Objects.equals(this.youtubeChannelSubscribers, artistFollower.youtubeChannelSubscribers) &&
            Objects.equals(this.youtubeChannelViews, artistFollower.youtubeChannelViews);
    }

    @Override
    public int hashCode() {
        return Objects.hash(
            date,
            appleFollowers,
            facebookLikes,
            facebookStorytellers,
            instagramFollowers,
            spotifyFollowers,
            spotifyPopularity,
            twitterFollowers,
            youtubeChannelSubscribers,
            youtubeChannelViews
        );
    }

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

        sb.append("    date: ").append(toIndentedString(date)).append("\n");
        sb.append("    appleFollowers: ").append(toIndentedString(appleFollowers)).append("\n");
        sb.append("    facebookLikes: ").append(toIndentedString(facebookLikes)).append("\n");
        sb.append("    facebookStorytellers: ").append(toIndentedString(facebookStorytellers)).append("\n");
        sb.append("    instagramFollowers: ").append(toIndentedString(instagramFollowers)).append("\n");
        sb.append("    spotifyFollowers: ").append(toIndentedString(spotifyFollowers)).append("\n");
        sb.append("    spotifyPopularity: ").append(toIndentedString(spotifyPopularity)).append("\n");
        sb.append("    twitterFollowers: ").append(toIndentedString(twitterFollowers)).append("\n");
        sb.append("    youtubeChannelSubscribers: ").append(toIndentedString(youtubeChannelSubscribers)).append("\n");
        sb.append("    youtubeChannelViews: ").append(toIndentedString(youtubeChannelViews)).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    ");
    }
}
