package io.delphiplatform.api.integration;

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

import io.delphiplatform.api.integration.annotation.SqlScript;
import io.delphiplatform.api.v3.model.tiktok.top.video.TikTokTopIsrcVideo;
import io.delphiplatform.api.v3.model.tiktok.top.video.TikTokTopIsrcVideoLifetimeMetrics;
import io.delphiplatform.api.v3.model.tiktok.top.video.TikTokTopIsrcVideoMetrics;
import io.delphiplatform.api.v3.model.tiktok.top.video.TikTokTopIsrcVideos;
import io.delphiplatform.api.v3.model.tiktok.top.video.TikTokTopVideo;

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

public class TikTokTopIsrcVideoIT extends BaseIT {

    @Test
    @SqlScript(scripts = "/scripts/TikTokTopIsrcVideoIT/tiktokTopVideos_singleIsrc.sql")
    public void tiktokTopVideos_singleIsrc() {
        String isrc1 = "USQX91901111";
        ResponseEntity<TikTokTopIsrcVideos> response = apiClient.sendAPIRequest(
            String.format("/v3/tiktok/isrc/top/videos?isrc=%s&top_by=views", isrc1), TikTokTopIsrcVideos.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());
        TikTokTopIsrcVideos topIsrcVideos = response.getBody();
        Assertions.assertNotNull(topIsrcVideos);
        assertEquals(10, topIsrcVideos.getCount());

        TikTokTopIsrcVideo isrcVideo0 = topIsrcVideos.getItems().get(0);
        TikTokTopVideo video0 = isrcVideo0.getVideo();

        assertEquals("video_2", video0.getVideoId(), topIsrcVideos.toString());
        assertEquals("user1", video0.getUsername(), topIsrcVideos.toString());
        assertEquals("https://www.tiktok.com/@user1", video0.getUserUrl(), topIsrcVideos.toString());
        assertEquals("https://www.tiktok.com/@user1/video/video_2", video0.getVideoUrl(), topIsrcVideos.toString());

        TikTokTopIsrcVideoMetrics metrics0 = isrcVideo0.getMetrics();
        assertEquals(5, metrics0.getViewGrowth7Days(), topIsrcVideos.toString());
        assertEquals(7, metrics0.getViewGrowth28Days(), topIsrcVideos.toString());
        assertEquals(50, metrics0.getViewGrowth7DaysPercent().intValue(), topIsrcVideos.toString());
        assertEquals(70, metrics0.getViewGrowth28DaysPercent().intValue(), topIsrcVideos.toString());

        TikTokTopIsrcVideoLifetimeMetrics lifetime0 = isrcVideo0.getLifetime();
        assertEquals(100, lifetime0.getViews(), topIsrcVideos.toString());
        assertEquals(100, lifetime0.getLikes(), topIsrcVideos.toString());
        assertEquals(1000, lifetime0.getComments(), topIsrcVideos.toString());

        assertEquals(0, isrcVideo0.getPosition(), topIsrcVideos.toString());

        int i = 0;
        assertEquals("video_2", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_1", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_3", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_5", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_4", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_6", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_8", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_7", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_10", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_9", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
    }


    @Test
    @SqlScript(scripts = "/scripts/TikTokTopIsrcVideoIT/tiktokTopVideos_relatedIsrcs.sql")
    public void tiktokTopVideos_relatedIsrcs() {
        String isrc1 = "USQX91901111";
        ResponseEntity<TikTokTopIsrcVideos> response = apiClient.sendAPIRequest(
            String.format("/v3/tiktok/isrc/top/videos?isrc=%s&top_by=views_growth_7_days&expand_to=related_isrcs", isrc1),
            TikTokTopIsrcVideos.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());
        TikTokTopIsrcVideos topIsrcVideos = response.getBody();
        Assertions.assertNotNull(topIsrcVideos);
        System.out.println(topIsrcVideos);
        assertEquals(10, topIsrcVideos.getCount());

        int i = 0;
        assertEquals("video_common", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_isrc1_1", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_isrc2_1", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_isrc1_2", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_isrc2_2", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_isrc1_3", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_isrc2_3", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_isrc1_4", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_isrc2_4", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_isrc1_5", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());

        int currentValue = Integer.MAX_VALUE;

        for (TikTokTopIsrcVideo item : topIsrcVideos.getItems()) {
            assertTrue(item.getMetrics().getViewGrowth7Days() < currentValue);
            currentValue = item.getMetrics().getViewGrowth7Days();
        }
    }

    @Test
    @SqlScript(scripts = "/scripts/TikTokTopIsrcVideoIT/tiktokTopVideos_singleIsrcSameMetricValue.sql")
    public void tiktokTopVideos_singleIsrcSameMetricValue() {
        String isrc1 = "USQX91901111";
        ResponseEntity<TikTokTopIsrcVideos> response = apiClient.sendAPIRequest(
            String.format("/v3/tiktok/isrc/top/videos?isrc=%s&top_by=views&expand_to=related_isrcs", isrc1),
            TikTokTopIsrcVideos.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());
        TikTokTopIsrcVideos topIsrcVideos = response.getBody();
        Assertions.assertNotNull(topIsrcVideos);
        System.out.println(topIsrcVideos);
        assertEquals(10, topIsrcVideos.getCount());

        int i = 0;
        assertEquals("video_1", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_10", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_2", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_3", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_4", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_5", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_6", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_7", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_8", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());
        assertEquals("video_9", topIsrcVideos.getItems().get(i++).getVideo().getVideoId());

        int currentValue = Integer.MAX_VALUE;

        for (TikTokTopIsrcVideo item : topIsrcVideos.getItems()) {
            assertTrue(item.getLifetime().getViews() <= currentValue);
            currentValue = item.getLifetime().getViews();
        }
    }

}
