/*
 * Jellyfin API
 * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
 *
 * The version of the OpenAPI document: 10.11.6
 * 
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */

package org.openhab.binding.jellyfin.internal.gen.current.model;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.UUID;

import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * Get programs dto.
 */
@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "OpenAPI Generator")
public class GetProgramsDto {
    public static final String JSON_PROPERTY_CHANNEL_IDS = "ChannelIds";
    private @org.eclipse.jdt.annotation.Nullable List<UUID> channelIds;

    public static final String JSON_PROPERTY_USER_ID = "UserId";
    private @org.eclipse.jdt.annotation.Nullable UUID userId;

    public static final String JSON_PROPERTY_MIN_START_DATE = "MinStartDate";
    private @org.eclipse.jdt.annotation.Nullable OffsetDateTime minStartDate;

    public static final String JSON_PROPERTY_HAS_AIRED = "HasAired";
    private @org.eclipse.jdt.annotation.Nullable Boolean hasAired;

    public static final String JSON_PROPERTY_IS_AIRING = "IsAiring";
    private @org.eclipse.jdt.annotation.Nullable Boolean isAiring;

    public static final String JSON_PROPERTY_MAX_START_DATE = "MaxStartDate";
    private @org.eclipse.jdt.annotation.Nullable OffsetDateTime maxStartDate;

    public static final String JSON_PROPERTY_MIN_END_DATE = "MinEndDate";
    private @org.eclipse.jdt.annotation.Nullable OffsetDateTime minEndDate;

    public static final String JSON_PROPERTY_MAX_END_DATE = "MaxEndDate";
    private @org.eclipse.jdt.annotation.Nullable OffsetDateTime maxEndDate;

    public static final String JSON_PROPERTY_IS_MOVIE = "IsMovie";
    private @org.eclipse.jdt.annotation.Nullable Boolean isMovie;

    public static final String JSON_PROPERTY_IS_SERIES = "IsSeries";
    private @org.eclipse.jdt.annotation.Nullable Boolean isSeries;

    public static final String JSON_PROPERTY_IS_NEWS = "IsNews";
    private @org.eclipse.jdt.annotation.Nullable Boolean isNews;

    public static final String JSON_PROPERTY_IS_KIDS = "IsKids";
    private @org.eclipse.jdt.annotation.Nullable Boolean isKids;

    public static final String JSON_PROPERTY_IS_SPORTS = "IsSports";
    private @org.eclipse.jdt.annotation.Nullable Boolean isSports;

    public static final String JSON_PROPERTY_START_INDEX = "StartIndex";
    private @org.eclipse.jdt.annotation.Nullable Integer startIndex;

    public static final String JSON_PROPERTY_LIMIT = "Limit";
    private @org.eclipse.jdt.annotation.Nullable Integer limit;

    public static final String JSON_PROPERTY_SORT_BY = "SortBy";
    private @org.eclipse.jdt.annotation.Nullable List<ItemSortBy> sortBy;

    public static final String JSON_PROPERTY_SORT_ORDER = "SortOrder";
    private @org.eclipse.jdt.annotation.Nullable List<SortOrder> sortOrder;

    public static final String JSON_PROPERTY_GENRES = "Genres";
    private @org.eclipse.jdt.annotation.Nullable List<String> genres;

    public static final String JSON_PROPERTY_GENRE_IDS = "GenreIds";
    private @org.eclipse.jdt.annotation.Nullable List<UUID> genreIds;

    public static final String JSON_PROPERTY_ENABLE_IMAGES = "EnableImages";
    private @org.eclipse.jdt.annotation.Nullable Boolean enableImages;

    public static final String JSON_PROPERTY_ENABLE_TOTAL_RECORD_COUNT = "EnableTotalRecordCount";
    private @org.eclipse.jdt.annotation.Nullable Boolean enableTotalRecordCount = true;

    public static final String JSON_PROPERTY_IMAGE_TYPE_LIMIT = "ImageTypeLimit";
    private @org.eclipse.jdt.annotation.Nullable Integer imageTypeLimit;

    public static final String JSON_PROPERTY_ENABLE_IMAGE_TYPES = "EnableImageTypes";
    private @org.eclipse.jdt.annotation.Nullable List<ImageType> enableImageTypes;

    public static final String JSON_PROPERTY_ENABLE_USER_DATA = "EnableUserData";
    private @org.eclipse.jdt.annotation.Nullable Boolean enableUserData;

    public static final String JSON_PROPERTY_SERIES_TIMER_ID = "SeriesTimerId";
    private @org.eclipse.jdt.annotation.Nullable String seriesTimerId;

    public static final String JSON_PROPERTY_LIBRARY_SERIES_ID = "LibrarySeriesId";
    private @org.eclipse.jdt.annotation.Nullable UUID librarySeriesId;

    public static final String JSON_PROPERTY_FIELDS = "Fields";
    private @org.eclipse.jdt.annotation.Nullable List<ItemFields> fields;

    public GetProgramsDto() {
    }

    public GetProgramsDto channelIds(@org.eclipse.jdt.annotation.Nullable List<UUID> channelIds) {
        this.channelIds = channelIds;
        return this;
    }

    public GetProgramsDto addChannelIdsItem(UUID channelIdsItem) {
        if (this.channelIds == null) {
            this.channelIds = new ArrayList<>();
        }
        this.channelIds.add(channelIdsItem);
        return this;
    }

    /**
     * Gets or sets the channels to return guide information for.
     * 
     * @return channelIds
     */
    @JsonProperty(value = JSON_PROPERTY_CHANNEL_IDS)
    public @org.eclipse.jdt.annotation.Nullable List<UUID> getChannelIds() {
        return channelIds;
    }

