package io.delphiplatform.api.v3.model.tiktok.top;

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

import java.time.LocalDate;
import java.util.List;
import java.util.Set;

import io.delphiplatform.api.v3.model.tiktok.TikTokStateMetric;
import io.delphiplatform.api.v3.rdb.entity.tiktok.FactTikTokTopTrackEntity;
import io.delphiplatform.api.v3.rdb.entity.tiktok.FactTikTokTopTrackEntityId;

public class TikTokTopChartTrackStateTest {

    private static final LocalDate DATE_1 = LocalDate.of(2020, 1, 10);
    private static final LocalDate DATE_2 = LocalDate.of(2020, 1, 5);
    private static final String CHART_ID = "top50_1day_isrc_period_creations_AD";
    private static final String ISRC = "ES5021300743";
    private static final String ISRC_2 = "AA2321300743";

    @Test
    void testOfNull() {
        Assertions.assertNull(TikTokTopChartTrackState.of(null, null, null, null));
    }

    @Test
    void testOfMetrics() {
        FactTikTokTopTrackEntity factTikTokTopTrackEntity = getFactTikTokTopTrackEntity(null);
        TikTokTopChartTrackState result =
            TikTokTopChartTrackState.of(factTikTokTopTrackEntity,
                Set.of(TikTokStateMetric.METRICS), null, null);
        Assertions.assertNull(result.getLifetimeMetrics());
        Assertions.assertNull(result.getAggregatedMetrics());
        Assertions.assertNull(result.getSourceMeta());
        Assertions.assertEquals(DATE_1, result.getMetrics().getDate());
        Assertions.assertEquals(DATE_2, result.getMetrics().getPreviousDate());
        Assertions.assertEquals(factTikTokTopTrackEntity.getCurrentPosition(), result.getMetrics().getPosition());
        Assertions.assertEquals(factTikTokTopTrackEntity.getPrevPosition(), result.getMetrics().getPreviousPosition());
        Assertions.assertEquals(factTikTokTopTrackEntity.getIsEntry(), result.getMetrics().getIsEntry());
    }

    @Test
    void testOfAggMetrics() {
        FactTikTokTopTrackEntity factTikTokTopTrackEntity = getFactTikTokTopTrackEntity(List.of("FR", "IT"));
        TikTokTopChartTrackState result =
            TikTokTopChartTrackState.of(factTikTokTopTrackEntity,
                Set.of(TikTokStateMetric.AGGREGATED_METRICS), null, null);
        Assertions.assertNull(result.getLifetimeMetrics());
        Assertions.assertNull(result.getMetrics());
        Assertions.assertNull(result.getSourceMeta());
        TikTokTopChartTrackAggregatedMetrics aggregatedMetrics = result.getAggregatedMetrics();
        Assertions.assertNotNull(aggregatedMetrics);
        Assertions.assertEquals(List.of("FR", "IT"), aggregatedMetrics.getLast7DayTopMarkets());
        Assertions.assertEquals(factTikTokTopTrackEntity.getPrevious1DayCreations(),
            aggregatedMetrics.getPrevious1DayCreations());
        Assertions.assertEquals(factTikTokTopTrackEntity.getPreviousWeek7DayCreations(),
            aggregatedMetrics.getPreviousWeek7DayCreations());
        Assertions.assertEquals(factTikTokTopTrackEntity.getOnChartDays(),
            aggregatedMetrics.getOnChartStreakDays());
    }

    private FactTikTokTopTrackEntity getFactTikTokTopTrackEntity(List<String> last7DayTopMarkets) {
        FactTikTokTopTrackEntityId id = new FactTikTokTopTrackEntityId();
        id.setChartId(CHART_ID);
        id.setIsrc(ISRC);
        id.setChartDate(DATE_1);

        FactTikTokTopTrackEntity factTikTokTopTrackEntity = new FactTikTokTopTrackEntity();
        factTikTokTopTrackEntity.setId(id);
        factTikTokTopTrackEntity.setCurrentPosition(101);
        factTikTokTopTrackEntity.setPrevChartDate(DATE_2);
        factTikTokTopTrackEntity.setOnChartDays(2);
        factTikTokTopTrackEntity.setPrevPosition(20);
        factTikTokTopTrackEntity.setIsExit(true);
        factTikTokTopTrackEntity.setIsEntry(true);

        factTikTokTopTrackEntity.setPrevious1DayCreations(1L);
        factTikTokTopTrackEntity.setCreations(2L);
        factTikTokTopTrackEntity.setPreviousWeek1DayCreations(3L);
        factTikTokTopTrackEntity.setPreviousWeek7DayCreations(4L);
        factTikTokTopTrackEntity.setLast7DayTopMarkets(last7DayTopMarkets == null
            ? null : last7DayTopMarkets.toArray(new String[0]));

        return factTikTokTopTrackEntity;
    }

}
