package io.delphiplatform.api.v3.bigtable;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;

import javax.transaction.NotSupportedException;

import io.delphiplatform.api.v3.constant.DspConstants;
import io.delphiplatform.api.v3.model.IncludeTracklistPlaylist;
import io.delphiplatform.api.v3.model.trackposition.PlaylistTrackPosition;
import io.delphiplatform.api.v3.view.util.Params;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

public class BigtableTrackPositionDataEnrichmentServiceTest {

    private BigtableTrackPositionDataEnrichmentService service;

    @Mock
    private BigtableStreamsService bigtableStreamsService;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        service = new BigtableTrackPositionDataEnrichmentService(
            null,
            null,
            bigtableStreamsService,
            null,
            null
        );
    }

    @Test
    void populatePlaylistStreamsForXDaysPeriods_emptyStreamsListWontThrowErrors() {
        Params params = Params.builder()
            .include(List.of(IncludeTracklistPlaylist.STREAMS_FOR_PERIOD.getValue()))
            .startDate(LocalDate.of(2022, 1, 17))
            .endDate(LocalDate.of(2022, 1, 25))
            .dsp(List.of(DspConstants.AMAZON))
            .build();

        ArrayList<PlaylistTrackPosition> models = new ArrayList<>();
        PlaylistTrackPosition p1 = new PlaylistTrackPosition();
        p1.setIsrc("USSM12103949");
        p1.setPlaylistId("pl.123");
        p1.setDsp(DspConstants.AMAZON);

        models.add(p1);

        try {
            when(bigtableStreamsService.getRows(any(Params.class)))
                .thenReturn(CompletableFuture.completedFuture(Collections.emptyList()));
        } catch (NotSupportedException e) {
            Assertions.fail("exception thrown", e);
        }

        try {
            service.populatePlaylistStreamsForXDaysPeriods(models.stream(), params);
        } catch (Exception e) {
            Assertions.fail("exception thrown", e);
        }
    }
}