    @JsonProperty(value = JSON_PROPERTY_CHANNEL_IDS)
    public void setChannelIds(@org.eclipse.jdt.annotation.Nullable List<UUID> channelIds) {
        this.channelIds = channelIds;
    }

    public GetProgramsDto userId(@org.eclipse.jdt.annotation.Nullable UUID userId) {
        this.userId = userId;
        return this;
    }

    /**
     * Gets or sets optional. Filter by user id.
     * 
     * @return userId
     */
    @JsonProperty(value = JSON_PROPERTY_USER_ID)
    public @org.eclipse.jdt.annotation.Nullable UUID getUserId() {
        return userId;
    }

    @JsonProperty(value = JSON_PROPERTY_USER_ID)
    public void setUserId(@org.eclipse.jdt.annotation.Nullable UUID userId) {
        this.userId = userId;
    }

    public GetProgramsDto minStartDate(@org.eclipse.jdt.annotation.Nullable OffsetDateTime minStartDate) {
        this.minStartDate = minStartDate;
        return this;
    }

    /**
     * Gets or sets the minimum premiere start date.
     * 
     * @return minStartDate
     */
    @JsonProperty(value = JSON_PROPERTY_MIN_START_DATE)
    public @org.eclipse.jdt.annotation.Nullable OffsetDateTime getMinStartDate() {
        return minStartDate;
    }

    @JsonProperty(value = JSON_PROPERTY_MIN_START_DATE)
    public void setMinStartDate(@org.eclipse.jdt.annotation.Nullable OffsetDateTime minStartDate) {
        this.minStartDate = minStartDate;
    }

    public GetProgramsDto hasAired(@org.eclipse.jdt.annotation.Nullable Boolean hasAired) {
        this.hasAired = hasAired;
        return this;
    }

    /**
     * Gets or sets filter by programs that have completed airing, or not.
     * 
     * @return hasAired
     */
    @JsonProperty(value = JSON_PROPERTY_HAS_AIRED)
    public @org.eclipse.jdt.annotation.Nullable Boolean getHasAired() {
        return hasAired;
    }

    @JsonProperty(value = JSON_PROPERTY_HAS_AIRED)
    public void setHasAired(@org.eclipse.jdt.annotation.Nullable Boolean hasAired) {
        this.hasAired = hasAired;
    }

    public GetProgramsDto isAiring(@org.eclipse.jdt.annotation.Nullable Boolean isAiring) {
        this.isAiring = isAiring;
        return this;
    }

    /**
     * Gets or sets filter by programs that are currently airing, or not.
     * 
     * @return isAiring
     */
    @JsonProperty(value = JSON_PROPERTY_IS_AIRING)
    public @org.eclipse.jdt.annotation.Nullable Boolean getIsAiring() {
        return isAiring;
    }

    @JsonProperty(value = JSON_PROPERTY_IS_AIRING)
    public void setIsAiring(@org.eclipse.jdt.annotation.Nullable Boolean isAiring) {
        this.isAiring = isAiring;
    }

    public GetProgramsDto maxStartDate(@org.eclipse.jdt.annotation.Nullable OffsetDateTime maxStartDate) {
        this.maxStartDate = maxStartDate;
        return this;
    }

    /**
     * Gets or sets the maximum premiere start date.
     * 
     * @return maxStartDate
     */
    @JsonProperty(value = JSON_PROPERTY_MAX_START_DATE)
    public @org.eclipse.jdt.annotation.Nullable OffsetDateTime getMaxStartDate() {
        return maxStartDate;
    }

    @JsonProperty(value = JSON_PROPERTY_MAX_START_DATE)
    public void setMaxStartDate(@org.eclipse.jdt.annotation.Nullable OffsetDateTime maxStartDate) {
        this.maxStartDate = maxStartDate;
    }

    public GetProgramsDto minEndDate(@org.eclipse.jdt.annotation.Nullable OffsetDateTime minEndDate) {
        this.minEndDate = minEndDate;
        return this;
    }

    /**
     * Gets or sets the minimum premiere end date.
     * 
     * @return minEndDate
     */
    @JsonProperty(value = JSON_PROPERTY_MIN_END_DATE)
    public @org.eclipse.jdt.annotation.Nullable OffsetDateTime getMinEndDate() {
        return minEndDate;
    }

    @JsonProperty(value = JSON_PROPERTY_MIN_END_DATE)
    public void setMinEndDate(@org.eclipse.jdt.annotation.Nullable OffsetDateTime minEndDate) {
        this.minEndDate = minEndDate;
    }

    public GetProgramsDto maxEndDate(@org.eclipse.jdt.annotation.Nullable OffsetDateTime maxEndDate) {
        this.maxEndDate = maxEndDate;
        return this;
    }

    /**
     * Gets or sets the maximum premiere end date.
     * 
     * @return maxEndDate
     */
    @JsonProperty(value = JSON_PROPERTY_MAX_END_DATE)
    public @org.eclipse.jdt.annotation.Nullable OffsetDateTime getMaxEndDate() {
        return maxEndDate;
    }

    @JsonProperty(value = JSON_PROPERTY_MAX_END_DATE)
    public void setMaxEndDate(@org.eclipse.jdt.annotation.Nullable OffsetDateTime maxEndDate) {
        this.maxEndDate = maxEndDate;
    }

    public GetProgramsDto isMovie(@org.eclipse.jdt.annotation.Nullable Boolean isMovie) {
        this.isMovie = isMovie;
        return this;
    }

    /**
     * Gets or sets filter for movies.
     * 
     * @return isMovie
     */
    @JsonProperty(value = JSON_PROPERTY_IS_MOVIE)
    public @org.eclipse.jdt.annotation.Nullable Boolean getIsMovie() {
        return isMovie;
    }

