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

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

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

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

public class TikTokTrackAnalyticsRangeMetricsTest {

    private static final LocalDate DATE_1 = LocalDate.of(2020, 1, 1);
    private static final LocalDate DATE_2 = LocalDate.of(2020, 1, 2);

    @Test
    void testVideoViewsField() throws JsonProcessingException {
        TikTokTrackAnalyticsRangeMetrics breakdowns = new TikTokTrackAnalyticsRangeMetrics();
        breakdowns.setVideoViewsByDate(Map.of(DATE_1, 1l, DATE_2, 2L));
        ObjectMapper objectMapper = new ObjectMapper();
        String result = objectMapper.writeValueAsString(breakdowns);
        Assertions.assertTrue(result.contains("video_views"));
        Assertions.assertFalse(result.contains("videoViews"));
    }

    @Test
    void testClearFieldsNull() {
        TikTokTrackAnalyticsRangeMetrics metrics = getTikTokTrackAnalyticsRangeMetrics();
        metrics.clearFields(null);

        Assertions.assertNotNull(metrics.getSharesByDate());
        Assertions.assertNotNull(metrics.getLikesByDate());
        Assertions.assertNotNull(metrics.getFavoritesByDate());
        Assertions.assertNotNull(metrics.getCommentsByDate());
        Assertions.assertNotNull(metrics.getCreationsByDate());
        Assertions.assertNotNull(metrics.getVideoViewsByDate());
    }

    @Test
    void testClearFields() {
        TikTokTrackAnalyticsRangeMetrics metrics = getTikTokTrackAnalyticsRangeMetrics();

        metrics.clearFields(Set.of(TikTokMetric.COMMENTS, TikTokMetric.CREATIONS, TikTokMetric.FAVORITES));

        Assertions.assertNotNull(metrics.getSharesByDate());
        Assertions.assertNotNull(metrics.getLikesByDate());
        Assertions.assertNotNull(metrics.getVideoViewsByDate());

        Assertions.assertNull(metrics.getFavoritesByDate());
        Assertions.assertNull(metrics.getCommentsByDate());
        Assertions.assertNull(metrics.getCreationsByDate());
    }

    private TikTokTrackAnalyticsRangeMetrics getTikTokTrackAnalyticsRangeMetrics() {
        TikTokTrackAnalyticsRangeMetrics metrics = new TikTokTrackAnalyticsRangeMetrics();
        metrics.setSharesByDate(Map.of(DATE_1, 1L, DATE_2, 2L));
        metrics.setLikesByDate(Map.of(DATE_1, 11L, DATE_2, 2L));
        metrics.setFavoritesByDate(Map.of(DATE_2, 21L));
        metrics.setCommentsByDate(Map.of(DATE_1, 121L));
        metrics.setCreationsByDate(Map.of(DATE_2, 21L));
        metrics.setVideoViewsByDate(Map.of(DATE_1, 76L, DATE_2, 822L));
        return metrics;
    }

}
