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

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

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

import io.delphiplatform.api.v3.rdb.entity.spotify.SpotifyTrackEntity;
import io.delphiplatform.api.v3.rdb.entity.spotify.SpotifyTrackId;
import io.delphiplatform.api.v3.rdb.repository.spotify.SpotifyTrackRepository;
import io.delphiplatform.api.v3.rdb.service.EntityService;

@Service
@Transactional(readOnly = true)
public class SpotifyTrackService extends EntityService<SpotifyTrackEntity> {

    private final SpotifyTrackRepository trackRepository;

    @Autowired
    public SpotifyTrackService(SpotifyTrackRepository repository) {
        super(repository);
        trackRepository = repository;
    }

    public Map<SpotifyTrackId, SpotifyTrackEntity> findTrackIdToTrack(Set<SpotifyTrackId> trackIds) {
        return trackRepository.findAllByIdIn(trackIds).stream()
            .collect(Collectors.toMap(SpotifyTrackEntity::getId, Function.identity()));
    }

    public Set<SpotifyTrackId> findTracksWithSameIsrc(Set<SpotifyTrackId> trackIds) {
        return trackRepository.findTracksWithSameIsrcByTrackIds(trackIds);
    }

    public Set<String> findTracksWithSameIsrcByTrackId(List<String> trackId) {
        return trackRepository.findTracksWithSameIsrcByTrackIdStrings(trackId);
    }

    public List<SpotifyTrackEntity> findAllById(Collection<SpotifyTrackId> ids) {
        return trackRepository.findAllById(ids);
    }
}