    @JsonProperty(value = JSON_PROPERTY_IS_MOVIE)
    public void setIsMovie(@org.eclipse.jdt.annotation.Nullable Boolean isMovie) {
        this.isMovie = isMovie;
    }

    public GetProgramsDto isSeries(@org.eclipse.jdt.annotation.Nullable Boolean isSeries) {
        this.isSeries = isSeries;
        return this;
    }

    /**
     * Gets or sets filter for series.
     * 
     * @return isSeries
     */
    @JsonProperty(value = JSON_PROPERTY_IS_SERIES)
    public @org.eclipse.jdt.annotation.Nullable Boolean getIsSeries() {
        return isSeries;
    }

    @JsonProperty(value = JSON_PROPERTY_IS_SERIES)
    public void setIsSeries(@org.eclipse.jdt.annotation.Nullable Boolean isSeries) {
        this.isSeries = isSeries;
    }

    public GetProgramsDto isNews(@org.eclipse.jdt.annotation.Nullable Boolean isNews) {
        this.isNews = isNews;
        return this;
    }

    /**
     * Gets or sets filter for news.
     * 
     * @return isNews
     */
    @JsonProperty(value = JSON_PROPERTY_IS_NEWS)
    public @org.eclipse.jdt.annotation.Nullable Boolean getIsNews() {
        return isNews;
    }

    @JsonProperty(value = JSON_PROPERTY_IS_NEWS)
    public void setIsNews(@org.eclipse.jdt.annotation.Nullable Boolean isNews) {
        this.isNews = isNews;
    }

    public GetProgramsDto isKids(@org.eclipse.jdt.annotation.Nullable Boolean isKids) {
        this.isKids = isKids;
        return this;
    }

    /**
     * Gets or sets filter for kids.
     * 
     * @return isKids
     */
    @JsonProperty(value = JSON_PROPERTY_IS_KIDS)
    public @org.eclipse.jdt.annotation.Nullable Boolean getIsKids() {
        return isKids;
    }

    @JsonProperty(value = JSON_PROPERTY_IS_KIDS)
    public void setIsKids(@org.eclipse.jdt.annotation.Nullable Boolean isKids) {
        this.isKids = isKids;
    }

    public GetProgramsDto isSports(@org.eclipse.jdt.annotation.Nullable Boolean isSports) {
        this.isSports = isSports;
        return this;
    }

    /**
     * Gets or sets filter for sports.
     * 
     * @return isSports
     */
    @JsonProperty(value = JSON_PROPERTY_IS_SPORTS)
    public @org.eclipse.jdt.annotation.Nullable Boolean getIsSports() {
        return isSports;
    }

    @JsonProperty(value = JSON_PROPERTY_IS_SPORTS)
    public void setIsSports(@org.eclipse.jdt.annotation.Nullable Boolean isSports) {
        this.isSports = isSports;
    }

    public GetProgramsDto startIndex(@org.eclipse.jdt.annotation.Nullable Integer startIndex) {
        this.startIndex = startIndex;
        return this;
    }

    /**
     * Gets or sets the record index to start at. All items with a lower index will be dropped from the results.
     * 
     * @return startIndex
     */
    @JsonProperty(value = JSON_PROPERTY_START_INDEX)
    public @org.eclipse.jdt.annotation.Nullable Integer getStartIndex() {
        return startIndex;
    }

    @JsonProperty(value = JSON_PROPERTY_START_INDEX)
    public void setStartIndex(@org.eclipse.jdt.annotation.Nullable Integer startIndex) {
        this.startIndex = startIndex;
    }

    public GetProgramsDto limit(@org.eclipse.jdt.annotation.Nullable Integer limit) {
        this.limit = limit;
        return this;
    }

    /**
     * Gets or sets the maximum number of records to return.
     * 
     * @return limit
     */
    @JsonProperty(value = JSON_PROPERTY_LIMIT)
    public @org.eclipse.jdt.annotation.Nullable Integer getLimit() {
        return limit;
    }

    @JsonProperty(value = JSON_PROPERTY_LIMIT)
    public void setLimit(@org.eclipse.jdt.annotation.Nullable Integer limit) {
        this.limit = limit;
    }

    public GetProgramsDto sortBy(@org.eclipse.jdt.annotation.Nullable List<ItemSortBy> sortBy) {
        this.sortBy = sortBy;
        return this;
    }

    public GetProgramsDto addSortByItem(ItemSortBy sortByItem) {
        if (this.sortBy == null) {
            this.sortBy = new ArrayList<>();
        }
        this.sortBy.add(sortByItem);
        return this;
    }

    /**
     * Gets or sets specify one or more sort orders, comma delimited. Options: Name, StartDate.
     * 
     * @return sortBy
     */
    @JsonProperty(value = JSON_PROPERTY_SORT_BY)
    public @org.eclipse.jdt.annotation.Nullable List<ItemSortBy> getSortBy() {
        return sortBy;
    }

    @JsonProperty(value = JSON_PROPERTY_SORT_BY)
    public void setSortBy(@org.eclipse.jdt.annotation.Nullable List<ItemSortBy> sortBy) {
        this.sortBy = sortBy;
    }

    public GetProgramsDto sortOrder(@org.eclipse.jdt.annotation.Nullable List<SortOrder> sortOrder) {
        this.sortOrder = sortOrder;
        return this;
    }

    public GetProgramsDto addSortOrderItem(SortOrder sortOrderItem) {
        if (this.sortOrder == null) {
            this.sortOrder = new ArrayList<>();
        }
        this.sortOrder.add(sortOrderItem);
        return this;
    }

    /**
     * Gets or sets sort order.
     * 
     * @return sortOrder
     */
    @JsonProperty(value = JSON_PROPERTY_SORT_ORDER)
    public @org.eclipse.jdt.annotation.Nullable List<SortOrder> getSortOrder() {
        return sortOrder;
    }

