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

import com.fasterxml.jackson.annotation.JsonProperty;

import org.openapitools.jackson.nullable.JsonNullable;

import java.util.Objects;

import io.delphiplatform.api.v3.model.service.ImageService;
import io.delphiplatform.api.v3.rdb.entity.video.TrendingVideoChartSummaryReportEntity;

/**
 * VideoChartPositionSummary
 */
public class VideoChartPositionSummary {

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

    @JsonProperty("summary")
    private ChartPositionSummary summary;

    @JsonProperty("video_id")
    private String videoId;

    @JsonProperty("video")
    private JsonNullable<Video> video = JsonNullable.undefined();

    public static VideoChartPositionSummary of(TrendingVideoChartSummaryReportEntity entity, ImageService imageService,
        boolean isVideoIncluded) {
        if (entity == null) {
            return null;
        }
        VideoChartPositionSummary position = new VideoChartPositionSummary()
            .chart(VideoChart.of(entity.getChart()))
            .summary(ChartPositionSummary.of(entity))
            .videoId(entity.getVideo() == null ? null : entity.getVideo().getVideoId());
        if (isVideoIncluded) {
            position.video(Video.from(entity.getVideo(), imageService));
        }
        return position;
    }

    public VideoChartPositionSummary chart(VideoChart chart) {
        this.chart = JsonNullable.of(chart);
        return this;
    }

    /**
     * Get chart
     *
     * @return chart
     */
    public JsonNullable<VideoChart> getChart() {
        return chart;
    }

    public void setChart(JsonNullable<VideoChart> chart) {
        this.chart = chart;
    }

    public VideoChartPositionSummary summary(ChartPositionSummary summary) {
        this.summary = summary;
        return this;
    }

    /**
     * Get summary
     *
     * @return summary
     */
    public ChartPositionSummary getSummary() {
        return summary;
    }

    public void setSummary(ChartPositionSummary summary) {
        this.summary = summary;
    }

    public VideoChartPositionSummary videoId(String videoId) {
        this.videoId = videoId;
        return this;
    }

    /**
     * Primary key identifier for a Video
     *
     * @return videoId
     */
    public String getVideoId() {
        return videoId;
    }

    public void setVideoId(String videoId) {
        this.videoId = videoId;
    }

    public VideoChartPositionSummary video(Video video) {
        this.video = JsonNullable.of(video);
        return this;
    }

    /**
     * Get video
     *
     * @return video
     */
    public JsonNullable<Video> getVideo() {
        return video;
    }

    public void setVideo(JsonNullable<Video> video) {
        this.video = video;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        VideoChartPositionSummary videoChartPositionSummary = (VideoChartPositionSummary) o;
        return Objects.equals(this.chart, videoChartPositionSummary.chart) &&
            Objects.equals(this.summary, videoChartPositionSummary.summary) &&
            Objects.equals(this.videoId, videoChartPositionSummary.videoId) &&
            Objects.equals(this.video, videoChartPositionSummary.video);
    }

    @Override
    public int hashCode() {
        return Objects.hash(chart, summary, videoId, video);
    }

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

        sb.append("    chart: ").append(toIndentedString(chart)).append("\n");
        sb.append("    summary: ").append(toIndentedString(summary)).append("\n");
        sb.append("    videoId: ").append(toIndentedString(videoId)).append("\n");
        sb.append("    video: ").append(toIndentedString(video)).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    ");
    }
}

