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.StreamModel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@EqualsAndHashCode
@Getter
@Setter
public class StreamGroupByKey {

    private String isrc;
    private LocalDate date;
    private String artistId;
    private String countryCode;
    private String playlistId;
    private String subDsp;
    private String projectNumber;
    private String productFamilyId;
    private String trackId;

    public StreamGroupByKey(StreamModel stream, List<GroupByFieldEnum> groupByFields) {
        groupByFields.forEach(groupByField -> {
            switch (groupByField) {
                case ISRC:
                    this.isrc = stream.getIsrc();
                    break;
                case DATE:
                    this.date = stream.getDate();
                    break;
                case ARTIST_ID:
                    this.artistId = stream.getArtistId();
                    break;
                case COUNTRY_CODE:
                    this.countryCode = stream.getCountryCode();
                    break;
                case PLAYLIST_ID:
                    this.playlistId = stream.getPlaylistId();
                    break;
                case SUB_DSP:
                    this.subDsp = stream.getSubDsp();
                    break;
                case PROJECT_NUMBER:
                    this.projectNumber = stream.getProjectNumber();
                    break;
                case PRODUCT_FAMILY_ID:
                    this.productFamilyId = stream.getProductFamilyId();
                    break;
                case TRACK_ID:
                    this.trackId = stream.getTrackId();
                    break;
            }
        });
    }

    public void populateStream(StreamModel stream) {
        if (this.countryCode != null) {
            stream.setCountryCode(this.countryCode);
        }
        if (this.isrc != null) {
            stream.isrc(this.isrc);
        }
        if (this.artistId != null) {
            stream.artistId(this.artistId);
        }
        if (this.date != null) {
            stream.date(this.date);
        }
        if (this.playlistId != null) {
            stream.playlistId(this.playlistId);
        }
        if (this.subDsp != null) {
            stream.mainDsp(this.subDsp);
        }
        if (this.projectNumber != null) {
            stream.projectNumber(this.projectNumber);
        }
        if (this.productFamilyId != null) {
            stream.productFamilyId(this.productFamilyId);
        }
        if (this.trackId != null) {
            stream.trackId(this.trackId);
        }
    }


}