    @JsonProperty(value = JSON_PROPERTY_SORT_ORDER)
    public void setSortOrder(@org.eclipse.jdt.annotation.Nullable List<SortOrder> sortOrder) {
        this.sortOrder = sortOrder;
    }

    public GetProgramsDto genres(@org.eclipse.jdt.annotation.Nullable List<String> genres) {
        this.genres = genres;
        return this;
    }

    public GetProgramsDto addGenresItem(String genresItem) {
        if (this.genres == null) {
            this.genres = new ArrayList<>();
        }
        this.genres.add(genresItem);
        return this;
    }

    /**
     * Gets or sets the genres to return guide information for.
     * 
     * @return genres
     */
    @JsonProperty(value = JSON_PROPERTY_GENRES)
    public @org.eclipse.jdt.annotation.Nullable List<String> getGenres() {
        return genres;
    }

    @JsonProperty(value = JSON_PROPERTY_GENRES)
    public void setGenres(@org.eclipse.jdt.annotation.Nullable List<String> genres) {
        this.genres = genres;
    }

    public GetProgramsDto genreIds(@org.eclipse.jdt.annotation.Nullable List<UUID> genreIds) {
        this.genreIds = genreIds;
        return this;
    }

    public GetProgramsDto addGenreIdsItem(UUID genreIdsItem) {
        if (this.genreIds == null) {
            this.genreIds = new ArrayList<>();
        }
        this.genreIds.add(genreIdsItem);
        return this;
    }

    /**
     * Gets or sets the genre ids to return guide information for.
     * 
     * @return genreIds
     */
    @JsonProperty(value = JSON_PROPERTY_GENRE_IDS)
    public @org.eclipse.jdt.annotation.Nullable List<UUID> getGenreIds() {
        return genreIds;
    }

    @JsonProperty(value = JSON_PROPERTY_GENRE_IDS)
    public void setGenreIds(@org.eclipse.jdt.annotation.Nullable List<UUID> genreIds) {
        this.genreIds = genreIds;
    }

    public GetProgramsDto enableImages(@org.eclipse.jdt.annotation.Nullable Boolean enableImages) {
        this.enableImages = enableImages;
        return this;
    }

    /**
     * Gets or sets include image information in output.
     * 
     * @return enableImages
     */
    @JsonProperty(value = JSON_PROPERTY_ENABLE_IMAGES)
    public @org.eclipse.jdt.annotation.Nullable Boolean getEnableImages() {
        return enableImages;
    }

    @JsonProperty(value = JSON_PROPERTY_ENABLE_IMAGES)
    public void setEnableImages(@org.eclipse.jdt.annotation.Nullable Boolean enableImages) {
        this.enableImages = enableImages;
    }

    public GetProgramsDto enableTotalRecordCount(@org.eclipse.jdt.annotation.Nullable Boolean enableTotalRecordCount) {
        this.enableTotalRecordCount = enableTotalRecordCount;
        return this;
    }

    /**
     * Gets or sets a value indicating whether retrieve total record count.
     * 
     * @return enableTotalRecordCount
     */
    @JsonProperty(value = JSON_PROPERTY_ENABLE_TOTAL_RECORD_COUNT)
    public @org.eclipse.jdt.annotation.Nullable Boolean getEnableTotalRecordCount() {
        return enableTotalRecordCount;
    }

    @JsonProperty(value = JSON_PROPERTY_ENABLE_TOTAL_RECORD_COUNT)
    public void setEnableTotalRecordCount(@org.eclipse.jdt.annotation.Nullable Boolean enableTotalRecordCount) {
        this.enableTotalRecordCount = enableTotalRecordCount;
    }

    public GetProgramsDto imageTypeLimit(@org.eclipse.jdt.annotation.Nullable Integer imageTypeLimit) {
        this.imageTypeLimit = imageTypeLimit;
        return this;
    }

    /**
     * Gets or sets the max number of images to return, per image type.
     * 
     * @return imageTypeLimit
     */
    @JsonProperty(value = JSON_PROPERTY_IMAGE_TYPE_LIMIT)
    public @org.eclipse.jdt.annotation.Nullable Integer getImageTypeLimit() {
        return imageTypeLimit;
    }

    @JsonProperty(value = JSON_PROPERTY_IMAGE_TYPE_LIMIT)
    public void setImageTypeLimit(@org.eclipse.jdt.annotation.Nullable Integer imageTypeLimit) {
        this.imageTypeLimit = imageTypeLimit;
    }

    public GetProgramsDto enableImageTypes(@org.eclipse.jdt.annotation.Nullable List<ImageType> enableImageTypes) {
        this.enableImageTypes = enableImageTypes;
        return this;
    }

    public GetProgramsDto addEnableImageTypesItem(ImageType enableImageTypesItem) {
        if (this.enableImageTypes == null) {
            this.enableImageTypes = new ArrayList<>();
        }
        this.enableImageTypes.add(enableImageTypesItem);
        return this;
    }

    /**
     * Gets or sets the image types to include in the output.
     * 
     * @return enableImageTypes
     */
    @JsonProperty(value = JSON_PROPERTY_ENABLE_IMAGE_TYPES)
    public @org.eclipse.jdt.annotation.Nullable List<ImageType> getEnableImageTypes() {
        return enableImageTypes;
    }

    @JsonProperty(value = JSON_PROPERTY_ENABLE_IMAGE_TYPES)
    public void setEnableImageTypes(@org.eclipse.jdt.annotation.Nullable List<ImageType> enableImageTypes) {
        this.enableImageTypes = enableImageTypes;
    }

    public GetProgramsDto enableUserData(@org.eclipse.jdt.annotation.Nullable Boolean enableUserData) {
        this.enableUserData = enableUserData;
        return this;
    }

