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

import com.fasterxml.jackson.annotation.JsonProperty;

import io.delphiplatform.api.v3.rdb.entity.spotify.SpotifyJunoTopStreamsDailyEntity;
import io.delphiplatform.api.v3.rdb.entity.spotify.SpotifyJunoTopStreamsDailyEntityAggregatedProjection;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Builder
@Getter
@Setter
@EqualsAndHashCode
public class JunoSpotifyStreamsMetrics {

    @JsonProperty("totals")
    private JunoSpotifyStreamsMetricsLastTwoWeeks totals;

    @JsonProperty("change")
    private JunoSpotifyStreamsMetricsChangeFloatPercent change;

    @JsonProperty("lean_back")
    private JunoSpotifyStreamsMetricsLastTwoWeeks leanBack;

    @JsonProperty("lean_back_change")
    private JunoSpotifyStreamsMetricsChange leanBackChange;

    @JsonProperty("lean_forward")
    private JunoSpotifyStreamsMetricsLastTwoWeeks leanForward;

    @JsonProperty("lean_forward_change")
    private JunoSpotifyStreamsMetricsChange leanForwardChange;

    @JsonProperty("demographics")
    private JunoSpotifyStreamsMetricsDemographics demographics;

    public static JunoSpotifyStreamsMetrics from(SpotifyJunoTopStreamsDailyEntityAggregatedProjection prj) {
        if (prj == null) {
            return null;
        }

        return JunoSpotifyStreamsMetrics.builder()
            .totals(
                JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                    .streamsDays7(prj.getStreams17DaysTotal())
                    .streamsDays814(prj.getStreams814DaysTotal())
                    .build()
            )
            .change(
                JunoSpotifyStreamsMetricsChangeFloatPercent.builder()
                    .streamsChange7To14Days(prj.getStreamsChange7To14Days())
                    .streamsChangePercent7To14Days(prj.getStreamsChangePercent7To14Days())
                    .build()
            )
            .leanBack(
                JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                    .streamsDays7(prj.getStreams17DaysLeanBack())
                    .streamsDays814(prj.getStreams814DaysLeanBack())
                    .build()
            )
            .leanBackChange(
                JunoSpotifyStreamsMetricsChange.builder()
                    .streamsChange7To14Days(prj.getStreamsChange7To14DaysLeanBack())
                    .streamsChangePercent7To14Days(prj.getStreamsChangePercent7To14DaysLeanBack())
                    .build()
            )
            .leanForward(
                JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                    .streamsDays7(prj.getStreams17DaysLeanForward())
                    .streamsDays814(prj.getStreams814DaysLeanForward())
                    .build()
            )
            .leanForwardChange(
                JunoSpotifyStreamsMetricsChange.builder()
                    .streamsChange7To14Days(prj.getStreamsChange7To14DaysLeanForward())
                    .streamsChangePercent7To14Days(prj.getStreamsChangePercent7To14DaysLeanForward())
                    .build()
            )
            .demographics(
                JunoSpotifyStreamsMetricsDemographics.builder()
                    .male(
                        JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                            .streamsDays7(prj.getStreams17DaysMale())
                            .streamsDays814(prj.getStreams814DaysMale())
                            .build()
                    )
                    .female(
                        JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                            .streamsDays7(prj.getStreams17DaysFemale())
                            .streamsDays814(prj.getStreams814DaysFemale())
                            .build()
                    )
                    .build()
            )
            .build();
    }

    public static JunoSpotifyStreamsMetrics from(SpotifyJunoTopStreamsDailyEntity entity) {
        if (entity == null) {
            return null;
        }

        return JunoSpotifyStreamsMetrics.builder()
            .totals(
                JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                    .streamsDays7(entity.getStreams17DaysTotal())
                    .streamsDays814(entity.getStreams814DaysTotal())
                    .build()
            )
            .change(
                JunoSpotifyStreamsMetricsChangeFloatPercent.builder()
                    .streamsChange7To14Days(entity.getStreamsChange7To14Days())
                    .streamsChangePercent7To14Days(entity.getStreamsChangePercent7To14Days())
                    .build()
            )
            .leanBack(
                JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                    .streamsDays7(entity.getStreams17DaysLeanBack())
                    .streamsDays814(entity.getStreams814DaysLeanBack())
                    .build()
            )
            .leanBackChange(
                JunoSpotifyStreamsMetricsChange.builder()
                    .streamsChange7To14Days(entity.getStreamsChange7To14DaysLeanBack())
                    .streamsChangePercent7To14Days(entity.getStreamsChangePercent7To14DaysLeanBack())
                    .build()
            )
            .leanForward(
                JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                    .streamsDays7(entity.getStreams17DaysLeanForward())
                    .streamsDays814(entity.getStreams814DaysLeanForward())
                    .build()
            )
            .leanForwardChange(
                JunoSpotifyStreamsMetricsChange.builder()
                    .streamsChange7To14Days(entity.getStreamsChange7To14DaysLeanForward())
                    .streamsChangePercent7To14Days(entity.getStreamsChangePercent7To14DaysLeanForward())
                    .build()
            )
            .demographics(
                JunoSpotifyStreamsMetricsDemographics.builder()
                    .male(
                        JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                            .streamsDays7(entity.getStreams17DaysMale())
                            .streamsDays814(entity.getStreams814DaysMale())
                            .build()
                    )
                    .female(
                        JunoSpotifyStreamsMetricsLastTwoWeeks.builder()
                            .streamsDays7(entity.getStreams17DaysFemale())
                            .streamsDays814(entity.getStreams814DaysFemale())
                            .build()
                    )
                    .build()
            )
            .build();
    }
}
