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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import io.delphiplatform.api.v3.model.tiktok.top.TikTokTopChart;
import io.delphiplatform.api.v3.model.tiktok.top.TikTokTopCharts;
import io.delphiplatform.api.v3.rdb.entity.tiktok.TikTokTopTrackChartEntity;
import io.delphiplatform.api.v3.rdb.repository.TikTokTopTrackChartRepository;
import io.delphiplatform.api.v3.rdb.service.EntityService;
import io.delphiplatform.api.v3.rdb.service.specification.SpecificationProvider;
import io.delphiplatform.api.v3.view.util.Params;

import static io.delphiplatform.api.v3.rdb.entity.CommonJpaPropertyNames.COUNTRY_CODE;
import static io.delphiplatform.api.v3.rdb.entity.CommonJpaPropertyNames.PERIOD_DAYS;
import static io.delphiplatform.api.v3.rdb.entity.CommonJpaPropertyNames.TYPE;

@Service
@Transactional(readOnly = true)
public class TikTokTopTrackChartsService extends EntityService<TikTokTopTrackChartEntity> {

    private final SpecificationProvider<TikTokTopTrackChartEntity> specificationProvider;

    @Autowired
    public TikTokTopTrackChartsService(TikTokTopTrackChartRepository repository,
        SpecificationProvider<TikTokTopTrackChartEntity> specificationProvider) {
        super(repository, null);
        this.specificationProvider = specificationProvider;
    }

    public TikTokTopCharts getTikTokTopCharts(Params params) {
        Specification<TikTokTopTrackChartEntity> spec = and(Arrays.asList(
            specificationProvider.multiValueSpec(PERIOD_DAYS, params.getPeriodDays()),
            specificationProvider.multiValueSpec(TYPE, params.getTikTokChartTypes()),
            specificationProvider.multiValueSpec(COUNTRY_CODE, params.getCountryCode())
        ));

        List<TikTokTopTrackChartEntity> entities = find(spec, getPageRequestSortByToCamelCase(params));
        List<TikTokTopChart> items = entities.stream().map(TikTokTopChart::of).collect(Collectors.toList());
        return new TikTokTopCharts(items);
    }

}
