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

import com.google.common.collect.Maps;

import org.junit.jupiter.api.Test;

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

import fr.xebia.extras.selma.Selma;
import io.delphiplatform.api.v3.model.PlaylistDates;
import io.delphiplatform.api.v3.model.PlaylistStreamingForPeriodsInfo;
import io.delphiplatform.api.v3.model.PublicPlaylist;
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 io.delphiplatform.api.v3.model.trackposition.PlaylistsTrackPositionsCurrentTracklist;
import io.delphiplatform.api.v3.model.trackposition.PublicPlaylistTrackPosition;

import static org.assertj.core.api.Assertions.assertThat;

class PlaylistTrackPositionMapperTest {

    private final PlaylistTrackPositionMapper playlistTrackPositionMapper = Selma.builder(PlaylistTrackPositionMapper.class).build();

    @Test
    void toCurrentTrackPublicPosition() {
        PublicPlaylistTrackPosition source = new PublicPlaylistTrackPosition();
        String dsp_track_id = "dsp_track_id";
        String countryCode = "us";
        String isrc = "ISRC";
        String dsp = "apple";
        long current = 10L;
        long previous = 20L;
        int top = 1;
        int numWeeksOn = 10;
        long numTracks = 20L;
        LocalDate date = LocalDate.of(2020, 1, 1);
        String playlistId = "playlist_id";
        PublicPlaylist playlist = new PublicPlaylist();
        PlaylistDates playlistDates = new PlaylistDates(null, null, null);
        PublicPlaylist transientPlaylist = new PublicPlaylist();
        HashMap<String, PlaylistStreamingForPeriodsInfo> streamingInfo = Maps.newHashMap();
        long trend = -23L;
        long daysInPlaylist = 70L;
        LocalDateTime previousPositionDateTime = LocalDateTime.of(2022, 1, 2, 1, 1);
        LocalDateTime earliestPositionDateTime = LocalDateTime.of(2022, 1, 1, 1, 1);
        LocalDateTime latestPositionDateTime = LocalDateTime.of(2022, 1, 4, 1, 1);
        long previousPositionChange14Days = 23L;
        long trendChange14Days = 42L;
        LocalDate lastDateChange14Days = LocalDate.of(2020, 1, 2);
        boolean topTrackForIsrc = false;
        long earliestPosition = 100L;
        LocalDateTime lastAddedDateTime = LocalDateTime.of(2020, 1, 1, 1, 1);
        TrackSimple track = new TrackSimple();
        AppleTrack appleTrack = new AppleTrack();
        SpotifyTrack spotifyTrack = new SpotifyTrack();
        AmazonTrackShortInfo amazonTrack = AmazonTrackShortInfo.builder().build();

        source.setDspTrackId(dsp_track_id);
        source.setCountryCode(countryCode);
        source.setIsrc(isrc);
        source.setDsp(dsp);
        source.setCurrent(current);
        source.setPrevious(previous);
        source.setTop(top);
        source.setNumWeeksOn(numWeeksOn);
        source.setNumTracks(numTracks);
        source.setDate(date);
        source.setPlaylistId(playlistId);
        source.setPlaylist(playlist);
        source.setPlaylistDates(playlistDates);
        source.setTransientPlaylist(transientPlaylist);
        source.setStreamingInfo(streamingInfo);
        source.setTrend(trend);
        source.setDaysInPlaylist(daysInPlaylist);
        source.setPreviousPositionDateTime(previousPositionDateTime);
        source.setEarliestPositionDateTime(earliestPositionDateTime);
        source.setLatestPositionDateTime(latestPositionDateTime);
        source.setPreviousPositionChange14Days(previousPositionChange14Days);
        source.setTrendChange14Days(trendChange14Days);
        source.setLastDateChange14Days(lastDateChange14Days);
        source.setTopTrackForIsrc(topTrackForIsrc);
        source.setEarliestPosition(earliestPosition);
        source.setLastAddedDateTime(lastAddedDateTime);
        source.setTrack(track);
        source.setAppleTrack(appleTrack);
        source.setSpotifyTrack(spotifyTrack);
        source.setAmazonTrack(amazonTrack);

        PlaylistsTrackPositionsCurrentTracklist result = playlistTrackPositionMapper.toCurrentTrackPublicPosition(
            source);
        assertThat(result.getCountryCodeForRepresentation()).isEqualTo(countryCode);
        assertThat(result.getDsp()).isEqualTo(dsp);
        assertThat(result.getPlaylistId()).isEqualTo(playlistId);
        assertThat(result.getCountryCode()).isEqualTo(countryCode);
        assertThat(result.getPlaylistDates()).isNull();
        assertThat(result.getIsrc()).isEqualTo(isrc);
        assertThat(result.getTrackId()).isEqualTo(dsp_track_id);
        assertThat(result.getAppleTrack()).isNull();
        assertThat(result.getSpotifyTrack()).isNull();
        assertThat(result.getAmazonTrack()).isNull();
        assertThat(result.getNumTracks()).isEqualTo(numTracks);
        assertThat(result.getEarliestPositionDateTime()).isEqualTo(earliestPositionDateTime);
        assertThat(result.getEarliestPosition()).isEqualTo(earliestPosition);
        assertThat(result.getLastAddedDateTime()).isEqualTo(lastAddedDateTime);
        assertThat(result.getCurrent()).isEqualTo(current);
        assertThat(result.getIsTopTrackForIsrc()).isNull();
        assertThat(result.getPreviousPositionChange14Days()).isEqualTo(previousPositionChange14Days);
        assertThat(result.getLastDateChange14Days()).isEqualTo(lastDateChange14Days);
        assertThat(result.getPreviousPositionDateTime()).isEqualTo(previousPositionDateTime);
        assertThat(result.getTrendChange14Days()).isEqualTo(trendChange14Days);
        assertThat(result.getNumDaysOn()).isEqualTo(daysInPlaylist);
        assertThat(result.getStreamingInfo()).isNull();

    }
}