package io.delphiplatform.api.v3.model.charts;

import com.fasterxml.jackson.annotation.JsonProperty;

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

import io.delphiplatform.api.util.CollectionUtils;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicArtistLocalizedEntity;
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.spotify.SpotifyTrackEntity;
import lombok.Data;

@Data
public class ChartTrackMetadata {

    @JsonProperty("track_id")
    private String trackId;

    @JsonProperty("isrc")
    private String isrc;

    @JsonProperty("artists")
    private List<ChartTrackArtistMetadata> artists;

    @JsonProperty("uri")
    private String uri;

    @JsonProperty("release_date")
    private String releaseDate;

    @JsonProperty("image_url")
    private String imageUrl;

    @JsonProperty("name")
    private String name;

    public static ChartTrackMetadata of(SpotifyTrackEntity entity) {
        if (entity == null) {
            return null;
        }
        ChartTrackMetadata metadata = new ChartTrackMetadata();
        metadata.setTrackId(entity.getId().getSpotifyTrackId());
        metadata.setIsrc(entity.getIsrc());
        if (CollectionUtils.isNotEmpty(entity.getArtists())) {
            metadata.setArtists(entity.getArtists().stream()
                .map(ChartTrackArtistMetadata::of)
                .collect(Collectors.toList())
            );
        }
        metadata.setUri(entity.getUri());
        metadata.setReleaseDate(entity.getReleaseDate());
        metadata.setImageUrl(entity.getImageUrl());
        metadata.setName(entity.getName());
        return metadata;
    }

    public static ChartTrackMetadata of(AppleMusicTrackLocalizedEntity entity,
        List<AppleMusicArtistLocalizedEntity> artists) {
        if (entity == null) {
            return null;
        }
        AppleMusicTrackEntity track = entity.getTrack();
        ChartTrackMetadata metadata = new ChartTrackMetadata();
        metadata.setTrackId(track.getAppleMusicTrackId());
        metadata.setIsrc(track.getIsrc());
        if (CollectionUtils.isNotEmpty(artists)) {
            metadata.setArtists(artists.stream()
                .map(ChartTrackArtistMetadata::of)
                .collect(Collectors.toList())
            );
        }
        metadata.setUri(entity.getUrl());
        metadata.setReleaseDate(track.getReleaseDate());
        metadata.setImageUrl(track.getArtworkUrl());
        metadata.setName(entity.getName());

        return metadata;
    }
}

