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

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;

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

import io.delphiplatform.api.v3.rdb.entity.apple.ApplePlaylistTrackEntity;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@JsonPropertyOrder(alphabetic = true)
public class AppleTrack {

    @JsonProperty("track_id")
    private String trackId;

    @JsonIgnore
    private String countryCode;

    @JsonProperty("name")
    private String name;

    @JsonProperty("image_url")
    private String imageUrl;

    @JsonProperty("release_date")
    @DateTimeFormat(iso = ISO.DATE)
    private LocalDate releaseDate;

    @JsonProperty("is_sony")
    private boolean isSony;

    @JsonProperty("isrc")
    private String isrc;

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

    @JsonProperty("album")
    private AppleAlbum album;

    public static AppleTrack from(ApplePlaylistTrackEntity applePlaylistTrack) {
        if (applePlaylistTrack == null) {
            return null;
        }
        AppleTrack appleTrack = new AppleTrack();
        appleTrack.setTrackId(applePlaylistTrack.getApplePlaylistTrackEntityId().getAppleMusicTrackId());
        appleTrack.setCountryCode(applePlaylistTrack.getApplePlaylistTrackEntityId().getAppleMusicCountryId());
        appleTrack.setSony(applePlaylistTrack.isSony());
        appleTrack.setIsrc(applePlaylistTrack.getIsrc());
        appleTrack.setName(applePlaylistTrack.getName());

        AppleAlbum appleAlbum = new AppleAlbum();
        appleTrack.setAlbum(appleAlbum);
        if (applePlaylistTrack.getAppleAlbum() != null) {
            appleAlbum.setAlbumId(applePlaylistTrack.getAppleAlbum().getAppleAlbumEntityId().getAlbumId());
            appleAlbum.setName(applePlaylistTrack.getAppleAlbum().getName());
            appleAlbum.setImage(applePlaylistTrack.getAppleAlbum().getImageUrl());
            appleAlbum.setUpc(applePlaylistTrack.getAppleAlbum().getUpc());
            appleAlbum.setReleaseDate(applePlaylistTrack.getAppleAlbum().getReleaseDate());
        }

        String trackImageUrl = applePlaylistTrack.getImageUrl() != null
            ? applePlaylistTrack.getImageUrl()
            : appleAlbum.getImage();

        LocalDate trackReleaseDate = applePlaylistTrack.getReleaseDate() != null
            ? applePlaylistTrack.getReleaseDate()
            : appleAlbum.getReleaseDate();

        appleTrack.setImageUrl(trackImageUrl);
        appleTrack.setReleaseDate(trackReleaseDate);

        List<AppleArtist> appleArtists = applePlaylistTrack.getArtists().stream()
            .map(a -> AppleArtist.builder()
                .artistId(a.getApplePlaylistArtistEntityId().getAppleMusicArtistId())
                .name(a.getName())
                .url(a.getUrl())
                .build())
            .collect(Collectors.toList());
        appleTrack.setArtists(appleArtists);
        return appleTrack;
    }
}
