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

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

import org.openapitools.jackson.nullable.JsonNullable;

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

import io.delphiplatform.api.util.CollectionUtils;
import io.delphiplatform.api.v3.model.Track;
import io.delphiplatform.api.v3.rdb.entity.shazam.ShazamArtist;
import io.delphiplatform.api.v3.rdb.entity.shazam.ShazamTrackEntity;
import lombok.EqualsAndHashCode;
import lombok.Getter;

/**
 * ShazamTrack
 */
@JsonInclude(Include.NON_NULL)
@JsonPropertyOrder(alphabetic = true)
@Getter
@EqualsAndHashCode(callSuper = true)
public class ShazamTrack extends Track {

    @JsonProperty("apple_track_id")
    private String appleTrackId;

    @JsonProperty("is_sony")
    private boolean sony;

    @JsonProperty("image")
    private ShazamImage image;

    public static ShazamTrack of(ShazamTrackEntity track, List<String> artistNames) {
        if (track == null) {
            return null;
        }
        return new ShazamTrack()
            .name(track.getTrackName())
            .isrc(track.getIsrc())
            .appleTrackId(track.getAppleTrackId())
            .setIsSony(track.getIsSony())
            .image(track.getArtworkUrl())
            .artistNames(artistNames)
            .releaseDate(track.getReleaseDate());
    }

    public ShazamTrack name(String name) {
        setName(name);
        return this;
    }

    public ShazamTrack image(String name) {
        this.image = new ShazamImage(name);
        return this;
    }

    public ShazamTrack appleTrackId(String appleTrackId) {
        this.appleTrackId = appleTrackId;
        return this;
    }

    public ShazamTrack artistNames(List<String> artistNames) {
        if (CollectionUtils.isNotEmpty(artistNames)) {
            this.setArtists(artistNames.stream()
                .map(ShazamArtist::new)
                .collect(Collectors.toList()));
        }
        return this;
    }

    public ShazamTrack setIsSony(Boolean isSony) {
        this.sony = isSony;
        return this;
    }

    public ShazamTrack isrc(String isrc) {
        setIsrc(isrc);
        return this;
    }

    public ShazamTrack releaseDate(LocalDate releaseDate) {
        setReleaseDate(JsonNullable.of(releaseDate));
        return this;
    }

    @JsonInclude
    public String getAppleTrackId() {
        return appleTrackId;
    }
}
