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

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

import java.util.List;

import io.delphiplatform.api.util.CollectionUtils;
import io.delphiplatform.api.v3.model.spotify.ChartTrackMetricsDimension;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicArtistLocalizedEntity;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicChartTrackEntity;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicChartTrackLifetimeEntity;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicTrackLocalizedEntity;
import io.delphiplatform.api.v3.rdb.entity.spotify.SpotifyChartTrackEntity;
import io.delphiplatform.api.v3.rdb.entity.spotify.SpotifyChartTrackLifetimeEntity;
import io.delphiplatform.api.v3.rdb.entity.spotify.SpotifyTrackEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
@JsonInclude(Include.NON_NULL)
public class ChartTrackState {

    @JsonProperty("licensors")
    private List<String> licensors;

    @JsonProperty("metrics")
    private ChartTrackStateMetrics metrics;

    @JsonProperty("lifetime_metrics")
    private ChartTrackLifetimeMetrics lifetimeMetrics;

    @JsonProperty("public_meta")
    private ChartTrackMetadata publicMeta;

    public static ChartTrackState of(SpotifyTrackEntity entity,
        SpotifyChartTrackEntity chartTrackEntity,
        SpotifyChartTrackLifetimeEntity chartTrackLifetime,
        List<String> licensors,
        ChartTrackMetricsDimension metricsDimension) {
        licensors = CollectionUtils.isEmpty(licensors) ? null : licensors;
        ChartTrackState state = new ChartTrackState();
        state.setLicensors(licensors);
        state.setMetrics(ChartTrackStateMetrics.of(chartTrackEntity, metricsDimension));
        state.setLifetimeMetrics(ChartTrackLifetimeMetrics.of(chartTrackLifetime, metricsDimension));
        state.setPublicMeta(ChartTrackMetadata.of(entity));
        return state;
    }

    public static ChartTrackState of(AppleMusicTrackLocalizedEntity entity,
        List<AppleMusicArtistLocalizedEntity> artists,
        AppleMusicChartTrackEntity chartTrackEntity,
        AppleMusicChartTrackLifetimeEntity chartTrackLifetime,
        List<String> licensors,
        ChartTrackMetricsDimension metricsDimension) {
        licensors = CollectionUtils.isEmpty(licensors) ? null : licensors;
        ChartTrackState state = new ChartTrackState();
        state.setLicensors(licensors);
        state.setMetrics(ChartTrackStateMetrics.of(chartTrackEntity, metricsDimension));
        state.setLifetimeMetrics(ChartTrackLifetimeMetrics.of(chartTrackLifetime, metricsDimension));
        state.setPublicMeta(ChartTrackMetadata.of(entity, artists));
        return state;
    }
}
