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

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

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

import io.delphiplatform.api.util.model.ModelUtils;
import io.delphiplatform.api.v3.constant.ApplicationConstants;
import io.delphiplatform.api.v3.constant.DspConstants;
import io.delphiplatform.api.v3.model.PlaylistDates;
import io.delphiplatform.api.v3.model.PlaylistDatesAwareModel;
import io.delphiplatform.api.v3.model.PlaylistStreamingForPeriodsInfo;
import io.delphiplatform.api.v3.model.amazon.AmazonTrack;
import io.delphiplatform.api.v3.model.apple.AppleTrack;
import io.delphiplatform.api.v3.model.spotify.SpotifyTrack;
import lombok.Getter;
import lombok.Setter;


@Getter
@Setter
@JsonPropertyOrder(alphabetic = true)
public class PlaylistsTrackPositionsCurrentTracklist implements PlaylistDatesAwareModel {

    @JsonIgnore
    private String dsp;

    @JsonProperty("playlist_id")
    private String playlistId;

    @JsonIgnore
    private String countryCode;

    @JsonProperty("playlist_dates")
    private PlaylistDates playlistDates;

    @JsonProperty("isrc")
    private String isrc;

    @JsonProperty("track_id")
    private String trackId;

    @JsonProperty("apple_track")
    private AppleTrack appleTrack;

    @JsonProperty("spotify_track")
    private SpotifyTrack spotifyTrack;

    @JsonProperty("amazon_track")
    private AmazonTrack amazonTrack;

    @JsonProperty("num_tracks")
    protected Long numTracks;

    @JsonProperty("earliest_position_date_time")
    @JsonFormat(shape = Shape.STRING, pattern = ApplicationConstants.ISO_DATE_TIME_PATTERN)
    private LocalDateTime earliestPositionDateTime;

    @JsonProperty("earliest_position")
    private Long earliestPosition;

    @JsonProperty("last_added_date_time")
    @JsonFormat(shape = Shape.STRING, pattern = ApplicationConstants.ISO_DATE_TIME_PATTERN)
    private LocalDateTime lastAddedDateTime;

    @JsonProperty("current")
    private Long current;

    @JsonProperty("is_top_track_for_isrc")
    private Boolean isTopTrackForIsrc;

    @JsonProperty("previous_position_change_14_days")
    private Long previousPositionChange14Days;

    @JsonProperty("last_date_change_14_days")
    private LocalDate lastDateChange14Days;

    @JsonProperty("previous_position_date_time")
    @JsonFormat(shape = Shape.STRING, pattern = ApplicationConstants.ISO_DATE_TIME_PATTERN)
    private LocalDateTime previousPositionDateTime;

    @JsonProperty("trend_change_14_days")
    private Long trendChange14Days;

    @JsonProperty("num_days_on")
    private Long numDaysOn;

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

    @JsonProperty("country_code")
    public String getCountryCodeForRepresentation() {
        if (DspConstants.SPOTIFY.equals(this.dsp)) {
            return ModelUtils.publicSpotifyCountryCodeDataToRepresentationState(this.countryCode);
        }

        return countryCode;
    }

}
