package io.delphiplatform.api.v3.bigtable.processing;

import org.springframework.stereotype.Service;

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

import io.delphiplatform.api.util.model.ModelUtils;
import io.delphiplatform.api.v3.bigtable.processing.groupbykey.TikTokIsrcTopSoundGroupByKey;
import io.delphiplatform.api.v3.model.tiktok.top.sound.TikTokTopIsrcSound;

@Service
public class TikTokIsrcTopSoundAggregator {

    public Stream<TikTokTopIsrcSound> groupBy(Stream<TikTokTopIsrcSound> isrcTopSounds) {
        List<GroupByFieldEnum> groupByFields = getGroupByFields();
        return groupBy(isrcTopSounds, groupByFields);
    }

    private Stream<TikTokTopIsrcSound> groupBy(Stream<TikTokTopIsrcSound> isrcTopSounds, List<GroupByFieldEnum> groupByFields) {
        return isrcTopSounds
            .collect(Collectors.groupingBy(followers -> new TikTokIsrcTopSoundGroupByKey(followers, groupByFields)))
            .entrySet().stream()
            .map(entry -> {
                TikTokIsrcTopSoundGroupByKey key = entry.getKey();
                List<TikTokTopIsrcSound> group = entry.getValue();
                TikTokTopIsrcSound sum = ModelUtils.mergeTikTokTopIsrcSounds(group);
                key.populateTikTokTopIsrcSound(sum);
                return sum;
            });
    }

    private List<GroupByFieldEnum> getGroupByFields() {
       return List.of(GroupByFieldEnum.DATE, GroupByFieldEnum.SOUND_ID, GroupByFieldEnum.CONTENT_TYPE);
    }

}
