package io.delphiplatform.api.v3.rdb.service;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

import io.delphiplatform.api.v3.model.tiktok.top.TikTokTopTracksAnalytics;
import io.delphiplatform.api.v3.rdb.entity.tiktok.FactTikTokTopTrackEntity;
import io.delphiplatform.api.v3.rdb.entity.tiktok.FactTikTokTopTrackEntityId;
import io.delphiplatform.api.v3.rdb.service.tiktok.TikTokTopAnalyticCollector;

public class TikTokTopAnalyticCollectorTest {

    private static final String ISRC = "DEC717900024";

    @Test
    void testGet() {
        FactTikTokTopTrackEntity entity1 = createFactTikTokTopTrackEntity(ISRC, LocalDate.of(2021, 02, 15), 10);
        FactTikTokTopTrackEntity entity2 = createFactTikTokTopTrackEntity(ISRC, LocalDate.of(2021, 02, 17), 7);
        FactTikTokTopTrackEntity entity3 = createFactTikTokTopTrackEntity(ISRC, LocalDate.of(2021, 02, 16), 4);

        TikTokTopTracksAnalytics result = Stream.of(entity1, entity2, entity3)
            .collect(TikTokTopAnalyticCollector.get());
        Assertions.assertEquals(3, result.getMetrics().getPositions().size());
        Assertions.assertEquals(List.of(10, 4, 7), result.getMetrics().getPositions());
        Assertions.assertEquals(ISRC, result.getIsrc());
    }

    @Test
    void testGetWithGapsBetweenDates() {
        FactTikTokTopTrackEntity entity1 = createFactTikTokTopTrackEntity(ISRC, LocalDate.of(2021, 02, 15), 10);
        FactTikTokTopTrackEntity entity2 = createFactTikTokTopTrackEntity(ISRC, LocalDate.of(2021, 01, 07), 18);
        FactTikTokTopTrackEntity entity4 = createFactTikTokTopTrackEntity(ISRC, LocalDate.of(2021, 02, 19), 4);
        FactTikTokTopTrackEntity entity5 = createFactTikTokTopTrackEntity(ISRC, LocalDate.of(2021, 02, 21), 90);

        TikTokTopTracksAnalytics result = Stream.of(entity1, entity2, entity4, entity5)
            .collect(TikTokTopAnalyticCollector.get());
        Assertions.assertEquals(46, result.getMetrics().getPositions().size());
        List<Integer> list = new ArrayList<>(100);
        for (int i = 0; i < 42; i++) {
            list.add(null);
        }
        list.add(0, 18);
        list.add(43, 90);
        list.add(42, 4);
        list.add(39, 10);
        Assertions.assertEquals(list, result.getMetrics().getPositions());
    }

    private FactTikTokTopTrackEntity createFactTikTokTopTrackEntity(String isrc, LocalDate date, Integer position) {
        FactTikTokTopTrackEntityId id = new FactTikTokTopTrackEntityId();
        id.setIsrc(isrc);
        id.setChartDate(date);
        FactTikTokTopTrackEntity factTikTokTopTrackEntity = new FactTikTokTopTrackEntity();
        factTikTokTopTrackEntity.setCurrentPosition(position);
        factTikTokTopTrackEntity.setId(id);
        return factTikTokTopTrackEntity;
    }
}