    /**
     * Gets or sets include user data.
     * 
     * @return enableUserData
     */
    @JsonProperty(value = JSON_PROPERTY_ENABLE_USER_DATA)
    public @org.eclipse.jdt.annotation.Nullable Boolean getEnableUserData() {
        return enableUserData;
    }

    @JsonProperty(value = JSON_PROPERTY_ENABLE_USER_DATA)
    public void setEnableUserData(@org.eclipse.jdt.annotation.Nullable Boolean enableUserData) {
        this.enableUserData = enableUserData;
    }

    public GetProgramsDto seriesTimerId(@org.eclipse.jdt.annotation.Nullable String seriesTimerId) {
        this.seriesTimerId = seriesTimerId;
        return this;
    }

    /**
     * Gets or sets filter by series timer id.
     * 
     * @return seriesTimerId
     */
    @JsonProperty(value = JSON_PROPERTY_SERIES_TIMER_ID)
    public @org.eclipse.jdt.annotation.Nullable String getSeriesTimerId() {
        return seriesTimerId;
    }

    @JsonProperty(value = JSON_PROPERTY_SERIES_TIMER_ID)
    public void setSeriesTimerId(@org.eclipse.jdt.annotation.Nullable String seriesTimerId) {
        this.seriesTimerId = seriesTimerId;
    }

    public GetProgramsDto librarySeriesId(@org.eclipse.jdt.annotation.Nullable UUID librarySeriesId) {
        this.librarySeriesId = librarySeriesId;
        return this;
    }

    /**
     * Gets or sets filter by library series id.
     * 
     * @return librarySeriesId
     */
    @JsonProperty(value = JSON_PROPERTY_LIBRARY_SERIES_ID)
    public @org.eclipse.jdt.annotation.Nullable UUID getLibrarySeriesId() {
        return librarySeriesId;
    }

    @JsonProperty(value = JSON_PROPERTY_LIBRARY_SERIES_ID)
    public void setLibrarySeriesId(@org.eclipse.jdt.annotation.Nullable UUID librarySeriesId) {
        this.librarySeriesId = librarySeriesId;
    }

    public GetProgramsDto fields(@org.eclipse.jdt.annotation.Nullable List<ItemFields> fields) {
        this.fields = fields;
        return this;
    }

    public GetProgramsDto addFieldsItem(ItemFields fieldsItem) {
        if (this.fields == null) {
            this.fields = new ArrayList<>();
        }
        this.fields.add(fieldsItem);
        return this;
    }

    /**
     * Gets or sets specify additional fields of information to return in the output.
     * 
     * @return fields
     */
    @JsonProperty(value = JSON_PROPERTY_FIELDS)
    public @org.eclipse.jdt.annotation.Nullable List<ItemFields> getFields() {
        return fields;
    }

    @JsonProperty(value = JSON_PROPERTY_FIELDS)
    public void setFields(@org.eclipse.jdt.annotation.Nullable List<ItemFields> fields) {
        this.fields = fields;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        GetProgramsDto getProgramsDto = (GetProgramsDto) o;
        return Objects.equals(this.channelIds, getProgramsDto.channelIds)
                && Objects.equals(this.userId, getProgramsDto.userId)
                && Objects.equals(this.minStartDate, getProgramsDto.minStartDate)
                && Objects.equals(this.hasAired, getProgramsDto.hasAired)
                && Objects.equals(this.isAiring, getProgramsDto.isAiring)
                && Objects.equals(this.maxStartDate, getProgramsDto.maxStartDate)
                && Objects.equals(this.minEndDate, getProgramsDto.minEndDate)
                && Objects.equals(this.maxEndDate, getProgramsDto.maxEndDate)
                && Objects.equals(this.isMovie, getProgramsDto.isMovie)
                && Objects.equals(this.isSeries, getProgramsDto.isSeries)
                && Objects.equals(this.isNews, getProgramsDto.isNews)
                && Objects.equals(this.isKids, getProgramsDto.isKids)
                && Objects.equals(this.isSports, getProgramsDto.isSports)
                && Objects.equals(this.startIndex, getProgramsDto.startIndex)
                && Objects.equals(this.limit, getProgramsDto.limit)
                && Objects.equals(this.sortBy, getProgramsDto.sortBy)
                && Objects.equals(this.sortOrder, getProgramsDto.sortOrder)
                && Objects.equals(this.genres, getProgramsDto.genres)
                && Objects.equals(this.genreIds, getProgramsDto.genreIds)
                && Objects.equals(this.enableImages, getProgramsDto.enableImages)
                && Objects.equals(this.enableTotalRecordCount, getProgramsDto.enableTotalRecordCount)
                && Objects.equals(this.imageTypeLimit, getProgramsDto.imageTypeLimit)
                && Objects.equals(this.enableImageTypes, getProgramsDto.enableImageTypes)
                && Objects.equals(this.enableUserData, getProgramsDto.enableUserData)
                && Objects.equals(this.seriesTimerId, getProgramsDto.seriesTimerId)
                && Objects.equals(this.librarySeriesId, getProgramsDto.librarySeriesId)
                && Objects.equals(this.fields, getProgramsDto.fields);
    }

