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

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

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;

import io.delphiplatform.api.v3.rdb.entity.shazam.ShazamArtistIsrcEntity;
import io.delphiplatform.api.v3.rdb.repository.ShazamArtistIsrcRepository;

@Service
@Transactional(readOnly = true)
public class ShazamArtistService extends EntityService<ShazamArtistIsrcEntity> {

    private final ShazamArtistIsrcRepository repository;

    @Autowired
    public ShazamArtistService(ShazamArtistIsrcRepository repository) {
        super(repository);
        this.repository = repository;
    }

    public Map<String, List<String>> findByIsrcToArtistNames(Set<String> isrcs) {
        Map<String, List<ShazamArtistIsrcEntity>> isrcToArtists = repository.findByIsrcIn(isrcs)
            .stream()
            .collect(Collectors.groupingBy(ShazamArtistIsrcEntity::getIsrc));

        return isrcToArtists.entrySet().stream()
            .collect(Collectors.toMap(Entry::getKey,
                e -> e.getValue().stream()
                    .sorted(Comparator.comparing(ShazamArtistIsrcEntity::getOrdering))
                    .map(ShazamArtistIsrcEntity::getCmArtistName)
                    .collect(Collectors.toList())));
    }

}
