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

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;

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

import io.delphiplatform.api.v3.model.datahealth.DataHealthChartPosition;
import io.delphiplatform.api.v3.rdb.repository.FactShazamChartRepository;
import io.delphiplatform.api.v3.rdb.repository.FactTrendingVideoChartDailyRepository;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;

class DataHealthChartPositionServiceTest {

    private static final LocalDate DATE_1 = LocalDate.of(2018, 1, 17);
    private static final LocalDate DATE_2 = LocalDate.of(2020, 10, 8);
    private static final LocalDate DATE_3 = LocalDate.of(2019, 5, 23);
    private static final LocalDate DATE_4 = LocalDate.of(2021, 11, 8);

    @Spy
    @InjectMocks
    private DataHealthChartPositionService dataHealthChartPositionService;

    @Mock
    private FactTrendingVideoChartDailyRepository factTrendingVideoChartDailyRepository;

    @Mock
    private FactShazamChartRepository factShazamChartRepository;

    @BeforeEach
    public void setUp() {
        factTrendingVideoChartDailyRepository = mock(FactTrendingVideoChartDailyRepository.class);
        factShazamChartRepository = mock(FactShazamChartRepository.class);
        initMocks(this);
    }

    @Test
    void getIsrcsForVideos_listOfIsrc() {
        DataHealthChartPosition dataHealthChartPosition1 =
            new DataHealthChartPosition("shazam_top", "shazam", DATE_1, DATE_2);
        DataHealthChartPosition dataHealthChartPosition2 =
            new DataHealthChartPosition("youtube_trending", "youtube", DATE_3, DATE_4);
        when(factTrendingVideoChartDailyRepository.getMinMaxDates()).thenReturn(List.of(dataHealthChartPosition1));
        when(factShazamChartRepository.getMinMaxDates()).thenReturn(dataHealthChartPosition2);
        List<DataHealthChartPosition> result = dataHealthChartPositionService.getDataHealthChartPositions(null);
        assertEquals(2, result.size());
        assertEquals(dataHealthChartPosition1, result.get(0));
        assertEquals(dataHealthChartPosition2, result.get(1));
    }
}