    @Override
    public int hashCode() {
        return Objects.hash(channelIds, userId, minStartDate, hasAired, isAiring, maxStartDate, minEndDate, maxEndDate,
                isMovie, isSeries, isNews, isKids, isSports, startIndex, limit, sortBy, sortOrder, genres, genreIds,
                enableImages, enableTotalRecordCount, imageTypeLimit, enableImageTypes, enableUserData, seriesTimerId,
                librarySeriesId, fields);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("class GetProgramsDto {\n");
        sb.append("    channelIds: ").append(toIndentedString(channelIds)).append("\n");
        sb.append("    userId: ").append(toIndentedString(userId)).append("\n");
        sb.append("    minStartDate: ").append(toIndentedString(minStartDate)).append("\n");
        sb.append("    hasAired: ").append(toIndentedString(hasAired)).append("\n");
        sb.append("    isAiring: ").append(toIndentedString(isAiring)).append("\n");
        sb.append("    maxStartDate: ").append(toIndentedString(maxStartDate)).append("\n");
        sb.append("    minEndDate: ").append(toIndentedString(minEndDate)).append("\n");
        sb.append("    maxEndDate: ").append(toIndentedString(maxEndDate)).append("\n");
        sb.append("    isMovie: ").append(toIndentedString(isMovie)).append("\n");
        sb.append("    isSeries: ").append(toIndentedString(isSeries)).append("\n");
        sb.append("    isNews: ").append(toIndentedString(isNews)).append("\n");
        sb.append("    isKids: ").append(toIndentedString(isKids)).append("\n");
        sb.append("    isSports: ").append(toIndentedString(isSports)).append("\n");
        sb.append("    startIndex: ").append(toIndentedString(startIndex)).append("\n");
        sb.append("    limit: ").append(toIndentedString(limit)).append("\n");
        sb.append("    sortBy: ").append(toIndentedString(sortBy)).append("\n");
        sb.append("    sortOrder: ").append(toIndentedString(sortOrder)).append("\n");
        sb.append("    genres: ").append(toIndentedString(genres)).append("\n");
        sb.append("    genreIds: ").append(toIndentedString(genreIds)).append("\n");
        sb.append("    enableImages: ").append(toIndentedString(enableImages)).append("\n");
        sb.append("    enableTotalRecordCount: ").append(toIndentedString(enableTotalRecordCount)).append("\n");
        sb.append("    imageTypeLimit: ").append(toIndentedString(imageTypeLimit)).append("\n");
        sb.append("    enableImageTypes: ").append(toIndentedString(enableImageTypes)).append("\n");
        sb.append("    enableUserData: ").append(toIndentedString(enableUserData)).append("\n");
        sb.append("    seriesTimerId: ").append(toIndentedString(seriesTimerId)).append("\n");
        sb.append("    librarySeriesId: ").append(toIndentedString(librarySeriesId)).append("\n");
        sb.append("    fields: ").append(toIndentedString(fields)).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) {
        return o == null ? "null" : o.toString().replace("\n", "\n    ");
    }

    /**
     * Convert the instance into URL query string.
     *
     * @return URL query string
     */
    public String toUrlQueryString() {
        return toUrlQueryString(null);
    }

