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

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import org.openapitools.jackson.nullable.JsonNullable;

import java.util.Objects;

/**
 * Object containing the thumbnail images for a YouTubeVideo.  **Note:** Not all sizes are guaranteed to exist, and
 * dimensions for the same size can vary. The images are however, guaranteed to maintain the same aspect ratio for each
 * size, regardless of dimension.  Since we will not be getting these from the YouTube Data API for MVP, the below
 * guaranteed sizes will have their URLs generated. Thumbnail width and height properties for these generated sizes will
 * be the defaults provided by YouTube for the purpose of ultimately exposing the aspect ratios.  ### Sizes that will
 * always exist - &#x60;default&#x60; - &#x60;medium&#x60; - &#x60;high&#x60;
 */
@JsonPropertyOrder(alphabetic = true)
public class YouTubeThumbnails {

    @JsonProperty("default")
    private JsonNullable<VideoImage> defaultImage = JsonNullable.undefined();

    @JsonProperty("medium")
    private JsonNullable<VideoImage> medium = JsonNullable.undefined();

    @JsonProperty("high")
    private JsonNullable<VideoImage> high = JsonNullable.undefined();

    @JsonProperty("standard")
    private JsonNullable<VideoImage> standard = JsonNullable.undefined();

    @JsonProperty("maxres")
    private JsonNullable<VideoImage> maxres = JsonNullable.undefined();

    public YouTubeThumbnails defaultImage(VideoImage defaultImage) {
        this.defaultImage = JsonNullable.of(defaultImage);
        return this;
    }

    /**
     * Get defaultImage
     *
     * @return defaultImage
     */
    public JsonNullable<VideoImage> getDefaultImage() {
        return defaultImage;
    }

    public void setDefaultImage(JsonNullable<VideoImage> defaultImage) {
        this.defaultImage = defaultImage;
    }

    public YouTubeThumbnails medium(VideoImage medium) {
        this.medium = JsonNullable.of(medium);
        return this;
    }

    /**
     * Get medium
     *
     * @return medium
     */
    public JsonNullable<VideoImage> getMedium() {
        return medium;
    }

    public void setMedium(JsonNullable<VideoImage> medium) {
        this.medium = medium;
    }

    public YouTubeThumbnails high(VideoImage high) {
        this.high = JsonNullable.of(high);
        return this;
    }

    /**
     * Get high
     *
     * @return high
     */
    public JsonNullable<VideoImage> getHigh() {
        return high;
    }

    public void setHigh(JsonNullable<VideoImage> high) {
        this.high = high;
    }

    public YouTubeThumbnails standard(VideoImage standard) {
        this.standard = JsonNullable.of(standard);
        return this;
    }

    /**
     * Get standard
     *
     * @return standard
     */
    public JsonNullable<VideoImage> getStandard() {
        return standard;
    }

    public void setStandard(JsonNullable<VideoImage> standard) {
        this.standard = standard;
    }

    public YouTubeThumbnails maxres(VideoImage maxres) {
        this.maxres = JsonNullable.of(maxres);
        return this;
    }

    /**
     * Get maxres
     *
     * @return maxres
     */
    public JsonNullable<VideoImage> getMaxres() {
        return maxres;
    }

    public void setMaxres(JsonNullable<VideoImage> maxres) {
        this.maxres = maxres;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        YouTubeThumbnails youTubeThumbnails = (YouTubeThumbnails) o;
        return Objects.equals(this.defaultImage, youTubeThumbnails.defaultImage) &&
            Objects.equals(this.medium, youTubeThumbnails.medium) &&
            Objects.equals(this.high, youTubeThumbnails.high) &&
            Objects.equals(this.standard, youTubeThumbnails.standard) &&
            Objects.equals(this.maxres, youTubeThumbnails.maxres);
    }

    @Override
    public int hashCode() {
        return Objects.hash(defaultImage, medium, high, standard, maxres);
    }

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

        sb.append("    defaultImage: ").append(toIndentedString(defaultImage)).append("\n");
        sb.append("    medium: ").append(toIndentedString(medium)).append("\n");
        sb.append("    high: ").append(toIndentedString(high)).append("\n");
        sb.append("    standard: ").append(toIndentedString(standard)).append("\n");
        sb.append("    maxres: ").append(toIndentedString(maxres)).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    ");
    }
}

