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

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 org.openapitools.jackson.nullable.JsonNullable;

import java.util.List;

import io.delphiplatform.api.v3.model.ArtistSimple;
import io.delphiplatform.api.v3.model.ads.AdDimensions;
import io.delphiplatform.api.v3.model.ads.GroupByAdsPerformance;
import io.delphiplatform.api.v3.rdb.service.ArtistService;
import io.delphiplatform.api.v3.rdb.service.dto.ReportQueryResponse;

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

public class AdsResponseGroupByMappingServiceTest {

    private static final String ID_1 = "22";
    private static final String NAME_1 = "name1";
    private static final String ID_2 = "44";

    @Spy
    @InjectMocks
    private AdsResponseGroupByMappingService service;

    @Mock
    private
    ArtistService artistService = mock(ArtistService.class);

    @BeforeEach
    public void setUp() {
        initMocks(this);
    }

    @Test
    void testMapAllDimenstionsForArtist() {
        ArtistSimple artistSimple = new ArtistSimple(ID_1);
        artistSimple.setFirstName(JsonNullable.of(NAME_1));
        when(artistService.findAllById(List.of(ID_1, ID_2))).thenReturn(List.of(artistSimple));

        ReportQueryResponse reportQueryResponse1 = new ReportQueryResponse(new Object[]{1}, new Object[]{"22"});
        ReportQueryResponse reportQueryResponse2 = new ReportQueryResponse(new Object[]{5}, new Object[]{"44"});

        List<AdDimensions> result =
            service.mapAllDimensions(List.of(reportQueryResponse1, reportQueryResponse2),
                List.of(GroupByAdsPerformance.ARTIST));
        assertEquals(2, result.size());
        assertEquals(ID_1, result.get(0).getArtist().getArtistId());
        assertEquals(JsonNullable.of(NAME_1), result.get(0).getArtist().getFirstName());
        assertNotNull(result.get(1).getArtist());
        assertEquals(ID_2, result.get(1).getArtist().getArtistId());
        assertEquals(JsonNullable.undefined(), result.get(1).getArtist().getFirstName());
    }

}
