package io.delphiplatform.api.v3.bigtable.processing.groupbykey;

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

import io.delphiplatform.api.v3.bigtable.processing.GroupByFieldEnum;
import io.delphiplatform.api.v3.model.trackposition.PublicPlaylistTrackPosition;
import io.delphiplatform.api.v3.model.TrackPosition;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@EqualsAndHashCode
@Getter
@Setter
public class TrackPositionPublicGroupByKey {

    private LocalDate date;
    private String isrc;
    private String dsp;
    private String playlistId;
    private String countryCode;
    private Long currentPosition;

    public TrackPositionPublicGroupByKey(TrackPosition trackPosition, List<GroupByFieldEnum> groupByFields) {
        groupByFields.forEach(groupByField -> {
            if (groupByField == GroupByFieldEnum.DATE) {
                this.date = trackPosition.getDate();
            }
            if (groupByField == GroupByFieldEnum.ISRC) {
                this.isrc = trackPosition.getIsrc();
            }
            if (groupByField == GroupByFieldEnum.DSP) {
                this.dsp = trackPosition.getDsp();
            }
            if (groupByField == GroupByFieldEnum.PLAYLIST_ID) {
                this.playlistId = ((PublicPlaylistTrackPosition) trackPosition).getPlaylistId();
            }
            if (groupByField == GroupByFieldEnum.COUNTRY_CODE) {
                this.countryCode = ((PublicPlaylistTrackPosition) trackPosition).getCountryCode();
            }
            if (groupByField == GroupByFieldEnum.CURRENT_POSITION) {
                this.currentPosition = trackPosition.getCurrent();
            }
        });
    }

    public void populateTrackPosition(TrackPosition trackPosition) {
        if (this.date != null) {
            trackPosition.date(this.date);
        }
        if (this.isrc != null) {
            trackPosition.isrc(this.isrc);
        }
        if (this.dsp != null) {
            trackPosition.dsp(this.dsp);
        }
        if (this.playlistId != null) {
            ((PublicPlaylistTrackPosition) trackPosition).playlistId(this.playlistId);
        }
        if (this.countryCode != null) {
            ((PublicPlaylistTrackPosition) trackPosition).countryCode(this.countryCode);
        }
        if (this.currentPosition != null) {
            trackPosition.current(this.currentPosition);
        }
    }

}
