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

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

import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

import io.delphiplatform.api.v3.model.ArtistSimple;
import io.delphiplatform.api.v3.rdb.entity.amazon.AmazonAlbumEntity;
import io.delphiplatform.api.v3.rdb.entity.amazon.AmazonTrackEntity;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@JsonPropertyOrder(alphabetic = true)
@Getter
@Setter
@EqualsAndHashCode
@Builder
public class AmazonTrack {

    @JsonProperty("amazon_track_id")
    private String amazonTrackId;

    @JsonProperty("amazon_track_genre")
    private String amazonTrackGenre;

    @JsonProperty("name")
    private String name;

    @JsonProperty("isrc")
    private String isrc;

    @JsonProperty("genre")
    private String genre;

    @JsonProperty("original_id")
    private String originalId;

    @JsonProperty("country_code")
    private String countryCode;

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

    @JsonProperty("is_sony")
    private Boolean sony;

    @JsonProperty("image")
    private AmazonImage image;

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

    public static AmazonTrack of(AmazonTrackEntity entity, String artistName) {
        if (entity == null) {
            return null;
        }

        AmazonAlbumEntity amazonAlbum = entity.getAmazonAlbum();
        String imageUri = Optional.ofNullable(amazonAlbum)
            .map(AmazonAlbumEntity::getImageUri)
            .orElse(null);
        LocalDate releaseDate = Optional.ofNullable(amazonAlbum)
            .map(AmazonAlbumEntity::getReleaseDate)
            .orElse(null);

        AmazonTrack track = AmazonTrack.builder()
            .name(entity.getName())
            .isrc(entity.getIsrc())
            .amazonTrackId(entity.getAmazonTrackId())
            .amazonTrackGenre(entity.getGenre())
            .sony(entity.getIsSony())
            .releaseDate(releaseDate)
            .build();

        if (artistName != null) {
            track.setArtists(Collections.singletonList(new AmazonArtist(artistName)));
        }
        if (imageUri != null) {
            track.setImage(new AmazonImage(imageUri));
        }

        return track;
    }
}