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

import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import io.delphiplatform.api.v3.bigtable.entity.SpotifyPlaylistFollowersDaily;
import io.delphiplatform.api.v3.model.PublicPlaylistFollowers;

@Service
public class SpotifyPlaylistFollowersConverter {

    public Stream<PublicPlaylistFollowers> convertPlaylistFollowers(
        Stream<SpotifyPlaylistFollowersDaily> modelsStream
    ) {
        Map<String, List<SpotifyPlaylistFollowersDaily>> followersByPlaylistId = modelsStream.collect(Collectors.groupingBy(
            SpotifyPlaylistFollowersDaily::getPlaylistId
        ));

        return followersByPlaylistId.entrySet().stream().map(entry -> {
            String playlistId = entry.getKey();
            Map<LocalDate, Long> followersByDate = entry.getValue().stream()
                .collect(Collectors.toMap(SpotifyPlaylistFollowersDaily::getDate, SpotifyPlaylistFollowersDaily::getFollowers));

            return new PublicPlaylistFollowers(
                playlistId,
                followersByDate
            );
        });
    }

    public Stream<PublicPlaylistFollowers> buildEmptyModels(Collection<String> playlistIds) {
        return playlistIds.stream()
            .map(playlistId -> new PublicPlaylistFollowers(playlistId, new HashMap<>()));
    }
}
