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

import com.fasterxml.jackson.annotation.JsonProperty;

import org.openapitools.jackson.nullable.JsonNullable;

import java.util.List;

import io.delphiplatform.api.v3.rdb.entity.shazam.FactShazamChartEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * ShazamChartTrackPosition
 */
@EqualsAndHashCode
@Data
public class ShazamChartTrackPosition {

    @JsonProperty("chart")
    private JsonNullable<ShazamChart> chart = JsonNullable.undefined();

    @JsonProperty("position")
    private ShazamChartPosition position;

    @JsonProperty("isrc")
    private String isrc;

    @JsonProperty("track")
    private JsonNullable<ShazamTrack> track = JsonNullable.undefined();

    public static ShazamChartTrackPosition of(FactShazamChartEntity entity, boolean includeTrack,
        List<String> artistNames) {
        if (entity == null) {
            return null;
        }

        ShazamChartTrackPosition position = new ShazamChartTrackPosition()
            .chart(ShazamChart.of(entity))
            .position(ShazamChartPosition.of(entity))
            .isrc(entity.getTrack().getIsrc());
        if (includeTrack) {
            position.track(ShazamTrack.of(entity.getTrack(), artistNames));
        }

        return position;
    }

    public ShazamChartTrackPosition chart(ShazamChart chart) {
        this.chart = JsonNullable.of(chart);
        return this;
    }

    public ShazamChartTrackPosition track(ShazamTrack track) {
        this.track = JsonNullable.of(track);
        return this;
    }

    public ShazamChartTrackPosition isrc(String isrc) {
        this.isrc = isrc;
        return this;
    }

    public ShazamChartTrackPosition position(ShazamChartPosition position) {
        this.position = position;
        return this;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("class ShazamChartTrackPosition {\n");

        sb.append("    chart: ").append(toIndentedString(chart)).append("\n");
        sb.append("    position: ").append(toIndentedString(position)).append("\n");
        sb.append("    track: ").append(toIndentedString(track)).append("\n");
        sb.append("    isrc: ").append(toIndentedString(isrc)).append("\n");
        sb.append("}");
        return sb.toString();
    }

    /**
     * Convert the given object to string with each line indented by 4 spaces (except the first line).
     */
    private String toIndentedString(Object o) {
        if (o == null) {
            return "null";
        }
        return o.toString().replace("\n", "\n    ");
    }
}

