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

import com.fasterxml.jackson.annotation.JsonProperty;

import java.time.LocalDate;

import io.delphiplatform.api.v3.model.spotify.ChartTrackMetricsDimension;
import io.delphiplatform.api.v3.rdb.entity.apple.music.AppleMusicChartTrackLifetimeEntity;
import io.delphiplatform.api.v3.rdb.entity.spotify.SpotifyChartTrackLifetimeEntity;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@EqualsAndHashCode
public class ChartTrackLifetimeMetrics {

    @JsonProperty("earliest_position")
    private Integer earliestPosition;

    @JsonProperty("earliest_position_date")
    private LocalDate earliestPositionDate;

    @JsonProperty("latest_position")
    private Integer latestPosition;

    @JsonProperty("latest_position_date")
    private LocalDate latestPositionDate;

    @JsonProperty("max_position")
    private Integer maxPosition;

    @JsonProperty("max_position_date")
    private LocalDate maxPositionDate;

    @JsonProperty("min_position")
    private Integer minPosition;

    @JsonProperty("min_position_date")
    private LocalDate minPositionDate;

    @JsonProperty("total_days")
    private Integer totalDays;

    public static ChartTrackLifetimeMetrics of(SpotifyChartTrackLifetimeEntity entity,
        ChartTrackMetricsDimension metricsDimension) {
        if (entity == null) {
            return null;
        }
        if (metricsDimension == ChartTrackMetricsDimension.TRACK_ID) {
            ChartTrackLifetimeMetrics metrics = new ChartTrackLifetimeMetrics();
            metrics.setEarliestPosition(entity.getEarliestPosition());
            metrics.setEarliestPositionDate(entity.getEarliestPositionDate());
            metrics.setLatestPosition(entity.getLatestPosition());
            metrics.setLatestPositionDate(entity.getLatestPositionDate());
            metrics.setMaxPosition(entity.getMaxPosition());
            metrics.setMaxPositionDate(entity.getMaxPositionDate());
            metrics.setMinPosition(entity.getMinPosition());
            metrics.setMinPositionDate(entity.getMinPositionDate());
            metrics.setTotalDays(entity.getTotalDays());
            return metrics;
        } else {
            ChartTrackLifetimeMetrics metrics = new ChartTrackLifetimeMetrics();
            metrics.setEarliestPosition(entity.getIsrcEarliestPosition());
            metrics.setEarliestPositionDate(entity.getIsrcEarliestPositionDate());
            metrics.setLatestPosition(entity.getIsrcLatestPosition());
            metrics.setLatestPositionDate(entity.getIsrcLatestPositionDate());
            metrics.setMaxPosition(entity.getIsrcMaxPosition());
            metrics.setMaxPositionDate(entity.getIsrcMaxPositionDate());
            metrics.setMinPosition(entity.getIsrcMinPosition());
            metrics.setMinPositionDate(entity.getIsrcMinPositionDate());
            metrics.setTotalDays(entity.getIsrcTotalDays());
            return metrics;
        }
    }

    public static ChartTrackLifetimeMetrics of(AppleMusicChartTrackLifetimeEntity entity,
        ChartTrackMetricsDimension metricsDimension) {
        if (entity == null) {
            return null;
        }
        if (metricsDimension == null || metricsDimension == ChartTrackMetricsDimension.TRACK_ID) {
            ChartTrackLifetimeMetrics metrics = new ChartTrackLifetimeMetrics();
            metrics.setEarliestPosition(entity.getEarliestPosition());
            metrics.setEarliestPositionDate(entity.getEarliestPositionDate());
            metrics.setLatestPosition(entity.getLatestPosition());
            metrics.setLatestPositionDate(entity.getLatestPositionDate());
            metrics.setMaxPosition(entity.getMaxPosition());
            metrics.setMaxPositionDate(entity.getMaxPositionDate());
            metrics.setMinPosition(entity.getMinPosition());
            metrics.setMinPositionDate(entity.getMinPositionDate());
            metrics.setTotalDays(entity.getTotalDays());
            return metrics;
        }

        ChartTrackLifetimeMetrics metrics = new ChartTrackLifetimeMetrics();
        metrics.setEarliestPosition(entity.getIsrcEarliestPosition());
        metrics.setEarliestPositionDate(entity.getIsrcEarliestPositionDate());
        metrics.setLatestPosition(entity.getIsrcLatestPosition());
        metrics.setLatestPositionDate(entity.getIsrcLatestPositionDate());
        metrics.setMaxPosition(entity.getIsrcMaxPosition());
        metrics.setMaxPositionDate(entity.getIsrcMaxPositionDate());
        metrics.setMinPosition(entity.getIsrcMinPosition());
        metrics.setMinPositionDate(entity.getIsrcMinPositionDate());
        metrics.setTotalDays(entity.getIsrcTotalDays());
        return metrics;
    }
}

