package io.delphiplatform.api.integration;

import org.junit.jupiter.api.Test;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import java.time.LocalDateTime;

import io.delphiplatform.api.integration.annotation.BigTable;
import io.delphiplatform.api.integration.annotation.SqlScript;
import io.delphiplatform.api.integration.util.MockCurrentDateService;
import io.delphiplatform.api.v3.model.PlaylistPublicPositionsDate;
import io.delphiplatform.api.v3.model.PlaylistPublicPositionsDates;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class TrackPositionsPlaylistsDatesIT extends BaseIT {

    /**
     * Checking population for Spotify, when countryCode on BT and PG 'spotify.fact_public_playlist_lifetime' are different
     * <p>
     * BT has 'global' as country code only. PG has 'fr' as country code for the 'spotify_07TMuI4hFRURvHh5ZgG4YK'. Test verify that
     * "dsp_sync_date_time" mapped correctly.
     */
    @Test
    @BigTable(table = "spotify_fact_public_playlist_daily", json =
        "/scripts/TrackPositionsPlaylistsDatesIT/BT_playlist_spotify_daily_getTrackPositionsDates_spotify_different_country_codes.json")
    @SqlScript(scripts = "/scripts/TrackPositionsPlaylistsDatesIT/common_test_data_set_1.sql")
    public void getTrackPositionsDates_spotify_different_country_codes() {
        MockCurrentDateService.setMockDateTime(LocalDateTime.parse("2023-02-21T00:00:00"));

        String spotifyPlaylistId = "spotify_07TMuI4hFRURvHh5ZgG4YK";
        ResponseEntity<PlaylistPublicPositionsDates> response = apiClient.sendAPIRequest(
            "/v3/public/track-positions/playlists/dates?"
                + "playlist_id=" + spotifyPlaylistId,
            PlaylistPublicPositionsDates.class
        );

        assertEquals(HttpStatus.OK, response.getStatusCode());
        assertEquals(1, response.getBody().getCount());

        PlaylistPublicPositionsDate publicPositionsDate = response.getBody().getItems().get(0);
        assertEquals(spotifyPlaylistId, publicPositionsDate.getPlaylistId());
        //assertEquals("fr", publicPositionsDate.getCountryCode()); // not mapped, field under @JsonIgnore annotation
        assertEquals(LocalDateTime.parse("2018-02-09T16:05:21"), publicPositionsDate.getDspUpdateDateTime());
        assertEquals(LocalDateTime.parse("2023-01-21T10:50:05"), publicPositionsDate.getPlaylistUpdatedAtDateTime());
        assertNotNull(publicPositionsDate.getDspSyncDateTime());
        assertEquals(7, publicPositionsDate.getDspSyncDateTime().size());
    }
}