    /**
     * Convert the instance into URL query string.
     *
     * @param prefix prefix of the query string
     * @return URL query string
     */
    public String toUrlQueryString(String prefix) {
        String suffix = "";
        String containerSuffix = "";
        String containerPrefix = "";
        if (prefix == null) {
            // style=form, explode=true, e.g. /pet?name=cat&type=manx
            prefix = "";
        } else {
            // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
            prefix = prefix + "[";
            suffix = "]";
            containerSuffix = "]";
            containerPrefix = "[";
        }

        StringJoiner joiner = new StringJoiner("&");

        // add `ChannelIds` to the URL query string
        if (getChannelIds() != null) {
            for (int i = 0; i < getChannelIds().size(); i++) {
                if (getChannelIds().get(i) != null) {
                    try {
                        joiner.add(String.format(java.util.Locale.ROOT, "%sChannelIds%s%s=%s", prefix, suffix,
                                "".equals(suffix) ? ""
                                        : String.format(java.util.Locale.ROOT, "%s%d%s", containerPrefix, i,
                                                containerSuffix),
                                URLEncoder.encode(String.valueOf(getChannelIds().get(i)), "UTF-8").replaceAll("\\+",
                                        "%20")));
                    } catch (UnsupportedEncodingException e) {
                        // Should never happen, UTF-8 is always supported
                        throw new RuntimeException(e);
                    }
                }
            }
        }

        // add `UserId` to the URL query string
        if (getUserId() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sUserId%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getUserId()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `MinStartDate` to the URL query string
        if (getMinStartDate() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sMinStartDate%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getMinStartDate()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `HasAired` to the URL query string
        if (getHasAired() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sHasAired%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getHasAired()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `IsAiring` to the URL query string
        if (getIsAiring() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sIsAiring%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getIsAiring()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `MaxStartDate` to the URL query string
        if (getMaxStartDate() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sMaxStartDate%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getMaxStartDate()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `MinEndDate` to the URL query string
        if (getMinEndDate() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sMinEndDate%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getMinEndDate()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `MaxEndDate` to the URL query string
        if (getMaxEndDate() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sMaxEndDate%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getMaxEndDate()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `IsMovie` to the URL query string
        if (getIsMovie() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sIsMovie%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getIsMovie()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `IsSeries` to the URL query string
        if (getIsSeries() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sIsSeries%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getIsSeries()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `IsNews` to the URL query string
        if (getIsNews() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sIsNews%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getIsNews()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `IsKids` to the URL query string
        if (getIsKids() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sIsKids%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getIsKids()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `IsSports` to the URL query string
        if (getIsSports() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sIsSports%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getIsSports()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `StartIndex` to the URL query string
        if (getStartIndex() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sStartIndex%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getStartIndex()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `Limit` to the URL query string
        if (getLimit() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sLimit%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getLimit()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `SortBy` to the URL query string
        if (getSortBy() != null) {
            for (int i = 0; i < getSortBy().size(); i++) {
                if (getSortBy().get(i) != null) {
                    try {
                        joiner.add(String.format(java.util.Locale.ROOT, "%sSortBy%s%s=%s", prefix, suffix,
                                "".equals(suffix) ? ""
                                        : String.format(java.util.Locale.ROOT, "%s%d%s", containerPrefix, i,
                                                containerSuffix),
                                URLEncoder.encode(String.valueOf(getSortBy().get(i)), "UTF-8").replaceAll("\\+",
                                        "%20")));
                    } catch (UnsupportedEncodingException e) {
                        // Should never happen, UTF-8 is always supported
                        throw new RuntimeException(e);
                    }
                }
            }
        }

        // add `SortOrder` to the URL query string
        if (getSortOrder() != null) {
            for (int i = 0; i < getSortOrder().size(); i++) {
                if (getSortOrder().get(i) != null) {
                    try {
                        joiner.add(String.format(java.util.Locale.ROOT, "%sSortOrder%s%s=%s", prefix, suffix,
                                "".equals(suffix) ? ""
                                        : String.format(java.util.Locale.ROOT, "%s%d%s", containerPrefix, i,
                                                containerSuffix),
                                URLEncoder.encode(String.valueOf(getSortOrder().get(i)), "UTF-8").replaceAll("\\+",
                                        "%20")));
                    } catch (UnsupportedEncodingException e) {
                        // Should never happen, UTF-8 is always supported
                        throw new RuntimeException(e);
                    }
                }
            }
        }

        // add `Genres` to the URL query string
        if (getGenres() != null) {
            for (int i = 0; i < getGenres().size(); i++) {
                try {
                    joiner.add(String.format(java.util.Locale.ROOT, "%sGenres%s%s=%s", prefix, suffix,
                            "".equals(suffix) ? ""
                                    : String.format(java.util.Locale.ROOT, "%s%d%s", containerPrefix, i,
                                            containerSuffix),
                            URLEncoder.encode(String.valueOf(getGenres().get(i)), "UTF-8").replaceAll("\\+", "%20")));
                } catch (UnsupportedEncodingException e) {
                    // Should never happen, UTF-8 is always supported
                    throw new RuntimeException(e);
                }
            }
        }

        // add `GenreIds` to the URL query string
        if (getGenreIds() != null) {
            for (int i = 0; i < getGenreIds().size(); i++) {
                if (getGenreIds().get(i) != null) {
                    try {
                        joiner.add(String.format(java.util.Locale.ROOT, "%sGenreIds%s%s=%s", prefix, suffix,
                                "".equals(suffix) ? ""
                                        : String.format(java.util.Locale.ROOT, "%s%d%s", containerPrefix, i,
                                                containerSuffix),
                                URLEncoder.encode(String.valueOf(getGenreIds().get(i)), "UTF-8").replaceAll("\\+",
                                        "%20")));
                    } catch (UnsupportedEncodingException e) {
                        // Should never happen, UTF-8 is always supported
                        throw new RuntimeException(e);
                    }
                }
            }
        }

        // add `EnableImages` to the URL query string
        if (getEnableImages() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sEnableImages%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getEnableImages()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `EnableTotalRecordCount` to the URL query string
        if (getEnableTotalRecordCount() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sEnableTotalRecordCount%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getEnableTotalRecordCount()), "UTF-8").replaceAll("\\+",
                                "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `ImageTypeLimit` to the URL query string
        if (getImageTypeLimit() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sImageTypeLimit%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getImageTypeLimit()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `EnableImageTypes` to the URL query string
        if (getEnableImageTypes() != null) {
            for (int i = 0; i < getEnableImageTypes().size(); i++) {
                if (getEnableImageTypes().get(i) != null) {
                    try {
                        joiner.add(String.format(java.util.Locale.ROOT, "%sEnableImageTypes%s%s=%s", prefix, suffix,
                                "".equals(suffix) ? ""
                                        : String.format(java.util.Locale.ROOT, "%s%d%s", containerPrefix, i,
                                                containerSuffix),
                                URLEncoder.encode(String.valueOf(getEnableImageTypes().get(i)), "UTF-8")
                                        .replaceAll("\\+", "%20")));
                    } catch (UnsupportedEncodingException e) {
                        // Should never happen, UTF-8 is always supported
                        throw new RuntimeException(e);
                    }
                }
            }
        }

        // add `EnableUserData` to the URL query string
        if (getEnableUserData() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sEnableUserData%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getEnableUserData()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `SeriesTimerId` to the URL query string
        if (getSeriesTimerId() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sSeriesTimerId%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getSeriesTimerId()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `LibrarySeriesId` to the URL query string
        if (getLibrarySeriesId() != null) {
            try {
                joiner.add(String.format(java.util.Locale.ROOT, "%sLibrarySeriesId%s=%s", prefix, suffix,
                        URLEncoder.encode(String.valueOf(getLibrarySeriesId()), "UTF-8").replaceAll("\\+", "%20")));
            } catch (UnsupportedEncodingException e) {
                // Should never happen, UTF-8 is always supported
                throw new RuntimeException(e);
            }
        }

        // add `Fields` to the URL query string
        if (getFields() != null) {
            for (int i = 0; i < getFields().size(); i++) {
                if (getFields().get(i) != null) {
                    try {
                        joiner.add(String.format(java.util.Locale.ROOT, "%sFields%s%s=%s", prefix, suffix,
                                "".equals(suffix) ? ""
                                        : String.format(java.util.Locale.ROOT, "%s%d%s", containerPrefix, i,
                                                containerSuffix),
                                URLEncoder.encode(String.valueOf(getFields().get(i)), "UTF-8").replaceAll("\\+",
                                        "%20")));
                    } catch (UnsupportedEncodingException e) {
                        // Should never happen, UTF-8 is always supported
                        throw new RuntimeException(e);
                    }
                }
            }
        }

        return joiner.toString();
    }

    public static class Builder {

        private GetProgramsDto instance;

        public Builder() {
            this(new GetProgramsDto());
        }

        protected Builder(GetProgramsDto instance) {
            this.instance = instance;
        }

        public GetProgramsDto.Builder channelIds(List<UUID> channelIds) {
            this.instance.channelIds = channelIds;
            return this;
        }

        public GetProgramsDto.Builder userId(UUID userId) {
            this.instance.userId = userId;
            return this;
        }

        public GetProgramsDto.Builder minStartDate(OffsetDateTime minStartDate) {
            this.instance.minStartDate = minStartDate;
            return this;
        }

        public GetProgramsDto.Builder hasAired(Boolean hasAired) {
            this.instance.hasAired = hasAired;
            return this;
        }

        public GetProgramsDto.Builder isAiring(Boolean isAiring) {
            this.instance.isAiring = isAiring;
            return this;
        }

        public GetProgramsDto.Builder maxStartDate(OffsetDateTime maxStartDate) {
            this.instance.maxStartDate = maxStartDate;
            return this;
        }

        public GetProgramsDto.Builder minEndDate(OffsetDateTime minEndDate) {
            this.instance.minEndDate = minEndDate;
            return this;
        }

        public GetProgramsDto.Builder maxEndDate(OffsetDateTime maxEndDate) {
            this.instance.maxEndDate = maxEndDate;
            return this;
        }

        public GetProgramsDto.Builder isMovie(Boolean isMovie) {
            this.instance.isMovie = isMovie;
            return this;
        }

        public GetProgramsDto.Builder isSeries(Boolean isSeries) {
            this.instance.isSeries = isSeries;
            return this;
        }

        public GetProgramsDto.Builder isNews(Boolean isNews) {
            this.instance.isNews = isNews;
            return this;
        }

        public GetProgramsDto.Builder isKids(Boolean isKids) {
            this.instance.isKids = isKids;
            return this;
        }

        public GetProgramsDto.Builder isSports(Boolean isSports) {
            this.instance.isSports = isSports;
            return this;
        }

        public GetProgramsDto.Builder startIndex(Integer startIndex) {
            this.instance.startIndex = startIndex;
            return this;
        }

        public GetProgramsDto.Builder limit(Integer limit) {
            this.instance.limit = limit;
            return this;
        }

        public GetProgramsDto.Builder sortBy(List<ItemSortBy> sortBy) {
            this.instance.sortBy = sortBy;
            return this;
        }

        public GetProgramsDto.Builder sortOrder(List<SortOrder> sortOrder) {
            this.instance.sortOrder = sortOrder;
            return this;
        }

        public GetProgramsDto.Builder genres(List<String> genres) {
            this.instance.genres = genres;
            return this;
        }

        public GetProgramsDto.Builder genreIds(List<UUID> genreIds) {
            this.instance.genreIds = genreIds;
            return this;
        }

        public GetProgramsDto.Builder enableImages(Boolean enableImages) {
            this.instance.enableImages = enableImages;
            return this;
        }

        public GetProgramsDto.Builder enableTotalRecordCount(Boolean enableTotalRecordCount) {
            this.instance.enableTotalRecordCount = enableTotalRecordCount;
            return this;
        }

        public GetProgramsDto.Builder imageTypeLimit(Integer imageTypeLimit) {
            this.instance.imageTypeLimit = imageTypeLimit;
            return this;
        }

        public GetProgramsDto.Builder enableImageTypes(List<ImageType> enableImageTypes) {
            this.instance.enableImageTypes = enableImageTypes;
            return this;
        }

        public GetProgramsDto.Builder enableUserData(Boolean enableUserData) {
            this.instance.enableUserData = enableUserData;
            return this;
        }

        public GetProgramsDto.Builder seriesTimerId(String seriesTimerId) {
            this.instance.seriesTimerId = seriesTimerId;
            return this;
        }

        public GetProgramsDto.Builder librarySeriesId(UUID librarySeriesId) {
            this.instance.librarySeriesId = librarySeriesId;
            return this;
        }

        public GetProgramsDto.Builder fields(List<ItemFields> fields) {
            this.instance.fields = fields;
            return this;
        }

        /**
         * returns a built GetProgramsDto instance.
         *
         * The builder is not reusable.
         */
        public GetProgramsDto build() {
            try {
                return this.instance;
            } finally {
                // ensure that this.instance is not reused
                this.instance = null;
            }
        }

        @Override
        public String toString() {
            return getClass() + "=(" + instance + ")";
        }
    }

    /**
     * Create a builder with no initialized field.
     */
    public static GetProgramsDto.Builder builder() {
        return new GetProgramsDto.Builder();
    }

    /**
     * Create a builder with a shallow copy of this instance.
     */
    public GetProgramsDto.Builder toBuilder() {
        return new GetProgramsDto.Builder().channelIds(getChannelIds()).userId(getUserId())
                .minStartDate(getMinStartDate()).hasAired(getHasAired()).isAiring(getIsAiring())
                .maxStartDate(getMaxStartDate()).minEndDate(getMinEndDate()).maxEndDate(getMaxEndDate())
                .isMovie(getIsMovie()).isSeries(getIsSeries()).isNews(getIsNews()).isKids(getIsKids())
                .isSports(getIsSports()).startIndex(getStartIndex()).limit(getLimit()).sortBy(getSortBy())
                .sortOrder(getSortOrder()).genres(getGenres()).genreIds(getGenreIds()).enableImages(getEnableImages())
                .enableTotalRecordCount(getEnableTotalRecordCount()).imageTypeLimit(getImageTypeLimit())
                .enableImageTypes(getEnableImageTypes()).enableUserData(getEnableUserData())
                .seriesTimerId(getSeriesTimerId()).librarySeriesId(getLibrarySeriesId()).fields(getFields());
    }
}
