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

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

import java.time.LocalDate;

import io.delphiplatform.api.util.model.ModelUtils;
import io.delphiplatform.api.v3.constant.DspConstants;
import io.delphiplatform.api.v3.model.Playlist;
import io.delphiplatform.api.v3.model.PlaylistableModel;
import io.delphiplatform.api.v3.model.TrackAwareModel;
import io.delphiplatform.api.v3.model.TrackSimple;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicPlaylistTrackLifetimePublicEntity;
import io.delphiplatform.api.v3.rdb.entity.spotify.SpotifyPlaylistTrackLifetimePublicEntity;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Deprecated
@Builder
@Getter
@Setter
@EqualsAndHashCode
public class PlaylistTrackPreviousPosition implements PlaylistableModel, TrackAwareModel {

    @JsonIgnore
    private String countryCode;

    @JsonProperty("dsp")
    private String dsp;

    @JsonProperty("earliest_position_date")
    private LocalDate earliestPositionDate;

    @JsonProperty("removed_date")
    private LocalDate removedDate;

    @JsonProperty("isrc")
    private String isrc;

    @JsonProperty("num_days_on")
    private Long numDaysOn;

    @JsonProperty("playlist_id")
    private String playlistId;

    @JsonProperty("playlist")
    private Playlist playlist;

    @JsonProperty("track")
    private TrackSimple track;

    public static PlaylistTrackPreviousPosition from(
        SpotifyPlaylistTrackLifetimePublicEntity playlistTrackLifetimeEntity) {
        if (playlistTrackLifetimeEntity == null) {
            return null;
        }

        return PlaylistTrackPreviousPosition.builder()
            .dsp(DspConstants.SPOTIFY)
            .earliestPositionDate(playlistTrackLifetimeEntity.getEarliestDateTime().toLocalDate())
            .removedDate(playlistTrackLifetimeEntity.getLatestDateTime().toLocalDate())
            .isrc(playlistTrackLifetimeEntity.getIsrc())
            .numDaysOn(ModelUtils.getTrackDaysOnPlaylist(
                playlistTrackLifetimeEntity.getEarliestDateTime(),
                playlistTrackLifetimeEntity.getLatestDateTime()
            ))
            .playlistId(playlistTrackLifetimeEntity.getPlaylistId())
            .build();
    }

    public static PlaylistTrackPreviousPosition from(
        AppleMusicPlaylistTrackLifetimePublicEntity playlistTrackLifetimeEntity) {
        if (playlistTrackLifetimeEntity == null) {
            return null;
        }

        return PlaylistTrackPreviousPosition.builder()
            .countryCode(playlistTrackLifetimeEntity.getCountryCode())
            .dsp(DspConstants.APPLE)
            .earliestPositionDate(playlistTrackLifetimeEntity.getEarliestDateTime().toLocalDate())
            .removedDate(playlistTrackLifetimeEntity.getLatestDateTime().toLocalDate())
            .isrc(playlistTrackLifetimeEntity.getIsrc())
            .numDaysOn(ModelUtils.getTrackDaysOnPlaylist(
                playlistTrackLifetimeEntity.getEarliestDateTime(),
                playlistTrackLifetimeEntity.getLatestDateTime()
            ))
            .playlistId(playlistTrackLifetimeEntity.getPlaylistId())
            .build();
    }
}
