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

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

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import io.delphiplatform.api.util.CollectionUtils;
import io.delphiplatform.api.v3.constant.DspConstants;
import io.delphiplatform.api.v3.model.Chart;
import io.delphiplatform.api.v3.rdb.entity.ChartEntity;
import io.delphiplatform.api.v3.rdb.repository.ChartRepository;

@Service
@Transactional(readOnly = true)
public class ChartService extends EntityService<ChartEntity> {

    private final ChartRepository chartRepository;

    @Autowired
    public ChartService(ChartRepository chartRepository) {
        super(chartRepository);
        this.chartRepository = chartRepository;
    }

    @Transactional(readOnly = true)
    public List<Chart> find(String chartGroup, Collection<String> dsps,
        Collection<String> countries, Pageable pageable) {
        Collection<String> dspsToQuery = CollectionUtils.isEmpty(dsps) ? DspConstants.ENABLED_DSPS : dsps;

        return chartRepository
            .findByDspAndChartGroupAndCountries(chartGroup, dspsToQuery, countries == null ? Collections.emptyList() : countries,
                pageable)
            .stream()
            .map(Chart::from)
            .collect(Collectors.toList());
    }

    @Transactional(readOnly = true)
    public Chart findOne(String chartId) {
        return chartRepository.findById(chartId).map(Chart::from).orElseThrow(NOT_FOUND);
    }
}
