package io.delphiplatform.api.v3.model.tiktok.top;

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

import java.util.Arrays;
import java.util.Map;
import java.util.Set;

import io.delphiplatform.api.v3.model.tiktok.TikTokStateMetric;
import io.delphiplatform.api.v3.rdb.entity.tiktok.FactTikTokTopChartTrackLifetimeEntity;
import io.delphiplatform.api.v3.rdb.entity.tiktok.FactTikTokTopTrackEntity;
import io.delphiplatform.api.v3.rdb.entity.tiktok.TikTokTopSongEntity;
import io.delphiplatform.api.v3.rdb.service.tiktok.TikTokTopTracksService;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TikTokTopChartTrackState {

    private TikTokTopChartTrackStateMetrics metrics;

    @JsonProperty("aggregated_metrics")
    private TikTokTopChartTrackAggregatedMetrics aggregatedMetrics;

    @JsonProperty("lifetime_metrics")
    private TikTokTopChartTrackLifetimeMetrics lifetimeMetrics;

    @JsonProperty("source_meta")
    private TikTokTopChartTrackSourceMetadata sourceMeta;

    public static TikTokTopChartTrackState of(FactTikTokTopTrackEntity entity,
        Set<TikTokStateMetric> tikTokStateMetrics,
        Map<String, FactTikTokTopChartTrackLifetimeEntity> lifetimeMap,
        Map<String, TikTokTopSongEntity> sourceMap) {
        if (entity == null) {
            return null;
        }

        TikTokTopChartTrackStateMetrics metrics = null;
        if (TikTokTopTracksService.isMetricsRequested(tikTokStateMetrics)) {
            metrics = TikTokTopChartTrackStateMetrics.builder()
                .position(entity.getCurrentPosition())
                .date(entity.getId().getChartDate())
                .previousDate(entity.getPrevChartDate())
                .isEntry(entity.getIsEntry())
                .previousPosition(entity.getPrevPosition())
                .creations(entity.getCreations())
                .build();
        }

        TikTokTopChartTrackAggregatedMetrics aggMetrics = null;
        if (TikTokTopTracksService.isAggMetricsRequested(tikTokStateMetrics)) {
            aggMetrics = TikTokTopChartTrackAggregatedMetrics.builder()
                .onChartStreakDays(entity.getOnChartDays())
                .previous1DayCreations(entity.getPrevious1DayCreations())
                .previousWeek7DayCreations(entity.getPreviousWeek7DayCreations())
                .previousWeek1DayCreations(entity.getPreviousWeek1DayCreations())
                .last7DayTopMarkets(entity.getLast7DayTopMarkets() == null
                    ? null : Arrays.asList(entity.getLast7DayTopMarkets()))
                .build();
        }

        TikTokTopChartTrackLifetimeMetrics lifetimeMetrics = null;
        if (TikTokTopTracksService.isLifetimeMetricsRequested(tikTokStateMetrics)) {
            FactTikTokTopChartTrackLifetimeEntity lifetimeEntity = lifetimeMap.get(entity.getId().getIsrc());
            if (lifetimeEntity != null) {
                lifetimeMetrics = TikTokTopChartTrackLifetimeMetrics.builder().
                    earliestPosition(lifetimeEntity.getEarliestPosition()).
                    earliestPositionDate(lifetimeEntity.getEarliestPositionDate()).
                    latestPosition(lifetimeEntity.getLatestPosition()).
                    latestPositionDate(lifetimeEntity.getLatestPositionDate()).
                    maxPosition(lifetimeEntity.getMaxPosition()).
                    maxPositionDate(lifetimeEntity.getMaxPositionDate()).
                    minPosition(lifetimeEntity.getMinPosition()).
                    minPositionDate(lifetimeEntity.getMinPositionDate()).
                    totalDays(lifetimeEntity.getTotalDays())
                    .build();
            }
        }

        TikTokTopChartTrackSourceMetadata sourceMetadata = null;
        if (TikTokTopTracksService.isSourceMetricsRequested(tikTokStateMetrics)) {
            TikTokTopSongEntity songEntity = sourceMap.get(entity.getIsrc());
            if (songEntity != null) {
                sourceMetadata = TikTokTopChartTrackSourceMetadata.builder()
                    .artist(songEntity.getArtist())
                    .platformSongId(songEntity.getSongId())
                    .productCode(songEntity.getProductCode())
                    .songTitle(songEntity.getSongTitle())
                    .labelName(songEntity.getLabelName())
                    .sublabel(songEntity.getSublabel())
                    .isrc(songEntity.getIsrc())
                    .build();
            }
        }

        return TikTokTopChartTrackState.builder().metrics(metrics).aggregatedMetrics(aggMetrics).
            lifetimeMetrics(lifetimeMetrics).sourceMeta(sourceMetadata).build();
    }

}
