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

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
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.util.CollectionUtils;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicTrackEntity;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicTrackLocalizedEntity;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicTrackLocalizedId;
import io.delphiplatform.api.v3.rdb.repository.apple.music.AppleMusicTrackLocalizedRepository;
import io.delphiplatform.api.v3.rdb.repository.apple.music.AppleMusicTrackRepository;
import io.delphiplatform.api.v3.rdb.service.EntityService;

@Service
@Transactional(readOnly = true)
public class AppleMusicTrackService extends EntityService<AppleMusicTrackEntity> {

    private final AppleMusicTrackRepository trackRepository;
    private final AppleMusicTrackLocalizedRepository trackLocalizedRepository;

    public AppleMusicTrackService(
        AppleMusicTrackRepository trackRepository,
        AppleMusicTrackLocalizedRepository trackLocalizedRepository
    ) {
        super(trackRepository);
        this.trackRepository = trackRepository;
        this.trackLocalizedRepository = trackLocalizedRepository;
    }

    public Set<AppleMusicTrackEntity> findTracksWithArtistsByTrackIds(Collection<String> trackIds) {
        return trackRepository.findTracksWithArtistsByTrackIds(trackIds);
    }

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

    public Set<String> findAppleMusicTrackIds(Collection<String> trackIds, Collection<String> isrcs) {
        if (CollectionUtils.isNotEmpty(trackIds)) {
            return new HashSet<>(trackIds);
        }
        if (CollectionUtils.isEmpty(isrcs)) {
            return Collections.emptySet();
        }

        return new HashSet<>(trackRepository.findAppleMusicTrackIdByIsrc(isrcs));
    }

    public Map<AppleMusicTrackLocalizedId, AppleMusicTrackLocalizedEntity> findTrackIdToTrack(
        List<AppleMusicTrackLocalizedId> trackLocalizedIds) {
        return trackLocalizedRepository.findAllByIdIn(trackLocalizedIds)
            .stream()
            .collect(Collectors.toMap(AppleMusicTrackLocalizedEntity::getId, Function.identity()));
    }

    public List<AppleMusicTrackEntity> findAllById(Collection<String> ids) {
        return trackRepository.findAllById(ids);
    }
}
