package io.delphiplatform.api.integration.model;

import com.fasterxml.jackson.annotation.JsonProperty;

import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Map;

import io.delphiplatform.api.v3.model.PlaylistStreamingForPeriodsInfo;
import io.delphiplatform.api.v3.model.TrackSimple;
import io.delphiplatform.api.v3.model.amazon.AmazonTrackShortInfo;
import io.delphiplatform.api.v3.model.apple.AppleTrack;
import io.delphiplatform.api.v3.model.spotify.SpotifyTrack;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
public class PublicPlaylistTrackPositionModel {
    /* begin TrackPosition fields */

    @JsonProperty("isrc")
    private String isrc;

    @JsonProperty("dsp")
    private String dsp;

    @JsonProperty("current")
    private Long current;

    @JsonProperty("previous")
    private Long previous;

    @JsonProperty("top")
    private Integer top;

    @JsonProperty("num_weeks_on")
    private Integer numWeeksOn;

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

    /* end TrackPosition fields */

    /* begin PublicPlaylistTrackPosition fields */

    @JsonProperty("dsp_track_id")
    private String dspTrackId;

    @JsonProperty("playlist_id")
    private String playlistId;

    @JsonProperty("playlist")
    private PublicPlaylistModel playlist;

    @JsonProperty("streaming_info")
    private Map<String, PlaylistStreamingForPeriodsInfo> streamingInfo;

    @JsonProperty("trend")
    private Long trend;

    @JsonProperty("num_days_on")
    private Long daysInPlaylist;

    @JsonProperty("earliest_position_date_time")
    @DateTimeFormat(
        iso = DateTimeFormat.ISO.DATE_TIME)
    private LocalDateTime earliestPositionDateTime;

    @JsonProperty("latest_position_date_time")
    @DateTimeFormat(
        iso = DateTimeFormat.ISO.DATE_TIME)
    private LocalDateTime latestPositionDateTime;

    @JsonProperty("previous_position_change_14_days")
    private Long previousPositionChange14Days;

    @JsonProperty("trend_change_14_days")
    private Long trendChange14Days;

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

    @JsonProperty("is_top_track_for_isrc")
    private Boolean topTrackForIsrc;

    @JsonProperty("earliest_position")
    private Integer earliestPosition;

    @JsonProperty("last_added_date_time")
    private LocalDateTime lastAddedDateTime;

    @JsonProperty("track")
    private TrackSimple track;

    @JsonProperty("apple_track")
    private AppleTrack appleTrack;

    @JsonProperty("spotify_track")
    private SpotifyTrack spotifyTrack;

    @JsonProperty("amazon_track")
    private AmazonTrackShortInfo amazonTrack;

    /* end PublicPlaylistTrackPosition fields */
}
