// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.

package anilist

import (
	"fmt"
	"io"
	"strconv"
)

// Activity union type
type ActivityUnion interface {
	IsActivityUnion()
}

// Likeable union type
type LikeableUnion interface {
	IsLikeableUnion()
}

// Notification union type
type NotificationUnion interface {
	IsNotificationUnion()
}

// Notification for when a activity is liked
type ActivityLikeNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who liked to the activity
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the activity which was liked
	ActivityID int `json:"activityId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The liked activity
	Activity ActivityUnion `json:"activity,omitempty"`
	// The user who liked the activity
	User *User `json:"user,omitempty"`
}

func (ActivityLikeNotification) IsNotificationUnion() {}

// Notification for when authenticated user is @ mentioned in activity or reply
type ActivityMentionNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who mentioned the authenticated user
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the activity where mentioned
	ActivityID int `json:"activityId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The liked activity
	Activity ActivityUnion `json:"activity,omitempty"`
	// The user who mentioned the authenticated user
	User *User `json:"user,omitempty"`
}

func (ActivityMentionNotification) IsNotificationUnion() {}

// Notification for when a user is send an activity message
type ActivityMessageNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The if of the user who send the message
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the activity message
	ActivityID int `json:"activityId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The message activity
	Message *MessageActivity `json:"message,omitempty"`
	// The user who sent the message
	User *User `json:"user,omitempty"`
}

func (ActivityMessageNotification) IsNotificationUnion() {}

// Replay to an activity item
type ActivityReply struct {
	// The id of the reply
	ID int `json:"id"`
	// The id of the replies creator
	UserID *int `json:"userId,omitempty"`
	// The id of the parent activity
	ActivityID *int `json:"activityId,omitempty"`
	// The reply text
	Text *string `json:"text,omitempty"`
	// The amount of likes the reply has
	LikeCount int `json:"likeCount"`
	// If the currently authenticated user liked the reply
	IsLiked *bool `json:"isLiked,omitempty"`
	// The time the reply was created at
	CreatedAt int `json:"createdAt"`
	// The user who created reply
	User *User `json:"user,omitempty"`
	// The users who liked the reply
	Likes []*User `json:"likes,omitempty"`
}

func (ActivityReply) IsLikeableUnion() {}

// Notification for when a activity reply is liked
type ActivityReplyLikeNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who liked to the activity reply
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the activity where the reply which was liked
	ActivityID int `json:"activityId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The liked activity
	Activity ActivityUnion `json:"activity,omitempty"`
	// The user who liked the activity reply
	User *User `json:"user,omitempty"`
}

func (ActivityReplyLikeNotification) IsNotificationUnion() {}

// Notification for when a user replies to the authenticated users activity
type ActivityReplyNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who replied to the activity
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the activity which was replied too
	ActivityID int `json:"activityId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The liked activity
	Activity ActivityUnion `json:"activity,omitempty"`
	// The user who replied to the activity
	User *User `json:"user,omitempty"`
}

func (ActivityReplyNotification) IsNotificationUnion() {}

// Notification for when a user replies to activity the authenticated user has replied to
type ActivityReplySubscribedNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who replied to the activity
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the activity which was replied too
	ActivityID int `json:"activityId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The liked activity
	Activity ActivityUnion `json:"activity,omitempty"`
	// The user who replied to the activity
	User *User `json:"user,omitempty"`
}

func (ActivityReplySubscribedNotification) IsNotificationUnion() {}

// Notification for when an episode of anime airs
type AiringNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the aired anime
	AnimeID int `json:"animeId"`
	// The episode number that just aired
	Episode int `json:"episode"`
	// The notification context text
	Contexts []*string `json:"contexts,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The associated media of the airing schedule
	Media *Media `json:"media,omitempty"`
}

func (AiringNotification) IsNotificationUnion() {}

// Score & Watcher stats for airing anime by episode and mid-week
type AiringProgression struct {
	// The episode the stats were recorded at. .5 is the mid point between 2 episodes airing dates.
	Episode *float64 `json:"episode,omitempty"`
	// The average score for the media
	Score *float64 `json:"score,omitempty"`
	// The amount of users watching the anime
	Watching *int `json:"watching,omitempty"`
}

// Media Airing Schedule. NOTE: We only aim to guarantee that FUTURE airing data is present and accurate.
type AiringSchedule struct {
	// The id of the airing schedule item
	ID int `json:"id"`
	// The time the episode airs at
	AiringAt int `json:"airingAt"`
	// Seconds until episode starts airing
	TimeUntilAiring int `json:"timeUntilAiring"`
	// The airing episode number
	Episode int `json:"episode"`
	// The associate media id of the airing episode
	MediaID int `json:"mediaId"`
	// The associate media of the airing episode
	Media *Media `json:"media,omitempty"`
}

type AiringScheduleConnection struct {
	Edges []*AiringScheduleEdge `json:"edges,omitempty"`
	Nodes []*AiringSchedule     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

// AiringSchedule connection edge
type AiringScheduleEdge struct {
	Node *AiringSchedule `json:"node,omitempty"`
	// The id of the connection
	ID *int `json:"id,omitempty"`
}

type AiringScheduleInput struct {
	AiringAt        *int `json:"airingAt,omitempty"`
	Episode         *int `json:"episode,omitempty"`
	TimeUntilAiring *int `json:"timeUntilAiring,omitempty"`
}

type AniChartHighlightInput struct {
	MediaID   *int    `json:"mediaId,omitempty"`
	Highlight *string `json:"highlight,omitempty"`
}

type AniChartUser struct {
	User       *User   `json:"user,omitempty"`
	Settings   *string `json:"settings,omitempty"`
	Highlights *string `json:"highlights,omitempty"`
}

// A character that features in an anime or manga
type Character struct {
	// The id of the character
	ID int `json:"id"`
	// The names of the character
	Name *CharacterName `json:"name,omitempty"`
	// Character images
	Image *CharacterImage `json:"image,omitempty"`
	// A general description of the character
	Description *string `json:"description,omitempty"`
	// The character's gender. Usually Male, Female, or Non-binary but can be any string.
	Gender *string `json:"gender,omitempty"`
	// The character's birth date
	DateOfBirth *FuzzyDate `json:"dateOfBirth,omitempty"`
	// The character's age. Note this is a string, not an int, it may contain further text and additional ages.
	Age *string `json:"age,omitempty"`
	// The characters blood type
	BloodType *string `json:"bloodType,omitempty"`
	// If the character is marked as favourite by the currently authenticated user
	IsFavourite bool `json:"isFavourite"`
	// If the character is blocked from being added to favourites
	IsFavouriteBlocked bool `json:"isFavouriteBlocked"`
	// The url for the character page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// Media that includes the character
	Media     *MediaConnection `json:"media,omitempty"`
	UpdatedAt *int             `json:"updatedAt,omitempty"`
	// The amount of user's who have favourited the character
	Favourites *int `json:"favourites,omitempty"`
	// Notes for site moderators
	ModNotes *string `json:"modNotes,omitempty"`
}

type CharacterConnection struct {
	Edges []*CharacterEdge `json:"edges,omitempty"`
	Nodes []*Character     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

// Character connection edge
type CharacterEdge struct {
	Node *Character `json:"node,omitempty"`
	// The id of the connection
	ID *int `json:"id,omitempty"`
	// The characters role in the media
	Role *CharacterRole `json:"role,omitempty"`
	// Media specific character name
	Name *string `json:"name,omitempty"`
	// The voice actors of the character
	VoiceActors []*Staff `json:"voiceActors,omitempty"`
	// The voice actors of the character with role date
	VoiceActorRoles []*StaffRoleType `json:"voiceActorRoles,omitempty"`
	// The media the character is in
	Media []*Media `json:"media,omitempty"`
	// The order the character should be displayed from the users favourites
	FavouriteOrder *int `json:"favouriteOrder,omitempty"`
}

type CharacterImage struct {
	// The character's image of media at its largest size
	Large *string `json:"large,omitempty"`
	// The character's image of media at medium size
	Medium *string `json:"medium,omitempty"`
}

// The names of the character
type CharacterName struct {
	// The character's given name
	First *string `json:"first,omitempty"`
	// The character's middle name
	Middle *string `json:"middle,omitempty"`
	// The character's surname
	Last *string `json:"last,omitempty"`
	// The character's first and last name
	Full *string `json:"full,omitempty"`
	// The character's full name in their native language
	Native *string `json:"native,omitempty"`
	// Other names the character might be referred to as
	Alternative []*string `json:"alternative,omitempty"`
	// Other names the character might be referred to as but are spoilers
	AlternativeSpoiler []*string `json:"alternativeSpoiler,omitempty"`
	// The currently authenticated users preferred name language. Default romaji for non-authenticated
	UserPreferred *string `json:"userPreferred,omitempty"`
}

// The names of the character
type CharacterNameInput struct {
	// The character's given name
	First *string `json:"first,omitempty"`
	// The character's middle name
	Middle *string `json:"middle,omitempty"`
	// The character's surname
	Last *string `json:"last,omitempty"`
	// The character's full name in their native language
	Native *string `json:"native,omitempty"`
	// Other names the character might be referred by
	Alternative []*string `json:"alternative,omitempty"`
	// Other names the character might be referred to as but are spoilers
	AlternativeSpoiler []*string `json:"alternativeSpoiler,omitempty"`
}

// A submission for a character that features in an anime or manga
type CharacterSubmission struct {
	// The id of the submission
	ID int `json:"id"`
	// Character that the submission is referencing
	Character *Character `json:"character,omitempty"`
	// The character submission changes
	Submission *Character `json:"submission,omitempty"`
	// Submitter for the submission
	Submitter *User `json:"submitter,omitempty"`
	// Data Mod assigned to handle the submission
	Assignee *User `json:"assignee,omitempty"`
	// Status of the submission
	Status *SubmissionStatus `json:"status,omitempty"`
	// Inner details of submission status
	Notes  *string `json:"notes,omitempty"`
	Source *string `json:"source,omitempty"`
	// Whether the submission is locked
	Locked    *bool `json:"locked,omitempty"`
	CreatedAt *int  `json:"createdAt,omitempty"`
}

type CharacterSubmissionConnection struct {
	Edges []*CharacterSubmissionEdge `json:"edges,omitempty"`
	Nodes []*CharacterSubmission     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

// CharacterSubmission connection edge
type CharacterSubmissionEdge struct {
	Node *CharacterSubmission `json:"node,omitempty"`
	// The characters role in the media
	Role *CharacterRole `json:"role,omitempty"`
	// The voice actors of the character
	VoiceActors []*Staff `json:"voiceActors,omitempty"`
	// The submitted voice actors of the character
	SubmittedVoiceActors []*StaffSubmission `json:"submittedVoiceActors,omitempty"`
}

// Deleted data type
type Deleted struct {
	// If an item has been successfully deleted
	Deleted *bool `json:"deleted,omitempty"`
}

// User's favourite anime, manga, characters, staff & studios
type Favourites struct {
	// Favourite anime
	Anime *MediaConnection `json:"anime,omitempty"`
	// Favourite manga
	Manga *MediaConnection `json:"manga,omitempty"`
	// Favourite characters
	Characters *CharacterConnection `json:"characters,omitempty"`
	// Favourite staff
	Staff *StaffConnection `json:"staff,omitempty"`
	// Favourite studios
	Studios *StudioConnection `json:"studios,omitempty"`
}

// Notification for when the authenticated user is followed by another user
type FollowingNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who followed the authenticated user
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The liked activity
	User *User `json:"user,omitempty"`
}

func (FollowingNotification) IsNotificationUnion() {}

// User's format statistics
type FormatStats struct {
	Format *MediaFormat `json:"format,omitempty"`
	Amount *int         `json:"amount,omitempty"`
}

// Date object that allows for incomplete date values (fuzzy)
type FuzzyDate struct {
	// Numeric Year (2017)
	Year *int `json:"year,omitempty"`
	// Numeric Month (3)
	Month *int `json:"month,omitempty"`
	// Numeric Day (24)
	Day *int `json:"day,omitempty"`
}

// Date object that allows for incomplete date values (fuzzy)
type FuzzyDateInput struct {
	// Numeric Year (2017)
	Year *int `json:"year,omitempty"`
	// Numeric Month (3)
	Month *int `json:"month,omitempty"`
	// Numeric Day (24)
	Day *int `json:"day,omitempty"`
}

// User's genre statistics
type GenreStats struct {
	Genre     *string `json:"genre,omitempty"`
	Amount    *int    `json:"amount,omitempty"`
	MeanScore *int    `json:"meanScore,omitempty"`
	// The amount of time in minutes the genre has been watched by the user
	TimeWatched *int `json:"timeWatched,omitempty"`
}

// Page of data (Used for internal use only)
type InternalPage struct {
	MediaSubmissions     []*MediaSubmission     `json:"mediaSubmissions,omitempty"`
	CharacterSubmissions []*CharacterSubmission `json:"characterSubmissions,omitempty"`
	StaffSubmissions     []*StaffSubmission     `json:"staffSubmissions,omitempty"`
	RevisionHistory      []*RevisionHistory     `json:"revisionHistory,omitempty"`
	Reports              []*Report              `json:"reports,omitempty"`
	ModActions           []*ModAction           `json:"modActions,omitempty"`
	UserBlockSearch      []*User                `json:"userBlockSearch,omitempty"`
	// The pagination information
	PageInfo        *PageInfo           `json:"pageInfo,omitempty"`
	Users           []*User             `json:"users,omitempty"`
	Media           []*Media            `json:"media,omitempty"`
	Characters      []*Character        `json:"characters,omitempty"`
	Staff           []*Staff            `json:"staff,omitempty"`
	Studios         []*Studio           `json:"studios,omitempty"`
	MediaList       []*MediaList        `json:"mediaList,omitempty"`
	AiringSchedules []*AiringSchedule   `json:"airingSchedules,omitempty"`
	MediaTrends     []*MediaTrend       `json:"mediaTrends,omitempty"`
	Notifications   []NotificationUnion `json:"notifications,omitempty"`
	Followers       []*User             `json:"followers,omitempty"`
	Following       []*User             `json:"following,omitempty"`
	Activities      []ActivityUnion     `json:"activities,omitempty"`
	ActivityReplies []*ActivityReply    `json:"activityReplies,omitempty"`
	Threads         []*Thread           `json:"threads,omitempty"`
	ThreadComments  []*ThreadComment    `json:"threadComments,omitempty"`
	Reviews         []*Review           `json:"reviews,omitempty"`
	Recommendations []*Recommendation   `json:"recommendations,omitempty"`
	Likes           []*User             `json:"likes,omitempty"`
}

// User list activity (anime & manga updates)
type ListActivity struct {
	// The id of the activity
	ID int `json:"id"`
	// The user id of the activity's creator
	UserID *int `json:"userId,omitempty"`
	// The type of activity
	Type *ActivityType `json:"type,omitempty"`
	// The number of activity replies
	ReplyCount int `json:"replyCount"`
	// The list item's textual status
	Status *string `json:"status,omitempty"`
	// The list progress made
	Progress *string `json:"progress,omitempty"`
	// If the activity is locked and can receive replies
	IsLocked *bool `json:"isLocked,omitempty"`
	// If the currently authenticated user is subscribed to the activity
	IsSubscribed *bool `json:"isSubscribed,omitempty"`
	// The amount of likes the activity has
	LikeCount int `json:"likeCount"`
	// If the currently authenticated user liked the activity
	IsLiked *bool `json:"isLiked,omitempty"`
	// If the activity is pinned to the top of the users activity feed
	IsPinned *bool `json:"isPinned,omitempty"`
	// The url for the activity page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// The time the activity was created at
	CreatedAt int `json:"createdAt"`
	// The owner of the activity
	User *User `json:"user,omitempty"`
	// The associated media to the activity update
	Media *Media `json:"media,omitempty"`
	// The written replies to the activity
	Replies []*ActivityReply `json:"replies,omitempty"`
	// The users who liked the activity
	Likes []*User `json:"likes,omitempty"`
}

func (ListActivity) IsActivityUnion() {}

func (ListActivity) IsLikeableUnion() {}

type ListActivityOption struct {
	Disabled *bool            `json:"disabled,omitempty"`
	Type     *MediaListStatus `json:"type,omitempty"`
}

type ListActivityOptionInput struct {
	Disabled *bool            `json:"disabled,omitempty"`
	Type     *MediaListStatus `json:"type,omitempty"`
}

// User's list score statistics
type ListScoreStats struct {
	MeanScore         *int `json:"meanScore,omitempty"`
	StandardDeviation *int `json:"standardDeviation,omitempty"`
}

// Anime or Manga
type Media struct {
	// The id of the media
	ID int `json:"id"`
	// The mal id of the media
	IDMal *int `json:"idMal,omitempty"`
	// The official titles of the media in various languages
	Title *MediaTitle `json:"title,omitempty"`
	// The type of the media; anime or manga
	Type *MediaType `json:"type,omitempty"`
	// The format the media was released in
	Format *MediaFormat `json:"format,omitempty"`
	// The current releasing status of the media
	Status *MediaStatus `json:"status,omitempty"`
	// Short description of the media's story and characters
	Description *string `json:"description,omitempty"`
	// The first official release date of the media
	StartDate *FuzzyDate `json:"startDate,omitempty"`
	// The last official release date of the media
	EndDate *FuzzyDate `json:"endDate,omitempty"`
	// The season the media was initially released in
	Season *MediaSeason `json:"season,omitempty"`
	// The season year the media was initially released in
	SeasonYear *int `json:"seasonYear,omitempty"`
	// The year & season the media was initially released in
	SeasonInt *int `json:"seasonInt,omitempty"`
	// The amount of episodes the anime has when complete
	Episodes *int `json:"episodes,omitempty"`
	// The general length of each anime episode in minutes
	Duration *int `json:"duration,omitempty"`
	// The amount of chapters the manga has when complete
	Chapters *int `json:"chapters,omitempty"`
	// The amount of volumes the manga has when complete
	Volumes *int `json:"volumes,omitempty"`
	// Where the media was created. (ISO 3166-1 alpha-2)
	CountryOfOrigin *string `json:"countryOfOrigin,omitempty"`
	// If the media is officially licensed or a self-published doujin release
	IsLicensed *bool `json:"isLicensed,omitempty"`
	// Source type the media was adapted from.
	Source *MediaSource `json:"source,omitempty"`
	// Official Twitter hashtags for the media
	Hashtag *string `json:"hashtag,omitempty"`
	// Media trailer or advertisement
	Trailer *MediaTrailer `json:"trailer,omitempty"`
	// When the media's data was last updated
	UpdatedAt *int `json:"updatedAt,omitempty"`
	// The cover images of the media
	CoverImage *MediaCoverImage `json:"coverImage,omitempty"`
	// The banner image of the media
	BannerImage *string `json:"bannerImage,omitempty"`
	// The genres of the media
	Genres []*string `json:"genres,omitempty"`
	// Alternative titles of the media
	Synonyms []*string `json:"synonyms,omitempty"`
	// A weighted average score of all the user's scores of the media
	AverageScore *int `json:"averageScore,omitempty"`
	// Mean score of all the user's scores of the media
	MeanScore *int `json:"meanScore,omitempty"`
	// The number of users with the media on their list
	Popularity *int `json:"popularity,omitempty"`
	// Locked media may not be added to lists our favorited. This may be due to the entry pending for deletion or other reasons.
	IsLocked *bool `json:"isLocked,omitempty"`
	// The amount of related activity in the past hour
	Trending *int `json:"trending,omitempty"`
	// The amount of user's who have favourited the media
	Favourites *int `json:"favourites,omitempty"`
	// List of tags that describes elements and themes of the media
	Tags []*MediaTag `json:"tags,omitempty"`
	// Other media in the same or connecting franchise
	Relations *MediaConnection `json:"relations,omitempty"`
	// The characters in the media
	Characters *CharacterConnection `json:"characters,omitempty"`
	// The staff who produced the media
	Staff *StaffConnection `json:"staff,omitempty"`
	// The companies who produced the media
	Studios *StudioConnection `json:"studios,omitempty"`
	// If the media is marked as favourite by the current authenticated user
	IsFavourite bool `json:"isFavourite"`
	// If the media is blocked from being added to favourites
	IsFavouriteBlocked bool `json:"isFavouriteBlocked"`
	// If the media is intended only for 18+ adult audiences
	IsAdult *bool `json:"isAdult,omitempty"`
	// The media's next episode airing schedule
	NextAiringEpisode *AiringSchedule `json:"nextAiringEpisode,omitempty"`
	// The media's entire airing schedule
	AiringSchedule *AiringScheduleConnection `json:"airingSchedule,omitempty"`
	// The media's daily trend stats
	Trends *MediaTrendConnection `json:"trends,omitempty"`
	// External links to another site related to the media
	ExternalLinks []*MediaExternalLink `json:"externalLinks,omitempty"`
	// Data and links to legal streaming episodes on external sites
	StreamingEpisodes []*MediaStreamingEpisode `json:"streamingEpisodes,omitempty"`
	// The ranking of the media in a particular time span and format compared to other media
	Rankings []*MediaRank `json:"rankings,omitempty"`
	// The authenticated user's media list entry for the media
	MediaListEntry *MediaList `json:"mediaListEntry,omitempty"`
	// User reviews of the media
	Reviews *ReviewConnection `json:"reviews,omitempty"`
	// User recommendations for similar media
	Recommendations *RecommendationConnection `json:"recommendations,omitempty"`
	Stats           *MediaStats               `json:"stats,omitempty"`
	// The url for the media page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// If the media should have forum thread automatically created for it on airing episode release
	AutoCreateForumThread *bool `json:"autoCreateForumThread,omitempty"`
	// If the media is blocked from being recommended to/from
	IsRecommendationBlocked *bool `json:"isRecommendationBlocked,omitempty"`
	// If the media is blocked from being reviewed
	IsReviewBlocked *bool `json:"isReviewBlocked,omitempty"`
	// Notes for site moderators
	ModNotes *string `json:"modNotes,omitempty"`
}

// Internal - Media characters separated
type MediaCharacter struct {
	// The id of the connection
	ID *int `json:"id,omitempty"`
	// The characters role in the media
	Role      *CharacterRole `json:"role,omitempty"`
	RoleNotes *string        `json:"roleNotes,omitempty"`
	DubGroup  *string        `json:"dubGroup,omitempty"`
	// Media specific character name
	CharacterName *string `json:"characterName,omitempty"`
	// The characters in the media voiced by the parent actor
	Character *Character `json:"character,omitempty"`
	// The voice actor of the character
	VoiceActor *Staff `json:"voiceActor,omitempty"`
}

type MediaConnection struct {
	Edges []*MediaEdge `json:"edges,omitempty"`
	Nodes []*Media     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

type MediaCoverImage struct {
	// The cover image url of the media at its largest size. If this size isn't available, large will be provided instead.
	ExtraLarge *string `json:"extraLarge,omitempty"`
	// The cover image url of the media at a large size
	Large *string `json:"large,omitempty"`
	// The cover image url of the media at medium size
	Medium *string `json:"medium,omitempty"`
	// Average #hex color of cover image
	Color *string `json:"color,omitempty"`
}

// Notification for when a media entry's data was changed in a significant way impacting users' list tracking
type MediaDataChangeNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the media that received data changes
	MediaID int `json:"mediaId"`
	// The reason for the media data change
	Context *string `json:"context,omitempty"`
	// The reason for the media data change
	Reason *string `json:"reason,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The media that received data changes
	Media *Media `json:"media,omitempty"`
}

func (MediaDataChangeNotification) IsNotificationUnion() {}

// Notification for when a media tracked in a user's list is deleted from the site
type MediaDeletionNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The title of the deleted media
	DeletedMediaTitle *string `json:"deletedMediaTitle,omitempty"`
	// The reason for the media deletion
	Context *string `json:"context,omitempty"`
	// The reason for the media deletion
	Reason *string `json:"reason,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
}

func (MediaDeletionNotification) IsNotificationUnion() {}

// Media connection edge
type MediaEdge struct {
	Node *Media `json:"node,omitempty"`
	// The id of the connection
	ID *int `json:"id,omitempty"`
	// The type of relation to the parent model
	RelationType *MediaRelation `json:"relationType,omitempty"`
	// If the studio is the main animation studio of the media (For Studio->MediaConnection field only)
	IsMainStudio bool `json:"isMainStudio"`
	// The characters in the media voiced by the parent actor
	Characters []*Character `json:"characters,omitempty"`
	// The characters role in the media
	CharacterRole *CharacterRole `json:"characterRole,omitempty"`
	// Media specific character name
	CharacterName *string `json:"characterName,omitempty"`
	// Notes regarding the VA's role for the character
	RoleNotes *string `json:"roleNotes,omitempty"`
	// Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant.
	DubGroup *string `json:"dubGroup,omitempty"`
	// The role of the staff member in the production of the media
	StaffRole *string `json:"staffRole,omitempty"`
	// The voice actors of the character
	VoiceActors []*Staff `json:"voiceActors,omitempty"`
	// The voice actors of the character with role date
	VoiceActorRoles []*StaffRoleType `json:"voiceActorRoles,omitempty"`
	// The order the media should be displayed from the users favourites
	FavouriteOrder *int `json:"favouriteOrder,omitempty"`
}

// An external link to another site related to the media or staff member
type MediaExternalLink struct {
	// The id of the external link
	ID int `json:"id"`
	// The url of the external link or base url of link source
	URL *string `json:"url,omitempty"`
	// The links website site name
	Site string `json:"site"`
	// The links website site id
	SiteID *int              `json:"siteId,omitempty"`
	Type   *ExternalLinkType `json:"type,omitempty"`
	// Language the site content is in. See Staff language field for values.
	Language *string `json:"language,omitempty"`
	Color    *string `json:"color,omitempty"`
	// The icon image url of the site. Not available for all links. Transparent PNG 64x64
	Icon       *string `json:"icon,omitempty"`
	Notes      *string `json:"notes,omitempty"`
	IsDisabled *bool   `json:"isDisabled,omitempty"`
}

// An external link to another site related to the media
type MediaExternalLinkInput struct {
	// The id of the external link
	ID int `json:"id"`
	// The url of the external link
	URL string `json:"url"`
	// The site location of the external link
	Site string `json:"site"`
}

// List of anime or manga
type MediaList struct {
	// The id of the list entry
	ID int `json:"id"`
	// The id of the user owner of the list entry
	UserID int `json:"userId"`
	// The id of the media
	MediaID int `json:"mediaId"`
	// The watching/reading status
	Status *MediaListStatus `json:"status,omitempty"`
	// The score of the entry
	Score *float64 `json:"score,omitempty"`
	// The amount of episodes/chapters consumed by the user
	Progress *int `json:"progress,omitempty"`
	// The amount of volumes read by the user
	ProgressVolumes *int `json:"progressVolumes,omitempty"`
	// The amount of times the user has rewatched/read the media
	Repeat *int `json:"repeat,omitempty"`
	// Priority of planning
	Priority *int `json:"priority,omitempty"`
	// If the entry should only be visible to authenticated user
	Private *bool `json:"private,omitempty"`
	// Text notes
	Notes *string `json:"notes,omitempty"`
	// If the entry shown be hidden from non-custom lists
	HiddenFromStatusLists *bool `json:"hiddenFromStatusLists,omitempty"`
	// Map of booleans for which custom lists the entry are in
	CustomLists *string `json:"customLists,omitempty"`
	// Map of advanced scores with name keys
	AdvancedScores *string `json:"advancedScores,omitempty"`
	// When the entry was started by the user
	StartedAt *FuzzyDate `json:"startedAt,omitempty"`
	// When the entry was completed by the user
	CompletedAt *FuzzyDate `json:"completedAt,omitempty"`
	// When the entry data was last updated
	UpdatedAt *int `json:"updatedAt,omitempty"`
	// When the entry data was created
	CreatedAt *int   `json:"createdAt,omitempty"`
	Media     *Media `json:"media,omitempty"`
	User      *User  `json:"user,omitempty"`
}

// List of anime or manga
type MediaListCollection struct {
	// Grouped media list entries
	Lists []*MediaListGroup `json:"lists,omitempty"`
	// The owner of the list
	User *User `json:"user,omitempty"`
	// If there is another chunk
	HasNextChunk *bool `json:"hasNextChunk,omitempty"`
	// A map of media list entry arrays grouped by status
	StatusLists [][]*MediaList `json:"statusLists,omitempty"`
	// A map of media list entry arrays grouped by custom lists
	CustomLists [][]*MediaList `json:"customLists,omitempty"`
}

// List group of anime or manga entries
type MediaListGroup struct {
	// Media list entries
	Entries              []*MediaList     `json:"entries,omitempty"`
	Name                 *string          `json:"name,omitempty"`
	IsCustomList         *bool            `json:"isCustomList,omitempty"`
	IsSplitCompletedList *bool            `json:"isSplitCompletedList,omitempty"`
	Status               *MediaListStatus `json:"status,omitempty"`
}

// A user's list options
type MediaListOptions struct {
	// The score format the user is using for media lists
	ScoreFormat *ScoreFormat `json:"scoreFormat,omitempty"`
	// The default order list rows should be displayed in
	RowOrder       *string `json:"rowOrder,omitempty"`
	UseLegacyLists *bool   `json:"useLegacyLists,omitempty"`
	// The user's anime list options
	AnimeList *MediaListTypeOptions `json:"animeList,omitempty"`
	// The user's manga list options
	MangaList *MediaListTypeOptions `json:"mangaList,omitempty"`
	// The list theme options for both lists
	SharedTheme *string `json:"sharedTheme,omitempty"`
	// If the shared theme should be used instead of the individual list themes
	SharedThemeEnabled *bool `json:"sharedThemeEnabled,omitempty"`
}

// A user's list options for anime or manga lists
type MediaListOptionsInput struct {
	// The order each list should be displayed in
	SectionOrder []*string `json:"sectionOrder,omitempty"`
	// If the completed sections of the list should be separated by format
	SplitCompletedSectionByFormat *bool `json:"splitCompletedSectionByFormat,omitempty"`
	// The names of the user's custom lists
	CustomLists []*string `json:"customLists,omitempty"`
	// The names of the user's advanced scoring sections
	AdvancedScoring []*string `json:"advancedScoring,omitempty"`
	// If advanced scoring is enabled
	AdvancedScoringEnabled *bool `json:"advancedScoringEnabled,omitempty"`
	// list theme
	Theme *string `json:"theme,omitempty"`
}

// A user's list options for anime or manga lists
type MediaListTypeOptions struct {
	// The order each list should be displayed in
	SectionOrder []*string `json:"sectionOrder,omitempty"`
	// If the completed sections of the list should be separated by format
	SplitCompletedSectionByFormat *bool `json:"splitCompletedSectionByFormat,omitempty"`
	// The list theme options
	Theme *string `json:"theme,omitempty"`
	// The names of the user's custom lists
	CustomLists []*string `json:"customLists,omitempty"`
	// The names of the user's advanced scoring sections
	AdvancedScoring []*string `json:"advancedScoring,omitempty"`
	// If advanced scoring is enabled
	AdvancedScoringEnabled *bool `json:"advancedScoringEnabled,omitempty"`
}

// Notification for when a media entry is merged into another for a user who had it on their list
type MediaMergeNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the media that was merged into
	MediaID int `json:"mediaId"`
	// The title of the deleted media
	DeletedMediaTitles []*string `json:"deletedMediaTitles,omitempty"`
	// The reason for the media data change
	Context *string `json:"context,omitempty"`
	// The reason for the media merge
	Reason *string `json:"reason,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The media that was merged into
	Media *Media `json:"media,omitempty"`
}

func (MediaMergeNotification) IsNotificationUnion() {}

// The ranking of a media in a particular time span and format compared to other media
type MediaRank struct {
	// The id of the rank
	ID int `json:"id"`
	// The numerical rank of the media
	Rank int `json:"rank"`
	// The type of ranking
	Type MediaRankType `json:"type"`
	// The format the media is ranked within
	Format MediaFormat `json:"format"`
	// The year the media is ranked within
	Year *int `json:"year,omitempty"`
	// The season the media is ranked within
	Season *MediaSeason `json:"season,omitempty"`
	// If the ranking is based on all time instead of a season/year
	AllTime *bool `json:"allTime,omitempty"`
	// String that gives context to the ranking type and time span
	Context string `json:"context"`
}

// A media's statistics
type MediaStats struct {
	ScoreDistribution  []*ScoreDistribution  `json:"scoreDistribution,omitempty"`
	StatusDistribution []*StatusDistribution `json:"statusDistribution,omitempty"`
	AiringProgression  []*AiringProgression  `json:"airingProgression,omitempty"`
}

// Data and links to legal streaming episodes on external sites
type MediaStreamingEpisode struct {
	// Title of the episode
	Title *string `json:"title,omitempty"`
	// Url of episode image thumbnail
	Thumbnail *string `json:"thumbnail,omitempty"`
	// The url of the episode
	URL *string `json:"url,omitempty"`
	// The site location of the streaming episodes
	Site *string `json:"site,omitempty"`
}

// Media submission
type MediaSubmission struct {
	// The id of the submission
	ID int `json:"id"`
	// User submitter of the submission
	Submitter *User `json:"submitter,omitempty"`
	// Data Mod assigned to handle the submission
	Assignee *User `json:"assignee,omitempty"`
	// Status of the submission
	Status         *SubmissionStatus `json:"status,omitempty"`
	SubmitterStats *string           `json:"submitterStats,omitempty"`
	Notes          *string           `json:"notes,omitempty"`
	Source         *string           `json:"source,omitempty"`
	Changes        []*string         `json:"changes,omitempty"`
	// Whether the submission is locked
	Locked        *bool                        `json:"locked,omitempty"`
	Media         *Media                       `json:"media,omitempty"`
	Submission    *Media                       `json:"submission,omitempty"`
	Characters    []*MediaSubmissionComparison `json:"characters,omitempty"`
	Staff         []*MediaSubmissionComparison `json:"staff,omitempty"`
	Studios       []*MediaSubmissionComparison `json:"studios,omitempty"`
	Relations     []*MediaEdge                 `json:"relations,omitempty"`
	ExternalLinks []*MediaSubmissionComparison `json:"externalLinks,omitempty"`
	CreatedAt     *int                         `json:"createdAt,omitempty"`
}

// Media submission with comparison to current data
type MediaSubmissionComparison struct {
	Submission   *MediaSubmissionEdge `json:"submission,omitempty"`
	Character    *MediaCharacter      `json:"character,omitempty"`
	Staff        *StaffEdge           `json:"staff,omitempty"`
	Studio       *StudioEdge          `json:"studio,omitempty"`
	ExternalLink *MediaExternalLink   `json:"externalLink,omitempty"`
}

type MediaSubmissionEdge struct {
	// The id of the direct submission
	ID                   *int               `json:"id,omitempty"`
	CharacterRole        *CharacterRole     `json:"characterRole,omitempty"`
	StaffRole            *string            `json:"staffRole,omitempty"`
	RoleNotes            *string            `json:"roleNotes,omitempty"`
	DubGroup             *string            `json:"dubGroup,omitempty"`
	CharacterName        *string            `json:"characterName,omitempty"`
	IsMain               *bool              `json:"isMain,omitempty"`
	Character            *Character         `json:"character,omitempty"`
	CharacterSubmission  *Character         `json:"characterSubmission,omitempty"`
	VoiceActor           *Staff             `json:"voiceActor,omitempty"`
	VoiceActorSubmission *Staff             `json:"voiceActorSubmission,omitempty"`
	Staff                *Staff             `json:"staff,omitempty"`
	StaffSubmission      *Staff             `json:"staffSubmission,omitempty"`
	Studio               *Studio            `json:"studio,omitempty"`
	ExternalLink         *MediaExternalLink `json:"externalLink,omitempty"`
	Media                *Media             `json:"media,omitempty"`
}

// A tag that describes a theme or element of the media
type MediaTag struct {
	// The id of the tag
	ID int `json:"id"`
	// The name of the tag
	Name string `json:"name"`
	// A general description of the tag
	Description *string `json:"description,omitempty"`
	// The categories of tags this tag belongs to
	Category *string `json:"category,omitempty"`
	// The relevance ranking of the tag out of the 100 for this media
	Rank *int `json:"rank,omitempty"`
	// If the tag could be a spoiler for any media
	IsGeneralSpoiler *bool `json:"isGeneralSpoiler,omitempty"`
	// If the tag is a spoiler for this media
	IsMediaSpoiler *bool `json:"isMediaSpoiler,omitempty"`
	// If the tag is only for adult 18+ media
	IsAdult *bool `json:"isAdult,omitempty"`
	// The user who submitted the tag
	UserID *int `json:"userId,omitempty"`
}

// The official titles of the media in various languages
type MediaTitle struct {
	// The romanization of the native language title
	Romaji *string `json:"romaji,omitempty"`
	// The official english title
	English *string `json:"english,omitempty"`
	// Official title in it's native language
	Native *string `json:"native,omitempty"`
	// The currently authenticated users preferred title language. Default romaji for non-authenticated
	UserPreferred *string `json:"userPreferred,omitempty"`
}

// The official titles of the media in various languages
type MediaTitleInput struct {
	// The romanization of the native language title
	Romaji *string `json:"romaji,omitempty"`
	// The official english title
	English *string `json:"english,omitempty"`
	// Official title in it's native language
	Native *string `json:"native,omitempty"`
}

// Media trailer or advertisement
type MediaTrailer struct {
	// The trailer video id
	ID *string `json:"id,omitempty"`
	// The site the video is hosted by (Currently either youtube or dailymotion)
	Site *string `json:"site,omitempty"`
	// The url for the thumbnail image of the video
	Thumbnail *string `json:"thumbnail,omitempty"`
}

// Daily media statistics
type MediaTrend struct {
	// The id of the tag
	MediaID int `json:"mediaId"`
	// The day the data was recorded (timestamp)
	Date int `json:"date"`
	// The amount of media activity on the day
	Trending int `json:"trending"`
	// A weighted average score of all the user's scores of the media
	AverageScore *int `json:"averageScore,omitempty"`
	// The number of users with the media on their list
	Popularity *int `json:"popularity,omitempty"`
	// The number of users with watching/reading the media
	InProgress *int `json:"inProgress,omitempty"`
	// If the media was being released at this time
	Releasing bool `json:"releasing"`
	// The episode number of the anime released on this day
	Episode *int `json:"episode,omitempty"`
	// The related media
	Media *Media `json:"media,omitempty"`
}

type MediaTrendConnection struct {
	Edges []*MediaTrendEdge `json:"edges,omitempty"`
	Nodes []*MediaTrend     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

// Media trend connection edge
type MediaTrendEdge struct {
	Node *MediaTrend `json:"node,omitempty"`
}

// User message activity
type MessageActivity struct {
	// The id of the activity
	ID int `json:"id"`
	// The user id of the activity's recipient
	RecipientID *int `json:"recipientId,omitempty"`
	// The user id of the activity's sender
	MessengerID *int `json:"messengerId,omitempty"`
	// The type of the activity
	Type *ActivityType `json:"type,omitempty"`
	// The number of activity replies
	ReplyCount int `json:"replyCount"`
	// The message text (Markdown)
	Message *string `json:"message,omitempty"`
	// If the activity is locked and can receive replies
	IsLocked *bool `json:"isLocked,omitempty"`
	// If the currently authenticated user is subscribed to the activity
	IsSubscribed *bool `json:"isSubscribed,omitempty"`
	// The amount of likes the activity has
	LikeCount int `json:"likeCount"`
	// If the currently authenticated user liked the activity
	IsLiked *bool `json:"isLiked,omitempty"`
	// If the message is private and only viewable to the sender and recipients
	IsPrivate *bool `json:"isPrivate,omitempty"`
	// The url for the activity page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// The time the activity was created at
	CreatedAt int `json:"createdAt"`
	// The user who the activity message was sent to
	Recipient *User `json:"recipient,omitempty"`
	// The user who sent the activity message
	Messenger *User `json:"messenger,omitempty"`
	// The written replies to the activity
	Replies []*ActivityReply `json:"replies,omitempty"`
	// The users who liked the activity
	Likes []*User `json:"likes,omitempty"`
}

func (MessageActivity) IsActivityUnion() {}

func (MessageActivity) IsLikeableUnion() {}

type ModAction struct {
	// The id of the action
	ID         int            `json:"id"`
	User       *User          `json:"user,omitempty"`
	Mod        *User          `json:"mod,omitempty"`
	Type       *ModActionType `json:"type,omitempty"`
	ObjectID   *int           `json:"objectId,omitempty"`
	ObjectType *string        `json:"objectType,omitempty"`
	Data       *string        `json:"data,omitempty"`
	CreatedAt  int            `json:"createdAt"`
}

type Mutation struct {
}

// Notification option
type NotificationOption struct {
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// Whether this type of notification is enabled
	Enabled *bool `json:"enabled,omitempty"`
}

// Notification option input
type NotificationOptionInput struct {
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// Whether this type of notification is enabled
	Enabled *bool `json:"enabled,omitempty"`
}

// Page of data
type Page struct {
	// The pagination information
	PageInfo        *PageInfo           `json:"pageInfo,omitempty"`
	Users           []*User             `json:"users,omitempty"`
	Media           []*Media            `json:"media,omitempty"`
	Characters      []*Character        `json:"characters,omitempty"`
	Staff           []*Staff            `json:"staff,omitempty"`
	Studios         []*Studio           `json:"studios,omitempty"`
	MediaList       []*MediaList        `json:"mediaList,omitempty"`
	AiringSchedules []*AiringSchedule   `json:"airingSchedules,omitempty"`
	MediaTrends     []*MediaTrend       `json:"mediaTrends,omitempty"`
	Notifications   []NotificationUnion `json:"notifications,omitempty"`
	Followers       []*User             `json:"followers,omitempty"`
	Following       []*User             `json:"following,omitempty"`
	Activities      []ActivityUnion     `json:"activities,omitempty"`
	ActivityReplies []*ActivityReply    `json:"activityReplies,omitempty"`
	Threads         []*Thread           `json:"threads,omitempty"`
	ThreadComments  []*ThreadComment    `json:"threadComments,omitempty"`
	Reviews         []*Review           `json:"reviews,omitempty"`
	Recommendations []*Recommendation   `json:"recommendations,omitempty"`
	Likes           []*User             `json:"likes,omitempty"`
}

type PageInfo struct {
	// The total number of items. Note: This value is not guaranteed to be accurate, do not rely on this for logic
	Total *int `json:"total,omitempty"`
	// The count on a page
	PerPage *int `json:"perPage,omitempty"`
	// The current page
	CurrentPage *int `json:"currentPage,omitempty"`
	// The last page
	LastPage *int `json:"lastPage,omitempty"`
	// If there is another page
	HasNextPage *bool `json:"hasNextPage,omitempty"`
}

// Provides the parsed markdown as html
type ParsedMarkdown struct {
	// The parsed markdown as html
	HTML *string `json:"html,omitempty"`
}

type Query struct {
}

// Media recommendation
type Recommendation struct {
	// The id of the recommendation
	ID int `json:"id"`
	// Users rating of the recommendation
	Rating *int `json:"rating,omitempty"`
	// The rating of the recommendation by currently authenticated user
	UserRating *RecommendationRating `json:"userRating,omitempty"`
	// The media the recommendation is from
	Media *Media `json:"media,omitempty"`
	// The recommended media
	MediaRecommendation *Media `json:"mediaRecommendation,omitempty"`
	// The user that first created the recommendation
	User *User `json:"user,omitempty"`
}

type RecommendationConnection struct {
	Edges []*RecommendationEdge `json:"edges,omitempty"`
	Nodes []*Recommendation     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

// Recommendation connection edge
type RecommendationEdge struct {
	Node *Recommendation `json:"node,omitempty"`
}

// Notification for when new media is added to the site
type RelatedMediaAdditionNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the new media
	MediaID int `json:"mediaId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The associated media of the airing schedule
	Media *Media `json:"media,omitempty"`
}

func (RelatedMediaAdditionNotification) IsNotificationUnion() {}

type Report struct {
	ID       int     `json:"id"`
	Reporter *User   `json:"reporter,omitempty"`
	Reported *User   `json:"reported,omitempty"`
	Reason   *string `json:"reason,omitempty"`
	// When the entry data was created
	CreatedAt *int  `json:"createdAt,omitempty"`
	Cleared   *bool `json:"cleared,omitempty"`
}

// A Review that features in an anime or manga
type Review struct {
	// The id of the review
	ID int `json:"id"`
	// The id of the review's creator
	UserID int `json:"userId"`
	// The id of the review's media
	MediaID int `json:"mediaId"`
	// For which type of media the review is for
	MediaType *MediaType `json:"mediaType,omitempty"`
	// A short summary of the review
	Summary *string `json:"summary,omitempty"`
	// The main review body text
	Body *string `json:"body,omitempty"`
	// The total user rating of the review
	Rating *int `json:"rating,omitempty"`
	// The amount of user ratings of the review
	RatingAmount *int `json:"ratingAmount,omitempty"`
	// The rating of the review by currently authenticated user
	UserRating *ReviewRating `json:"userRating,omitempty"`
	// The review score of the media
	Score *int `json:"score,omitempty"`
	// If the review is not yet publicly published and is only viewable by creator
	Private *bool `json:"private,omitempty"`
	// The url for the review page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// The time of the thread creation
	CreatedAt int `json:"createdAt"`
	// The time of the thread last update
	UpdatedAt int `json:"updatedAt"`
	// The creator of the review
	User *User `json:"user,omitempty"`
	// The media the review is of
	Media *Media `json:"media,omitempty"`
}

type ReviewConnection struct {
	Edges []*ReviewEdge `json:"edges,omitempty"`
	Nodes []*Review     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

// Review connection edge
type ReviewEdge struct {
	Node *Review `json:"node,omitempty"`
}

// Feed of mod edit activity
type RevisionHistory struct {
	// The id of the media
	ID int `json:"id"`
	// The action taken on the objects
	Action *RevisionHistoryAction `json:"action,omitempty"`
	// A JSON object of the fields that changed
	Changes *string `json:"changes,omitempty"`
	// The user who made the edit to the object
	User *User `json:"user,omitempty"`
	// The media the mod feed entry references
	Media *Media `json:"media,omitempty"`
	// The character the mod feed entry references
	Character *Character `json:"character,omitempty"`
	// The staff member the mod feed entry references
	Staff *Staff `json:"staff,omitempty"`
	// The studio the mod feed entry references
	Studio *Studio `json:"studio,omitempty"`
	// The external link source the mod feed entry references
	ExternalLink *MediaExternalLink `json:"externalLink,omitempty"`
	// When the mod feed entry was created
	CreatedAt *int `json:"createdAt,omitempty"`
}

// A user's list score distribution.
type ScoreDistribution struct {
	Score *int `json:"score,omitempty"`
	// The amount of list entries with this score
	Amount *int `json:"amount,omitempty"`
}

type SiteStatistics struct {
	Users      *SiteTrendConnection `json:"users,omitempty"`
	Anime      *SiteTrendConnection `json:"anime,omitempty"`
	Manga      *SiteTrendConnection `json:"manga,omitempty"`
	Characters *SiteTrendConnection `json:"characters,omitempty"`
	Staff      *SiteTrendConnection `json:"staff,omitempty"`
	Studios    *SiteTrendConnection `json:"studios,omitempty"`
	Reviews    *SiteTrendConnection `json:"reviews,omitempty"`
}

// Daily site statistics
type SiteTrend struct {
	// The day the data was recorded (timestamp)
	Date  int `json:"date"`
	Count int `json:"count"`
	// The change from yesterday
	Change int `json:"change"`
}

type SiteTrendConnection struct {
	Edges []*SiteTrendEdge `json:"edges,omitempty"`
	Nodes []*SiteTrend     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

// Site trend connection edge
type SiteTrendEdge struct {
	Node *SiteTrend `json:"node,omitempty"`
}

// Voice actors or production staff
type Staff struct {
	// The id of the staff member
	ID int `json:"id"`
	// The names of the staff member
	Name *StaffName `json:"name,omitempty"`
	// The primary language the staff member dub's in
	Language *StaffLanguage `json:"language,omitempty"`
	// The primary language of the staff member. Current values: Japanese, English, Korean, Italian, Spanish, Portuguese, French, German, Hebrew, Hungarian, Chinese, Arabic, Filipino, Catalan, Finnish, Turkish, Dutch, Swedish, Thai, Tagalog, Malaysian, Indonesian, Vietnamese, Nepali, Hindi, Urdu
	LanguageV2 *string `json:"languageV2,omitempty"`
	// The staff images
	Image *StaffImage `json:"image,omitempty"`
	// A general description of the staff member
	Description *string `json:"description,omitempty"`
	// The person's primary occupations
	PrimaryOccupations []*string `json:"primaryOccupations,omitempty"`
	// The staff's gender. Usually Male, Female, or Non-binary but can be any string.
	Gender      *string    `json:"gender,omitempty"`
	DateOfBirth *FuzzyDate `json:"dateOfBirth,omitempty"`
	DateOfDeath *FuzzyDate `json:"dateOfDeath,omitempty"`
	// The person's age in years
	Age *int `json:"age,omitempty"`
	// [startYear, endYear] (If the 2nd value is not present staff is still active)
	YearsActive []*int `json:"yearsActive,omitempty"`
	// The persons birthplace or hometown
	HomeTown *string `json:"homeTown,omitempty"`
	// The persons blood type
	BloodType *string `json:"bloodType,omitempty"`
	// If the staff member is marked as favourite by the currently authenticated user
	IsFavourite bool `json:"isFavourite"`
	// If the staff member is blocked from being added to favourites
	IsFavouriteBlocked bool `json:"isFavouriteBlocked"`
	// The url for the staff page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// Media where the staff member has a production role
	StaffMedia *MediaConnection `json:"staffMedia,omitempty"`
	// Characters voiced by the actor
	Characters *CharacterConnection `json:"characters,omitempty"`
	// Media the actor voiced characters in. (Same data as characters with media as node instead of characters)
	CharacterMedia *MediaConnection `json:"characterMedia,omitempty"`
	UpdatedAt      *int             `json:"updatedAt,omitempty"`
	// Staff member that the submission is referencing
	Staff *Staff `json:"staff,omitempty"`
	// Submitter for the submission
	Submitter *User `json:"submitter,omitempty"`
	// Status of the submission
	SubmissionStatus *int `json:"submissionStatus,omitempty"`
	// Inner details of submission status
	SubmissionNotes *string `json:"submissionNotes,omitempty"`
	// The amount of user's who have favourited the staff member
	Favourites *int `json:"favourites,omitempty"`
	// Notes for site moderators
	ModNotes *string `json:"modNotes,omitempty"`
}

type StaffConnection struct {
	Edges []*StaffEdge `json:"edges,omitempty"`
	Nodes []*Staff     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

// Staff connection edge
type StaffEdge struct {
	Node *Staff `json:"node,omitempty"`
	// The id of the connection
	ID *int `json:"id,omitempty"`
	// The role of the staff member in the production of the media
	Role *string `json:"role,omitempty"`
	// The order the staff should be displayed from the users favourites
	FavouriteOrder *int `json:"favouriteOrder,omitempty"`
}

type StaffImage struct {
	// The person's image of media at its largest size
	Large *string `json:"large,omitempty"`
	// The person's image of media at medium size
	Medium *string `json:"medium,omitempty"`
}

// The names of the staff member
type StaffName struct {
	// The person's given name
	First *string `json:"first,omitempty"`
	// The person's middle name
	Middle *string `json:"middle,omitempty"`
	// The person's surname
	Last *string `json:"last,omitempty"`
	// The person's first and last name
	Full *string `json:"full,omitempty"`
	// The person's full name in their native language
	Native *string `json:"native,omitempty"`
	// Other names the staff member might be referred to as (pen names)
	Alternative []*string `json:"alternative,omitempty"`
	// The currently authenticated users preferred name language. Default romaji for non-authenticated
	UserPreferred *string `json:"userPreferred,omitempty"`
}

// The names of the staff member
type StaffNameInput struct {
	// The person's given name
	First *string `json:"first,omitempty"`
	// The person's middle name
	Middle *string `json:"middle,omitempty"`
	// The person's surname
	Last *string `json:"last,omitempty"`
	// The person's full name in their native language
	Native *string `json:"native,omitempty"`
	// Other names the character might be referred by
	Alternative []*string `json:"alternative,omitempty"`
}

// Voice actor role for a character
type StaffRoleType struct {
	// The voice actors of the character
	VoiceActor *Staff `json:"voiceActor,omitempty"`
	// Notes regarding the VA's role for the character
	RoleNotes *string `json:"roleNotes,omitempty"`
	// Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant.
	DubGroup *string `json:"dubGroup,omitempty"`
}

// User's staff statistics
type StaffStats struct {
	Staff     *Staff `json:"staff,omitempty"`
	Amount    *int   `json:"amount,omitempty"`
	MeanScore *int   `json:"meanScore,omitempty"`
	// The amount of time in minutes the staff member has been watched by the user
	TimeWatched *int `json:"timeWatched,omitempty"`
}

// A submission for a staff that features in an anime or manga
type StaffSubmission struct {
	// The id of the submission
	ID int `json:"id"`
	// Staff that the submission is referencing
	Staff *Staff `json:"staff,omitempty"`
	// The staff submission changes
	Submission *Staff `json:"submission,omitempty"`
	// Submitter for the submission
	Submitter *User `json:"submitter,omitempty"`
	// Data Mod assigned to handle the submission
	Assignee *User `json:"assignee,omitempty"`
	// Status of the submission
	Status *SubmissionStatus `json:"status,omitempty"`
	// Inner details of submission status
	Notes  *string `json:"notes,omitempty"`
	Source *string `json:"source,omitempty"`
	// Whether the submission is locked
	Locked    *bool `json:"locked,omitempty"`
	CreatedAt *int  `json:"createdAt,omitempty"`
}

// The distribution of the watching/reading status of media or a user's list
type StatusDistribution struct {
	// The day the activity took place (Unix timestamp)
	Status *MediaListStatus `json:"status,omitempty"`
	// The amount of entries with this status
	Amount *int `json:"amount,omitempty"`
}

// Animation or production company
type Studio struct {
	// The id of the studio
	ID int `json:"id"`
	// The name of the studio
	Name string `json:"name"`
	// If the studio is an animation studio or a different kind of company
	IsAnimationStudio bool `json:"isAnimationStudio"`
	// The media the studio has worked on
	Media *MediaConnection `json:"media,omitempty"`
	// The url for the studio page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// If the studio is marked as favourite by the currently authenticated user
	IsFavourite bool `json:"isFavourite"`
	// The amount of user's who have favourited the studio
	Favourites *int `json:"favourites,omitempty"`
}

type StudioConnection struct {
	Edges []*StudioEdge `json:"edges,omitempty"`
	Nodes []*Studio     `json:"nodes,omitempty"`
	// The pagination information
	PageInfo *PageInfo `json:"pageInfo,omitempty"`
}

// Studio connection edge
type StudioEdge struct {
	Node *Studio `json:"node,omitempty"`
	// The id of the connection
	ID *int `json:"id,omitempty"`
	// If the studio is the main animation studio of the anime
	IsMain bool `json:"isMain"`
	// The order the character should be displayed from the users favourites
	FavouriteOrder *int `json:"favouriteOrder,omitempty"`
}

// User's studio statistics
type StudioStats struct {
	Studio    *Studio `json:"studio,omitempty"`
	Amount    *int    `json:"amount,omitempty"`
	MeanScore *int    `json:"meanScore,omitempty"`
	// The amount of time in minutes the studio's works have been watched by the user
	TimeWatched *int `json:"timeWatched,omitempty"`
}

// User's tag statistics
type TagStats struct {
	Tag       *MediaTag `json:"tag,omitempty"`
	Amount    *int      `json:"amount,omitempty"`
	MeanScore *int      `json:"meanScore,omitempty"`
	// The amount of time in minutes the tag has been watched by the user
	TimeWatched *int `json:"timeWatched,omitempty"`
}

// User text activity
type TextActivity struct {
	// The id of the activity
	ID int `json:"id"`
	// The user id of the activity's creator
	UserID *int `json:"userId,omitempty"`
	// The type of activity
	Type *ActivityType `json:"type,omitempty"`
	// The number of activity replies
	ReplyCount int `json:"replyCount"`
	// The status text (Markdown)
	Text *string `json:"text,omitempty"`
	// The url for the activity page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// If the activity is locked and can receive replies
	IsLocked *bool `json:"isLocked,omitempty"`
	// If the currently authenticated user is subscribed to the activity
	IsSubscribed *bool `json:"isSubscribed,omitempty"`
	// The amount of likes the activity has
	LikeCount int `json:"likeCount"`
	// If the currently authenticated user liked the activity
	IsLiked *bool `json:"isLiked,omitempty"`
	// If the activity is pinned to the top of the users activity feed
	IsPinned *bool `json:"isPinned,omitempty"`
	// The time the activity was created at
	CreatedAt int `json:"createdAt"`
	// The user who created the activity
	User *User `json:"user,omitempty"`
	// The written replies to the activity
	Replies []*ActivityReply `json:"replies,omitempty"`
	// The users who liked the activity
	Likes []*User `json:"likes,omitempty"`
}

func (TextActivity) IsActivityUnion() {}

func (TextActivity) IsLikeableUnion() {}

// Forum Thread
type Thread struct {
	// The id of the thread
	ID int `json:"id"`
	// The title of the thread
	Title *string `json:"title,omitempty"`
	// The text body of the thread (Markdown)
	Body *string `json:"body,omitempty"`
	// The id of the thread owner user
	UserID int `json:"userId"`
	// The id of the user who most recently commented on the thread
	ReplyUserID *int `json:"replyUserId,omitempty"`
	// The id of the most recent comment on the thread
	ReplyCommentID *int `json:"replyCommentId,omitempty"`
	// The number of comments on the thread
	ReplyCount *int `json:"replyCount,omitempty"`
	// The number of times users have viewed the thread
	ViewCount *int `json:"viewCount,omitempty"`
	// If the thread is locked and can receive comments
	IsLocked *bool `json:"isLocked,omitempty"`
	// If the thread is stickied and should be displayed at the top of the page
	IsSticky *bool `json:"isSticky,omitempty"`
	// If the currently authenticated user is subscribed to the thread
	IsSubscribed *bool `json:"isSubscribed,omitempty"`
	// The amount of likes the thread has
	LikeCount int `json:"likeCount"`
	// If the currently authenticated user liked the thread
	IsLiked *bool `json:"isLiked,omitempty"`
	// The time of the last reply
	RepliedAt *int `json:"repliedAt,omitempty"`
	// The time of the thread creation
	CreatedAt int `json:"createdAt"`
	// The time of the thread last update
	UpdatedAt int `json:"updatedAt"`
	// The owner of the thread
	User *User `json:"user,omitempty"`
	// The user to last reply to the thread
	ReplyUser *User `json:"replyUser,omitempty"`
	// The users who liked the thread
	Likes []*User `json:"likes,omitempty"`
	// The url for the thread page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// The categories of the thread
	Categories []*ThreadCategory `json:"categories,omitempty"`
	// The media categories of the thread
	MediaCategories []*Media `json:"mediaCategories,omitempty"`
}

func (Thread) IsLikeableUnion() {}

// A forum thread category
type ThreadCategory struct {
	// The id of the category
	ID int `json:"id"`
	// The name of the category
	Name string `json:"name"`
}

// Forum Thread Comment
type ThreadComment struct {
	// The id of the comment
	ID int `json:"id"`
	// The user id of the comment's owner
	UserID *int `json:"userId,omitempty"`
	// The id of thread the comment belongs to
	ThreadID *int `json:"threadId,omitempty"`
	// The text content of the comment (Markdown)
	Comment *string `json:"comment,omitempty"`
	// The amount of likes the comment has
	LikeCount int `json:"likeCount"`
	// If the currently authenticated user liked the comment
	IsLiked *bool `json:"isLiked,omitempty"`
	// The url for the comment page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// The time of the comments creation
	CreatedAt int `json:"createdAt"`
	// The time of the comments last update
	UpdatedAt int `json:"updatedAt"`
	// The thread the comment belongs to
	Thread *Thread `json:"thread,omitempty"`
	// The user who created the comment
	User *User `json:"user,omitempty"`
	// The users who liked the comment
	Likes []*User `json:"likes,omitempty"`
	// The comment's child reply comments
	ChildComments *string `json:"childComments,omitempty"`
	// If the comment tree is locked and may not receive replies or edits
	IsLocked *bool `json:"isLocked,omitempty"`
}

func (ThreadComment) IsLikeableUnion() {}

// Notification for when a thread comment is liked
type ThreadCommentLikeNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who liked to the activity
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the activity which was liked
	CommentID int `json:"commentId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The thread that the relevant comment belongs to
	Thread *Thread `json:"thread,omitempty"`
	// The thread comment that was liked
	Comment *ThreadComment `json:"comment,omitempty"`
	// The user who liked the activity
	User *User `json:"user,omitempty"`
}

func (ThreadCommentLikeNotification) IsNotificationUnion() {}

// Notification for when authenticated user is @ mentioned in a forum thread comment
type ThreadCommentMentionNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who mentioned the authenticated user
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the comment where mentioned
	CommentID int `json:"commentId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The thread that the relevant comment belongs to
	Thread *Thread `json:"thread,omitempty"`
	// The thread comment that included the @ mention
	Comment *ThreadComment `json:"comment,omitempty"`
	// The user who mentioned the authenticated user
	User *User `json:"user,omitempty"`
}

func (ThreadCommentMentionNotification) IsNotificationUnion() {}

// Notification for when a user replies to your forum thread comment
type ThreadCommentReplyNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who create the comment reply
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the reply comment
	CommentID int `json:"commentId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The thread that the relevant comment belongs to
	Thread *Thread `json:"thread,omitempty"`
	// The reply thread comment
	Comment *ThreadComment `json:"comment,omitempty"`
	// The user who replied to the activity
	User *User `json:"user,omitempty"`
}

func (ThreadCommentReplyNotification) IsNotificationUnion() {}

// Notification for when a user replies to a subscribed forum thread
type ThreadCommentSubscribedNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who commented on the thread
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the new comment in the subscribed thread
	CommentID int `json:"commentId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The thread that the relevant comment belongs to
	Thread *Thread `json:"thread,omitempty"`
	// The reply thread comment
	Comment *ThreadComment `json:"comment,omitempty"`
	// The user who replied to the subscribed thread
	User *User `json:"user,omitempty"`
}

func (ThreadCommentSubscribedNotification) IsNotificationUnion() {}

// Notification for when a thread is liked
type ThreadLikeNotification struct {
	// The id of the Notification
	ID int `json:"id"`
	// The id of the user who liked to the activity
	UserID int `json:"userId"`
	// The type of notification
	Type *NotificationType `json:"type,omitempty"`
	// The id of the thread which was liked
	ThreadID int `json:"threadId"`
	// The notification context text
	Context *string `json:"context,omitempty"`
	// The time the notification was created at
	CreatedAt *int `json:"createdAt,omitempty"`
	// The thread that the relevant comment belongs to
	Thread *Thread `json:"thread,omitempty"`
	// The liked thread comment
	Comment *ThreadComment `json:"comment,omitempty"`
	// The user who liked the activity
	User *User `json:"user,omitempty"`
}

func (ThreadLikeNotification) IsNotificationUnion() {}

// A user
type User struct {
	// The id of the user
	ID int `json:"id"`
	// The name of the user
	Name string `json:"name"`
	// The bio written by user (Markdown)
	About *string `json:"about,omitempty"`
	// The user's avatar images
	Avatar *UserAvatar `json:"avatar,omitempty"`
	// The user's banner images
	BannerImage *string `json:"bannerImage,omitempty"`
	// If the authenticated user if following this user
	IsFollowing *bool `json:"isFollowing,omitempty"`
	// If this user if following the authenticated user
	IsFollower *bool `json:"isFollower,omitempty"`
	// If the user is blocked by the authenticated user
	IsBlocked *bool   `json:"isBlocked,omitempty"`
	Bans      *string `json:"bans,omitempty"`
	// The user's general options
	Options *UserOptions `json:"options,omitempty"`
	// The user's media list options
	MediaListOptions *MediaListOptions `json:"mediaListOptions,omitempty"`
	// The users favourites
	Favourites *Favourites `json:"favourites,omitempty"`
	// The users anime & manga list statistics
	Statistics *UserStatisticTypes `json:"statistics,omitempty"`
	// The number of unread notifications the user has
	UnreadNotificationCount *int `json:"unreadNotificationCount,omitempty"`
	// The url for the user page on the AniList website
	SiteURL *string `json:"siteUrl,omitempty"`
	// The donation tier of the user
	DonatorTier *int `json:"donatorTier,omitempty"`
	// Custom donation badge text
	DonatorBadge *string `json:"donatorBadge,omitempty"`
	// The user's moderator roles if they are a site moderator
	ModeratorRoles []*ModRole `json:"moderatorRoles,omitempty"`
	// When the user's account was created. (Does not exist for accounts created before 2020)
	CreatedAt *int `json:"createdAt,omitempty"`
	// When the user's data was last updated
	UpdatedAt *int `json:"updatedAt,omitempty"`
	// The user's statistics
	Stats *UserStats `json:"stats,omitempty"`
	// If the user is a moderator or data moderator
	ModeratorStatus *string `json:"moderatorStatus,omitempty"`
	// The user's previously used names.
	PreviousNames []*UserPreviousName `json:"previousNames,omitempty"`
}

// A user's activity history stats.
type UserActivityHistory struct {
	// The day the activity took place (Unix timestamp)
	Date *int `json:"date,omitempty"`
	// The amount of activity on the day
	Amount *int `json:"amount,omitempty"`
	// The level of activity represented on a 1-10 scale
	Level *int `json:"level,omitempty"`
}

// A user's avatars
type UserAvatar struct {
	// The avatar of user at its largest size
	Large *string `json:"large,omitempty"`
	// The avatar of user at medium size
	Medium *string `json:"medium,omitempty"`
}

type UserCountryStatistic struct {
	Count          int     `json:"count"`
	MeanScore      float64 `json:"meanScore"`
	MinutesWatched int     `json:"minutesWatched"`
	ChaptersRead   int     `json:"chaptersRead"`
	MediaIds       []*int  `json:"mediaIds"`
	Country        *string `json:"country,omitempty"`
}

type UserFormatStatistic struct {
	Count          int          `json:"count"`
	MeanScore      float64      `json:"meanScore"`
	MinutesWatched int          `json:"minutesWatched"`
	ChaptersRead   int          `json:"chaptersRead"`
	MediaIds       []*int       `json:"mediaIds"`
	Format         *MediaFormat `json:"format,omitempty"`
}

type UserGenreStatistic struct {
	Count          int     `json:"count"`
	MeanScore      float64 `json:"meanScore"`
	MinutesWatched int     `json:"minutesWatched"`
	ChaptersRead   int     `json:"chaptersRead"`
	MediaIds       []*int  `json:"mediaIds"`
	Genre          *string `json:"genre,omitempty"`
}

type UserLengthStatistic struct {
	Count          int     `json:"count"`
	MeanScore      float64 `json:"meanScore"`
	MinutesWatched int     `json:"minutesWatched"`
	ChaptersRead   int     `json:"chaptersRead"`
	MediaIds       []*int  `json:"mediaIds"`
	Length         *string `json:"length,omitempty"`
}

// User data for moderators
type UserModData struct {
	Alts    []*User `json:"alts,omitempty"`
	Bans    *string `json:"bans,omitempty"`
	IP      *string `json:"ip,omitempty"`
	Counts  *string `json:"counts,omitempty"`
	Privacy *int    `json:"privacy,omitempty"`
	Email   *string `json:"email,omitempty"`
}

// A user's general options
type UserOptions struct {
	// The language the user wants to see media titles in
	TitleLanguage *UserTitleLanguage `json:"titleLanguage,omitempty"`
	// Whether the user has enabled viewing of 18+ content
	DisplayAdultContent *bool `json:"displayAdultContent,omitempty"`
	// Whether the user receives notifications when a show they are watching aires
	AiringNotifications *bool `json:"airingNotifications,omitempty"`
	// Profile highlight color (blue, purple, pink, orange, red, green, gray)
	ProfileColor *string `json:"profileColor,omitempty"`
	// Notification options
	NotificationOptions []*NotificationOption `json:"notificationOptions,omitempty"`
	// The user's timezone offset (Auth user only)
	Timezone *string `json:"timezone,omitempty"`
	// Minutes between activity for them to be merged together. 0 is Never, Above 2 weeks (20160 mins) is Always.
	ActivityMergeTime *int `json:"activityMergeTime,omitempty"`
	// The language the user wants to see staff and character names in
	StaffNameLanguage *UserStaffNameLanguage `json:"staffNameLanguage,omitempty"`
	// Whether the user only allow messages from users they follow
	RestrictMessagesToFollowing *bool `json:"restrictMessagesToFollowing,omitempty"`
	// The list activity types the user has disabled from being created from list updates
	DisabledListActivity []*ListActivityOption `json:"disabledListActivity,omitempty"`
}

// A user's previous name
type UserPreviousName struct {
	// A previous name of the user.
	Name *string `json:"name,omitempty"`
	// When the user first changed from this name.
	CreatedAt *int `json:"createdAt,omitempty"`
	// When the user most recently changed from this name.
	UpdatedAt *int `json:"updatedAt,omitempty"`
}

type UserReleaseYearStatistic struct {
	Count          int     `json:"count"`
	MeanScore      float64 `json:"meanScore"`
	MinutesWatched int     `json:"minutesWatched"`
	ChaptersRead   int     `json:"chaptersRead"`
	MediaIds       []*int  `json:"mediaIds"`
	ReleaseYear    *int    `json:"releaseYear,omitempty"`
}

type UserScoreStatistic struct {
	Count          int     `json:"count"`
	MeanScore      float64 `json:"meanScore"`
	MinutesWatched int     `json:"minutesWatched"`
	ChaptersRead   int     `json:"chaptersRead"`
	MediaIds       []*int  `json:"mediaIds"`
	Score          *int    `json:"score,omitempty"`
}

type UserStaffStatistic struct {
	Count          int     `json:"count"`
	MeanScore      float64 `json:"meanScore"`
	MinutesWatched int     `json:"minutesWatched"`
	ChaptersRead   int     `json:"chaptersRead"`
	MediaIds       []*int  `json:"mediaIds"`
	Staff          *Staff  `json:"staff,omitempty"`
}

type UserStartYearStatistic struct {
	Count          int     `json:"count"`
	MeanScore      float64 `json:"meanScore"`
	MinutesWatched int     `json:"minutesWatched"`
	ChaptersRead   int     `json:"chaptersRead"`
	MediaIds       []*int  `json:"mediaIds"`
	StartYear      *int    `json:"startYear,omitempty"`
}

type UserStatisticTypes struct {
	Anime *UserStatistics `json:"anime,omitempty"`
	Manga *UserStatistics `json:"manga,omitempty"`
}

type UserStatistics struct {
	Count             int                         `json:"count"`
	MeanScore         float64                     `json:"meanScore"`
	StandardDeviation float64                     `json:"standardDeviation"`
	MinutesWatched    int                         `json:"minutesWatched"`
	EpisodesWatched   int                         `json:"episodesWatched"`
	ChaptersRead      int                         `json:"chaptersRead"`
	VolumesRead       int                         `json:"volumesRead"`
	Formats           []*UserFormatStatistic      `json:"formats,omitempty"`
	Statuses          []*UserStatusStatistic      `json:"statuses,omitempty"`
	Scores            []*UserScoreStatistic       `json:"scores,omitempty"`
	Lengths           []*UserLengthStatistic      `json:"lengths,omitempty"`
	ReleaseYears      []*UserReleaseYearStatistic `json:"releaseYears,omitempty"`
	StartYears        []*UserStartYearStatistic   `json:"startYears,omitempty"`
	Genres            []*UserGenreStatistic       `json:"genres,omitempty"`
	Tags              []*UserTagStatistic         `json:"tags,omitempty"`
	Countries         []*UserCountryStatistic     `json:"countries,omitempty"`
	VoiceActors       []*UserVoiceActorStatistic  `json:"voiceActors,omitempty"`
	Staff             []*UserStaffStatistic       `json:"staff,omitempty"`
	Studios           []*UserStudioStatistic      `json:"studios,omitempty"`
}

// A user's statistics
type UserStats struct {
	// The amount of anime the user has watched in minutes
	WatchedTime *int `json:"watchedTime,omitempty"`
	// The amount of manga chapters the user has read
	ChaptersRead            *int                   `json:"chaptersRead,omitempty"`
	ActivityHistory         []*UserActivityHistory `json:"activityHistory,omitempty"`
	AnimeStatusDistribution []*StatusDistribution  `json:"animeStatusDistribution,omitempty"`
	MangaStatusDistribution []*StatusDistribution  `json:"mangaStatusDistribution,omitempty"`
	AnimeScoreDistribution  []*ScoreDistribution   `json:"animeScoreDistribution,omitempty"`
	MangaScoreDistribution  []*ScoreDistribution   `json:"mangaScoreDistribution,omitempty"`
	AnimeListScores         *ListScoreStats        `json:"animeListScores,omitempty"`
	MangaListScores         *ListScoreStats        `json:"mangaListScores,omitempty"`
	FavouredGenresOverview  []*GenreStats          `json:"favouredGenresOverview,omitempty"`
	FavouredGenres          []*GenreStats          `json:"favouredGenres,omitempty"`
	FavouredTags            []*TagStats            `json:"favouredTags,omitempty"`
	FavouredActors          []*StaffStats          `json:"favouredActors,omitempty"`
	FavouredStaff           []*StaffStats          `json:"favouredStaff,omitempty"`
	FavouredStudios         []*StudioStats         `json:"favouredStudios,omitempty"`
	FavouredYears           []*YearStats           `json:"favouredYears,omitempty"`
	FavouredFormats         []*FormatStats         `json:"favouredFormats,omitempty"`
}

type UserStatusStatistic struct {
	Count          int              `json:"count"`
	MeanScore      float64          `json:"meanScore"`
	MinutesWatched int              `json:"minutesWatched"`
	ChaptersRead   int              `json:"chaptersRead"`
	MediaIds       []*int           `json:"mediaIds"`
	Status         *MediaListStatus `json:"status,omitempty"`
}

type UserStudioStatistic struct {
	Count          int     `json:"count"`
	MeanScore      float64 `json:"meanScore"`
	MinutesWatched int     `json:"minutesWatched"`
	ChaptersRead   int     `json:"chaptersRead"`
	MediaIds       []*int  `json:"mediaIds"`
	Studio         *Studio `json:"studio,omitempty"`
}

type UserTagStatistic struct {
	Count          int       `json:"count"`
	MeanScore      float64   `json:"meanScore"`
	MinutesWatched int       `json:"minutesWatched"`
	ChaptersRead   int       `json:"chaptersRead"`
	MediaIds       []*int    `json:"mediaIds"`
	Tag            *MediaTag `json:"tag,omitempty"`
}

type UserVoiceActorStatistic struct {
	Count          int     `json:"count"`
	MeanScore      float64 `json:"meanScore"`
	MinutesWatched int     `json:"minutesWatched"`
	ChaptersRead   int     `json:"chaptersRead"`
	MediaIds       []*int  `json:"mediaIds"`
	VoiceActor     *Staff  `json:"voiceActor,omitempty"`
	CharacterIds   []*int  `json:"characterIds"`
}

// User's year statistics
type YearStats struct {
	Year      *int `json:"year,omitempty"`
	Amount    *int `json:"amount,omitempty"`
	MeanScore *int `json:"meanScore,omitempty"`
}

// Activity sort enums
type ActivitySort string

const (
	ActivitySortID     ActivitySort = "ID"
	ActivitySortIDDesc ActivitySort = "ID_DESC"
	ActivitySortPinned ActivitySort = "PINNED"
)

var AllActivitySort = []ActivitySort{
	ActivitySortID,
	ActivitySortIDDesc,
	ActivitySortPinned,
}

func (e ActivitySort) IsValid() bool {
	switch e {
	case ActivitySortID, ActivitySortIDDesc, ActivitySortPinned:
		return true
	}
	return false
}

func (e ActivitySort) String() string {
	return string(e)
}

func (e *ActivitySort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ActivitySort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ActivitySort", str)
	}
	return nil
}

func (e ActivitySort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Activity type enum.
type ActivityType string

const (
	// A text activity
	ActivityTypeText ActivityType = "TEXT"
	// A anime list update activity
	ActivityTypeAnimeList ActivityType = "ANIME_LIST"
	// A manga list update activity
	ActivityTypeMangaList ActivityType = "MANGA_LIST"
	// A text message activity sent to another user
	ActivityTypeMessage ActivityType = "MESSAGE"
	// Anime & Manga list update, only used in query arguments
	ActivityTypeMediaList ActivityType = "MEDIA_LIST"
)

var AllActivityType = []ActivityType{
	ActivityTypeText,
	ActivityTypeAnimeList,
	ActivityTypeMangaList,
	ActivityTypeMessage,
	ActivityTypeMediaList,
}

func (e ActivityType) IsValid() bool {
	switch e {
	case ActivityTypeText, ActivityTypeAnimeList, ActivityTypeMangaList, ActivityTypeMessage, ActivityTypeMediaList:
		return true
	}
	return false
}

func (e ActivityType) String() string {
	return string(e)
}

func (e *ActivityType) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ActivityType(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ActivityType", str)
	}
	return nil
}

func (e ActivityType) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Airing schedule sort enums
type AiringSort string

const (
	AiringSortID          AiringSort = "ID"
	AiringSortIDDesc      AiringSort = "ID_DESC"
	AiringSortMediaID     AiringSort = "MEDIA_ID"
	AiringSortMediaIDDesc AiringSort = "MEDIA_ID_DESC"
	AiringSortTime        AiringSort = "TIME"
	AiringSortTimeDesc    AiringSort = "TIME_DESC"
	AiringSortEpisode     AiringSort = "EPISODE"
	AiringSortEpisodeDesc AiringSort = "EPISODE_DESC"
)

var AllAiringSort = []AiringSort{
	AiringSortID,
	AiringSortIDDesc,
	AiringSortMediaID,
	AiringSortMediaIDDesc,
	AiringSortTime,
	AiringSortTimeDesc,
	AiringSortEpisode,
	AiringSortEpisodeDesc,
}

func (e AiringSort) IsValid() bool {
	switch e {
	case AiringSortID, AiringSortIDDesc, AiringSortMediaID, AiringSortMediaIDDesc, AiringSortTime, AiringSortTimeDesc, AiringSortEpisode, AiringSortEpisodeDesc:
		return true
	}
	return false
}

func (e AiringSort) String() string {
	return string(e)
}

func (e *AiringSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = AiringSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid AiringSort", str)
	}
	return nil
}

func (e AiringSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// The role the character plays in the media
type CharacterRole string

const (
	// A primary character role in the media
	CharacterRoleMain CharacterRole = "MAIN"
	// A supporting character role in the media
	CharacterRoleSupporting CharacterRole = "SUPPORTING"
	// A background character in the media
	CharacterRoleBackground CharacterRole = "BACKGROUND"
)

var AllCharacterRole = []CharacterRole{
	CharacterRoleMain,
	CharacterRoleSupporting,
	CharacterRoleBackground,
}

func (e CharacterRole) IsValid() bool {
	switch e {
	case CharacterRoleMain, CharacterRoleSupporting, CharacterRoleBackground:
		return true
	}
	return false
}

func (e CharacterRole) String() string {
	return string(e)
}

func (e *CharacterRole) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = CharacterRole(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid CharacterRole", str)
	}
	return nil
}

func (e CharacterRole) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Character sort enums
type CharacterSort string

const (
	CharacterSortID             CharacterSort = "ID"
	CharacterSortIDDesc         CharacterSort = "ID_DESC"
	CharacterSortRole           CharacterSort = "ROLE"
	CharacterSortRoleDesc       CharacterSort = "ROLE_DESC"
	CharacterSortSearchMatch    CharacterSort = "SEARCH_MATCH"
	CharacterSortFavourites     CharacterSort = "FAVOURITES"
	CharacterSortFavouritesDesc CharacterSort = "FAVOURITES_DESC"
	// Order manually decided by moderators
	CharacterSortRelevance CharacterSort = "RELEVANCE"
)

var AllCharacterSort = []CharacterSort{
	CharacterSortID,
	CharacterSortIDDesc,
	CharacterSortRole,
	CharacterSortRoleDesc,
	CharacterSortSearchMatch,
	CharacterSortFavourites,
	CharacterSortFavouritesDesc,
	CharacterSortRelevance,
}

func (e CharacterSort) IsValid() bool {
	switch e {
	case CharacterSortID, CharacterSortIDDesc, CharacterSortRole, CharacterSortRoleDesc, CharacterSortSearchMatch, CharacterSortFavourites, CharacterSortFavouritesDesc, CharacterSortRelevance:
		return true
	}
	return false
}

func (e CharacterSort) String() string {
	return string(e)
}

func (e *CharacterSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = CharacterSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid CharacterSort", str)
	}
	return nil
}

func (e CharacterSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

type ExternalLinkMediaType string

const (
	ExternalLinkMediaTypeAnime ExternalLinkMediaType = "ANIME"
	ExternalLinkMediaTypeManga ExternalLinkMediaType = "MANGA"
	ExternalLinkMediaTypeStaff ExternalLinkMediaType = "STAFF"
)

var AllExternalLinkMediaType = []ExternalLinkMediaType{
	ExternalLinkMediaTypeAnime,
	ExternalLinkMediaTypeManga,
	ExternalLinkMediaTypeStaff,
}

func (e ExternalLinkMediaType) IsValid() bool {
	switch e {
	case ExternalLinkMediaTypeAnime, ExternalLinkMediaTypeManga, ExternalLinkMediaTypeStaff:
		return true
	}
	return false
}

func (e ExternalLinkMediaType) String() string {
	return string(e)
}

func (e *ExternalLinkMediaType) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ExternalLinkMediaType(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ExternalLinkMediaType", str)
	}
	return nil
}

func (e ExternalLinkMediaType) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

type ExternalLinkType string

const (
	ExternalLinkTypeInfo      ExternalLinkType = "INFO"
	ExternalLinkTypeStreaming ExternalLinkType = "STREAMING"
	ExternalLinkTypeSocial    ExternalLinkType = "SOCIAL"
)

var AllExternalLinkType = []ExternalLinkType{
	ExternalLinkTypeInfo,
	ExternalLinkTypeStreaming,
	ExternalLinkTypeSocial,
}

func (e ExternalLinkType) IsValid() bool {
	switch e {
	case ExternalLinkTypeInfo, ExternalLinkTypeStreaming, ExternalLinkTypeSocial:
		return true
	}
	return false
}

func (e ExternalLinkType) String() string {
	return string(e)
}

func (e *ExternalLinkType) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ExternalLinkType(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ExternalLinkType", str)
	}
	return nil
}

func (e ExternalLinkType) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Types that can be liked
type LikeableType string

const (
	LikeableTypeThread        LikeableType = "THREAD"
	LikeableTypeThreadComment LikeableType = "THREAD_COMMENT"
	LikeableTypeActivity      LikeableType = "ACTIVITY"
	LikeableTypeActivityReply LikeableType = "ACTIVITY_REPLY"
)

var AllLikeableType = []LikeableType{
	LikeableTypeThread,
	LikeableTypeThreadComment,
	LikeableTypeActivity,
	LikeableTypeActivityReply,
}

func (e LikeableType) IsValid() bool {
	switch e {
	case LikeableTypeThread, LikeableTypeThreadComment, LikeableTypeActivity, LikeableTypeActivityReply:
		return true
	}
	return false
}

func (e LikeableType) String() string {
	return string(e)
}

func (e *LikeableType) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = LikeableType(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid LikeableType", str)
	}
	return nil
}

func (e LikeableType) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// The format the media was released in
type MediaFormat string

const (
	// Anime broadcast on television
	MediaFormatTv MediaFormat = "TV"
	// Anime which are under 15 minutes in length and broadcast on television
	MediaFormatTvShort MediaFormat = "TV_SHORT"
	// Anime movies with a theatrical release
	MediaFormatMovie MediaFormat = "MOVIE"
	// Special episodes that have been included in DVD/Blu-ray releases, picture dramas, pilots, etc
	MediaFormatSpecial MediaFormat = "SPECIAL"
	// (Original Video Animation) Anime that have been released directly on DVD/Blu-ray without originally going through a theatrical release or television broadcast
	MediaFormatOva MediaFormat = "OVA"
	// (Original Net Animation) Anime that have been originally released online or are only available through streaming services.
	MediaFormatOna MediaFormat = "ONA"
	// Short anime released as a music video
	MediaFormatMusic MediaFormat = "MUSIC"
	// Professionally published manga with more than one chapter
	MediaFormatManga MediaFormat = "MANGA"
	// Written books released as a series of light novels
	MediaFormatNovel MediaFormat = "NOVEL"
	// Manga with just one chapter
	MediaFormatOneShot MediaFormat = "ONE_SHOT"
)

var AllMediaFormat = []MediaFormat{
	MediaFormatTv,
	MediaFormatTvShort,
	MediaFormatMovie,
	MediaFormatSpecial,
	MediaFormatOva,
	MediaFormatOna,
	MediaFormatMusic,
	MediaFormatManga,
	MediaFormatNovel,
	MediaFormatOneShot,
}

func (e MediaFormat) IsValid() bool {
	switch e {
	case MediaFormatTv, MediaFormatTvShort, MediaFormatMovie, MediaFormatSpecial, MediaFormatOva, MediaFormatOna, MediaFormatMusic, MediaFormatManga, MediaFormatNovel, MediaFormatOneShot:
		return true
	}
	return false
}

func (e MediaFormat) String() string {
	return string(e)
}

func (e *MediaFormat) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaFormat(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaFormat", str)
	}
	return nil
}

func (e MediaFormat) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Media list sort enums
type MediaListSort string

const (
	MediaListSortMediaID               MediaListSort = "MEDIA_ID"
	MediaListSortMediaIDDesc           MediaListSort = "MEDIA_ID_DESC"
	MediaListSortScore                 MediaListSort = "SCORE"
	MediaListSortScoreDesc             MediaListSort = "SCORE_DESC"
	MediaListSortStatus                MediaListSort = "STATUS"
	MediaListSortStatusDesc            MediaListSort = "STATUS_DESC"
	MediaListSortProgress              MediaListSort = "PROGRESS"
	MediaListSortProgressDesc          MediaListSort = "PROGRESS_DESC"
	MediaListSortProgressVolumes       MediaListSort = "PROGRESS_VOLUMES"
	MediaListSortProgressVolumesDesc   MediaListSort = "PROGRESS_VOLUMES_DESC"
	MediaListSortRepeat                MediaListSort = "REPEAT"
	MediaListSortRepeatDesc            MediaListSort = "REPEAT_DESC"
	MediaListSortPriority              MediaListSort = "PRIORITY"
	MediaListSortPriorityDesc          MediaListSort = "PRIORITY_DESC"
	MediaListSortStartedOn             MediaListSort = "STARTED_ON"
	MediaListSortStartedOnDesc         MediaListSort = "STARTED_ON_DESC"
	MediaListSortFinishedOn            MediaListSort = "FINISHED_ON"
	MediaListSortFinishedOnDesc        MediaListSort = "FINISHED_ON_DESC"
	MediaListSortAddedTime             MediaListSort = "ADDED_TIME"
	MediaListSortAddedTimeDesc         MediaListSort = "ADDED_TIME_DESC"
	MediaListSortUpdatedTime           MediaListSort = "UPDATED_TIME"
	MediaListSortUpdatedTimeDesc       MediaListSort = "UPDATED_TIME_DESC"
	MediaListSortMediaTitleRomaji      MediaListSort = "MEDIA_TITLE_ROMAJI"
	MediaListSortMediaTitleRomajiDesc  MediaListSort = "MEDIA_TITLE_ROMAJI_DESC"
	MediaListSortMediaTitleEnglish     MediaListSort = "MEDIA_TITLE_ENGLISH"
	MediaListSortMediaTitleEnglishDesc MediaListSort = "MEDIA_TITLE_ENGLISH_DESC"
	MediaListSortMediaTitleNative      MediaListSort = "MEDIA_TITLE_NATIVE"
	MediaListSortMediaTitleNativeDesc  MediaListSort = "MEDIA_TITLE_NATIVE_DESC"
	MediaListSortMediaPopularity       MediaListSort = "MEDIA_POPULARITY"
	MediaListSortMediaPopularityDesc   MediaListSort = "MEDIA_POPULARITY_DESC"
)

var AllMediaListSort = []MediaListSort{
	MediaListSortMediaID,
	MediaListSortMediaIDDesc,
	MediaListSortScore,
	MediaListSortScoreDesc,
	MediaListSortStatus,
	MediaListSortStatusDesc,
	MediaListSortProgress,
	MediaListSortProgressDesc,
	MediaListSortProgressVolumes,
	MediaListSortProgressVolumesDesc,
	MediaListSortRepeat,
	MediaListSortRepeatDesc,
	MediaListSortPriority,
	MediaListSortPriorityDesc,
	MediaListSortStartedOn,
	MediaListSortStartedOnDesc,
	MediaListSortFinishedOn,
	MediaListSortFinishedOnDesc,
	MediaListSortAddedTime,
	MediaListSortAddedTimeDesc,
	MediaListSortUpdatedTime,
	MediaListSortUpdatedTimeDesc,
	MediaListSortMediaTitleRomaji,
	MediaListSortMediaTitleRomajiDesc,
	MediaListSortMediaTitleEnglish,
	MediaListSortMediaTitleEnglishDesc,
	MediaListSortMediaTitleNative,
	MediaListSortMediaTitleNativeDesc,
	MediaListSortMediaPopularity,
	MediaListSortMediaPopularityDesc,
}

func (e MediaListSort) IsValid() bool {
	switch e {
	case MediaListSortMediaID, MediaListSortMediaIDDesc, MediaListSortScore, MediaListSortScoreDesc, MediaListSortStatus, MediaListSortStatusDesc, MediaListSortProgress, MediaListSortProgressDesc, MediaListSortProgressVolumes, MediaListSortProgressVolumesDesc, MediaListSortRepeat, MediaListSortRepeatDesc, MediaListSortPriority, MediaListSortPriorityDesc, MediaListSortStartedOn, MediaListSortStartedOnDesc, MediaListSortFinishedOn, MediaListSortFinishedOnDesc, MediaListSortAddedTime, MediaListSortAddedTimeDesc, MediaListSortUpdatedTime, MediaListSortUpdatedTimeDesc, MediaListSortMediaTitleRomaji, MediaListSortMediaTitleRomajiDesc, MediaListSortMediaTitleEnglish, MediaListSortMediaTitleEnglishDesc, MediaListSortMediaTitleNative, MediaListSortMediaTitleNativeDesc, MediaListSortMediaPopularity, MediaListSortMediaPopularityDesc:
		return true
	}
	return false
}

func (e MediaListSort) String() string {
	return string(e)
}

func (e *MediaListSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaListSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaListSort", str)
	}
	return nil
}

func (e MediaListSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Media list watching/reading status enum.
type MediaListStatus string

const (
	// Currently watching/reading
	MediaListStatusCurrent MediaListStatus = "CURRENT"
	// Planning to watch/read
	MediaListStatusPlanning MediaListStatus = "PLANNING"
	// Finished watching/reading
	MediaListStatusCompleted MediaListStatus = "COMPLETED"
	// Stopped watching/reading before completing
	MediaListStatusDropped MediaListStatus = "DROPPED"
	// Paused watching/reading
	MediaListStatusPaused MediaListStatus = "PAUSED"
	// Re-watching/reading
	MediaListStatusRepeating MediaListStatus = "REPEATING"
)

var AllMediaListStatus = []MediaListStatus{
	MediaListStatusCurrent,
	MediaListStatusPlanning,
	MediaListStatusCompleted,
	MediaListStatusDropped,
	MediaListStatusPaused,
	MediaListStatusRepeating,
}

func (e MediaListStatus) IsValid() bool {
	switch e {
	case MediaListStatusCurrent, MediaListStatusPlanning, MediaListStatusCompleted, MediaListStatusDropped, MediaListStatusPaused, MediaListStatusRepeating:
		return true
	}
	return false
}

func (e MediaListStatus) String() string {
	return string(e)
}

func (e *MediaListStatus) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaListStatus(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaListStatus", str)
	}
	return nil
}

func (e MediaListStatus) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// The type of ranking
type MediaRankType string

const (
	// Ranking is based on the media's ratings/score
	MediaRankTypeRated MediaRankType = "RATED"
	// Ranking is based on the media's popularity
	MediaRankTypePopular MediaRankType = "POPULAR"
)

var AllMediaRankType = []MediaRankType{
	MediaRankTypeRated,
	MediaRankTypePopular,
}

func (e MediaRankType) IsValid() bool {
	switch e {
	case MediaRankTypeRated, MediaRankTypePopular:
		return true
	}
	return false
}

func (e MediaRankType) String() string {
	return string(e)
}

func (e *MediaRankType) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaRankType(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaRankType", str)
	}
	return nil
}

func (e MediaRankType) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Type of relation media has to its parent.
type MediaRelation string

const (
	// An adaption of this media into a different format
	MediaRelationAdaptation MediaRelation = "ADAPTATION"
	// Released before the relation
	MediaRelationPrequel MediaRelation = "PREQUEL"
	// Released after the relation
	MediaRelationSequel MediaRelation = "SEQUEL"
	// The media a side story is from
	MediaRelationParent MediaRelation = "PARENT"
	// A side story of the parent media
	MediaRelationSideStory MediaRelation = "SIDE_STORY"
	// Shares at least 1 character
	MediaRelationCharacter MediaRelation = "CHARACTER"
	// A shortened and summarized version
	MediaRelationSummary MediaRelation = "SUMMARY"
	// An alternative version of the same media
	MediaRelationAlternative MediaRelation = "ALTERNATIVE"
	// An alternative version of the media with a different primary focus
	MediaRelationSpinOff MediaRelation = "SPIN_OFF"
	// Other
	MediaRelationOther MediaRelation = "OTHER"
	// Version 2 only. The source material the media was adapted from
	MediaRelationSource MediaRelation = "SOURCE"
	// Version 2 only.
	MediaRelationCompilation MediaRelation = "COMPILATION"
	// Version 2 only.
	MediaRelationContains MediaRelation = "CONTAINS"
)

var AllMediaRelation = []MediaRelation{
	MediaRelationAdaptation,
	MediaRelationPrequel,
	MediaRelationSequel,
	MediaRelationParent,
	MediaRelationSideStory,
	MediaRelationCharacter,
	MediaRelationSummary,
	MediaRelationAlternative,
	MediaRelationSpinOff,
	MediaRelationOther,
	MediaRelationSource,
	MediaRelationCompilation,
	MediaRelationContains,
}

func (e MediaRelation) IsValid() bool {
	switch e {
	case MediaRelationAdaptation, MediaRelationPrequel, MediaRelationSequel, MediaRelationParent, MediaRelationSideStory, MediaRelationCharacter, MediaRelationSummary, MediaRelationAlternative, MediaRelationSpinOff, MediaRelationOther, MediaRelationSource, MediaRelationCompilation, MediaRelationContains:
		return true
	}
	return false
}

func (e MediaRelation) String() string {
	return string(e)
}

func (e *MediaRelation) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaRelation(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaRelation", str)
	}
	return nil
}

func (e MediaRelation) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

type MediaSeason string

const (
	// Months December to February
	MediaSeasonWinter MediaSeason = "WINTER"
	// Months March to May
	MediaSeasonSpring MediaSeason = "SPRING"
	// Months June to August
	MediaSeasonSummer MediaSeason = "SUMMER"
	// Months September to November
	MediaSeasonFall MediaSeason = "FALL"
)

var AllMediaSeason = []MediaSeason{
	MediaSeasonWinter,
	MediaSeasonSpring,
	MediaSeasonSummer,
	MediaSeasonFall,
}

func (e MediaSeason) IsValid() bool {
	switch e {
	case MediaSeasonWinter, MediaSeasonSpring, MediaSeasonSummer, MediaSeasonFall:
		return true
	}
	return false
}

func (e MediaSeason) String() string {
	return string(e)
}

func (e *MediaSeason) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaSeason(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaSeason", str)
	}
	return nil
}

func (e MediaSeason) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Media sort enums
type MediaSort string

const (
	MediaSortID               MediaSort = "ID"
	MediaSortIDDesc           MediaSort = "ID_DESC"
	MediaSortTitleRomaji      MediaSort = "TITLE_ROMAJI"
	MediaSortTitleRomajiDesc  MediaSort = "TITLE_ROMAJI_DESC"
	MediaSortTitleEnglish     MediaSort = "TITLE_ENGLISH"
	MediaSortTitleEnglishDesc MediaSort = "TITLE_ENGLISH_DESC"
	MediaSortTitleNative      MediaSort = "TITLE_NATIVE"
	MediaSortTitleNativeDesc  MediaSort = "TITLE_NATIVE_DESC"
	MediaSortType             MediaSort = "TYPE"
	MediaSortTypeDesc         MediaSort = "TYPE_DESC"
	MediaSortFormat           MediaSort = "FORMAT"
	MediaSortFormatDesc       MediaSort = "FORMAT_DESC"
	MediaSortStartDate        MediaSort = "START_DATE"
	MediaSortStartDateDesc    MediaSort = "START_DATE_DESC"
	MediaSortEndDate          MediaSort = "END_DATE"
	MediaSortEndDateDesc      MediaSort = "END_DATE_DESC"
	MediaSortScore            MediaSort = "SCORE"
	MediaSortScoreDesc        MediaSort = "SCORE_DESC"
	MediaSortPopularity       MediaSort = "POPULARITY"
	MediaSortPopularityDesc   MediaSort = "POPULARITY_DESC"
	MediaSortTrending         MediaSort = "TRENDING"
	MediaSortTrendingDesc     MediaSort = "TRENDING_DESC"
	MediaSortEpisodes         MediaSort = "EPISODES"
	MediaSortEpisodesDesc     MediaSort = "EPISODES_DESC"
	MediaSortDuration         MediaSort = "DURATION"
	MediaSortDurationDesc     MediaSort = "DURATION_DESC"
	MediaSortStatus           MediaSort = "STATUS"
	MediaSortStatusDesc       MediaSort = "STATUS_DESC"
	MediaSortChapters         MediaSort = "CHAPTERS"
	MediaSortChaptersDesc     MediaSort = "CHAPTERS_DESC"
	MediaSortVolumes          MediaSort = "VOLUMES"
	MediaSortVolumesDesc      MediaSort = "VOLUMES_DESC"
	MediaSortUpdatedAt        MediaSort = "UPDATED_AT"
	MediaSortUpdatedAtDesc    MediaSort = "UPDATED_AT_DESC"
	MediaSortSearchMatch      MediaSort = "SEARCH_MATCH"
	MediaSortFavourites       MediaSort = "FAVOURITES"
	MediaSortFavouritesDesc   MediaSort = "FAVOURITES_DESC"
)

var AllMediaSort = []MediaSort{
	MediaSortID,
	MediaSortIDDesc,
	MediaSortTitleRomaji,
	MediaSortTitleRomajiDesc,
	MediaSortTitleEnglish,
	MediaSortTitleEnglishDesc,
	MediaSortTitleNative,
	MediaSortTitleNativeDesc,
	MediaSortType,
	MediaSortTypeDesc,
	MediaSortFormat,
	MediaSortFormatDesc,
	MediaSortStartDate,
	MediaSortStartDateDesc,
	MediaSortEndDate,
	MediaSortEndDateDesc,
	MediaSortScore,
	MediaSortScoreDesc,
	MediaSortPopularity,
	MediaSortPopularityDesc,
	MediaSortTrending,
	MediaSortTrendingDesc,
	MediaSortEpisodes,
	MediaSortEpisodesDesc,
	MediaSortDuration,
	MediaSortDurationDesc,
	MediaSortStatus,
	MediaSortStatusDesc,
	MediaSortChapters,
	MediaSortChaptersDesc,
	MediaSortVolumes,
	MediaSortVolumesDesc,
	MediaSortUpdatedAt,
	MediaSortUpdatedAtDesc,
	MediaSortSearchMatch,
	MediaSortFavourites,
	MediaSortFavouritesDesc,
}

func (e MediaSort) IsValid() bool {
	switch e {
	case MediaSortID, MediaSortIDDesc, MediaSortTitleRomaji, MediaSortTitleRomajiDesc, MediaSortTitleEnglish, MediaSortTitleEnglishDesc, MediaSortTitleNative, MediaSortTitleNativeDesc, MediaSortType, MediaSortTypeDesc, MediaSortFormat, MediaSortFormatDesc, MediaSortStartDate, MediaSortStartDateDesc, MediaSortEndDate, MediaSortEndDateDesc, MediaSortScore, MediaSortScoreDesc, MediaSortPopularity, MediaSortPopularityDesc, MediaSortTrending, MediaSortTrendingDesc, MediaSortEpisodes, MediaSortEpisodesDesc, MediaSortDuration, MediaSortDurationDesc, MediaSortStatus, MediaSortStatusDesc, MediaSortChapters, MediaSortChaptersDesc, MediaSortVolumes, MediaSortVolumesDesc, MediaSortUpdatedAt, MediaSortUpdatedAtDesc, MediaSortSearchMatch, MediaSortFavourites, MediaSortFavouritesDesc:
		return true
	}
	return false
}

func (e MediaSort) String() string {
	return string(e)
}

func (e *MediaSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaSort", str)
	}
	return nil
}

func (e MediaSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Source type the media was adapted from
type MediaSource string

const (
	// An original production not based of another work
	MediaSourceOriginal MediaSource = "ORIGINAL"
	// Asian comic book
	MediaSourceManga MediaSource = "MANGA"
	// Written work published in volumes
	MediaSourceLightNovel MediaSource = "LIGHT_NOVEL"
	// Video game driven primary by text and narrative
	MediaSourceVisualNovel MediaSource = "VISUAL_NOVEL"
	// Video game
	MediaSourceVideoGame MediaSource = "VIDEO_GAME"
	// Other
	MediaSourceOther MediaSource = "OTHER"
	// Version 2+ only. Written works not published in volumes
	MediaSourceNovel MediaSource = "NOVEL"
	// Version 2+ only. Self-published works
	MediaSourceDoujinshi MediaSource = "DOUJINSHI"
	// Version 2+ only. Japanese Anime
	MediaSourceAnime MediaSource = "ANIME"
	// Version 3 only. Written works published online
	MediaSourceWebNovel MediaSource = "WEB_NOVEL"
	// Version 3 only. Live action media such as movies or TV show
	MediaSourceLiveAction MediaSource = "LIVE_ACTION"
	// Version 3 only. Games excluding video games
	MediaSourceGame MediaSource = "GAME"
	// Version 3 only. Comics excluding manga
	MediaSourceComic MediaSource = "COMIC"
	// Version 3 only. Multimedia project
	MediaSourceMultimediaProject MediaSource = "MULTIMEDIA_PROJECT"
	// Version 3 only. Picture book
	MediaSourcePictureBook MediaSource = "PICTURE_BOOK"
)

var AllMediaSource = []MediaSource{
	MediaSourceOriginal,
	MediaSourceManga,
	MediaSourceLightNovel,
	MediaSourceVisualNovel,
	MediaSourceVideoGame,
	MediaSourceOther,
	MediaSourceNovel,
	MediaSourceDoujinshi,
	MediaSourceAnime,
	MediaSourceWebNovel,
	MediaSourceLiveAction,
	MediaSourceGame,
	MediaSourceComic,
	MediaSourceMultimediaProject,
	MediaSourcePictureBook,
}

func (e MediaSource) IsValid() bool {
	switch e {
	case MediaSourceOriginal, MediaSourceManga, MediaSourceLightNovel, MediaSourceVisualNovel, MediaSourceVideoGame, MediaSourceOther, MediaSourceNovel, MediaSourceDoujinshi, MediaSourceAnime, MediaSourceWebNovel, MediaSourceLiveAction, MediaSourceGame, MediaSourceComic, MediaSourceMultimediaProject, MediaSourcePictureBook:
		return true
	}
	return false
}

func (e MediaSource) String() string {
	return string(e)
}

func (e *MediaSource) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaSource(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaSource", str)
	}
	return nil
}

func (e MediaSource) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// The current releasing status of the media
type MediaStatus string

const (
	// Has completed and is no longer being released
	MediaStatusFinished MediaStatus = "FINISHED"
	// Currently releasing
	MediaStatusReleasing MediaStatus = "RELEASING"
	// To be released at a later date
	MediaStatusNotYetReleased MediaStatus = "NOT_YET_RELEASED"
	// Ended before the work could be finished
	MediaStatusCancelled MediaStatus = "CANCELLED"
	// Version 2 only. Is currently paused from releasing and will resume at a later date
	MediaStatusHiatus MediaStatus = "HIATUS"
)

var AllMediaStatus = []MediaStatus{
	MediaStatusFinished,
	MediaStatusReleasing,
	MediaStatusNotYetReleased,
	MediaStatusCancelled,
	MediaStatusHiatus,
}

func (e MediaStatus) IsValid() bool {
	switch e {
	case MediaStatusFinished, MediaStatusReleasing, MediaStatusNotYetReleased, MediaStatusCancelled, MediaStatusHiatus:
		return true
	}
	return false
}

func (e MediaStatus) String() string {
	return string(e)
}

func (e *MediaStatus) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaStatus(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaStatus", str)
	}
	return nil
}

func (e MediaStatus) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Media trend sort enums
type MediaTrendSort string

const (
	MediaTrendSortID             MediaTrendSort = "ID"
	MediaTrendSortIDDesc         MediaTrendSort = "ID_DESC"
	MediaTrendSortMediaID        MediaTrendSort = "MEDIA_ID"
	MediaTrendSortMediaIDDesc    MediaTrendSort = "MEDIA_ID_DESC"
	MediaTrendSortDate           MediaTrendSort = "DATE"
	MediaTrendSortDateDesc       MediaTrendSort = "DATE_DESC"
	MediaTrendSortScore          MediaTrendSort = "SCORE"
	MediaTrendSortScoreDesc      MediaTrendSort = "SCORE_DESC"
	MediaTrendSortPopularity     MediaTrendSort = "POPULARITY"
	MediaTrendSortPopularityDesc MediaTrendSort = "POPULARITY_DESC"
	MediaTrendSortTrending       MediaTrendSort = "TRENDING"
	MediaTrendSortTrendingDesc   MediaTrendSort = "TRENDING_DESC"
	MediaTrendSortEpisode        MediaTrendSort = "EPISODE"
	MediaTrendSortEpisodeDesc    MediaTrendSort = "EPISODE_DESC"
)

var AllMediaTrendSort = []MediaTrendSort{
	MediaTrendSortID,
	MediaTrendSortIDDesc,
	MediaTrendSortMediaID,
	MediaTrendSortMediaIDDesc,
	MediaTrendSortDate,
	MediaTrendSortDateDesc,
	MediaTrendSortScore,
	MediaTrendSortScoreDesc,
	MediaTrendSortPopularity,
	MediaTrendSortPopularityDesc,
	MediaTrendSortTrending,
	MediaTrendSortTrendingDesc,
	MediaTrendSortEpisode,
	MediaTrendSortEpisodeDesc,
}

func (e MediaTrendSort) IsValid() bool {
	switch e {
	case MediaTrendSortID, MediaTrendSortIDDesc, MediaTrendSortMediaID, MediaTrendSortMediaIDDesc, MediaTrendSortDate, MediaTrendSortDateDesc, MediaTrendSortScore, MediaTrendSortScoreDesc, MediaTrendSortPopularity, MediaTrendSortPopularityDesc, MediaTrendSortTrending, MediaTrendSortTrendingDesc, MediaTrendSortEpisode, MediaTrendSortEpisodeDesc:
		return true
	}
	return false
}

func (e MediaTrendSort) String() string {
	return string(e)
}

func (e *MediaTrendSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaTrendSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaTrendSort", str)
	}
	return nil
}

func (e MediaTrendSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Media type enum, anime or manga.
type MediaType string

const (
	// Japanese Anime
	MediaTypeAnime MediaType = "ANIME"
	// Asian comic
	MediaTypeManga MediaType = "MANGA"
)

var AllMediaType = []MediaType{
	MediaTypeAnime,
	MediaTypeManga,
}

func (e MediaType) IsValid() bool {
	switch e {
	case MediaTypeAnime, MediaTypeManga:
		return true
	}
	return false
}

func (e MediaType) String() string {
	return string(e)
}

func (e *MediaType) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = MediaType(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid MediaType", str)
	}
	return nil
}

func (e MediaType) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

type ModActionType string

const (
	ModActionTypeNote   ModActionType = "NOTE"
	ModActionTypeBan    ModActionType = "BAN"
	ModActionTypeDelete ModActionType = "DELETE"
	ModActionTypeEdit   ModActionType = "EDIT"
	ModActionTypeExpire ModActionType = "EXPIRE"
	ModActionTypeReport ModActionType = "REPORT"
	ModActionTypeReset  ModActionType = "RESET"
	ModActionTypeAnon   ModActionType = "ANON"
)

var AllModActionType = []ModActionType{
	ModActionTypeNote,
	ModActionTypeBan,
	ModActionTypeDelete,
	ModActionTypeEdit,
	ModActionTypeExpire,
	ModActionTypeReport,
	ModActionTypeReset,
	ModActionTypeAnon,
}

func (e ModActionType) IsValid() bool {
	switch e {
	case ModActionTypeNote, ModActionTypeBan, ModActionTypeDelete, ModActionTypeEdit, ModActionTypeExpire, ModActionTypeReport, ModActionTypeReset, ModActionTypeAnon:
		return true
	}
	return false
}

func (e ModActionType) String() string {
	return string(e)
}

func (e *ModActionType) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ModActionType(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ModActionType", str)
	}
	return nil
}

func (e ModActionType) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Mod role enums
type ModRole string

const (
	// An AniList administrator
	ModRoleAdmin ModRole = "ADMIN"
	// A head developer of AniList
	ModRoleLeadDeveloper ModRole = "LEAD_DEVELOPER"
	// An AniList developer
	ModRoleDeveloper ModRole = "DEVELOPER"
	// A lead community moderator
	ModRoleLeadCommunity ModRole = "LEAD_COMMUNITY"
	// A community moderator
	ModRoleCommunity ModRole = "COMMUNITY"
	// A discord community moderator
	ModRoleDiscordCommunity ModRole = "DISCORD_COMMUNITY"
	// A lead anime data moderator
	ModRoleLeadAnimeData ModRole = "LEAD_ANIME_DATA"
	// An anime data moderator
	ModRoleAnimeData ModRole = "ANIME_DATA"
	// A lead manga data moderator
	ModRoleLeadMangaData ModRole = "LEAD_MANGA_DATA"
	// A manga data moderator
	ModRoleMangaData ModRole = "MANGA_DATA"
	// A lead social media moderator
	ModRoleLeadSocialMedia ModRole = "LEAD_SOCIAL_MEDIA"
	// A social media moderator
	ModRoleSocialMedia ModRole = "SOCIAL_MEDIA"
	// A retired moderator
	ModRoleRetired ModRole = "RETIRED"
	// A character data moderator
	ModRoleCharacterData ModRole = "CHARACTER_DATA"
	// A staff data moderator
	ModRoleStaffData ModRole = "STAFF_DATA"
)

var AllModRole = []ModRole{
	ModRoleAdmin,
	ModRoleLeadDeveloper,
	ModRoleDeveloper,
	ModRoleLeadCommunity,
	ModRoleCommunity,
	ModRoleDiscordCommunity,
	ModRoleLeadAnimeData,
	ModRoleAnimeData,
	ModRoleLeadMangaData,
	ModRoleMangaData,
	ModRoleLeadSocialMedia,
	ModRoleSocialMedia,
	ModRoleRetired,
	ModRoleCharacterData,
	ModRoleStaffData,
}

func (e ModRole) IsValid() bool {
	switch e {
	case ModRoleAdmin, ModRoleLeadDeveloper, ModRoleDeveloper, ModRoleLeadCommunity, ModRoleCommunity, ModRoleDiscordCommunity, ModRoleLeadAnimeData, ModRoleAnimeData, ModRoleLeadMangaData, ModRoleMangaData, ModRoleLeadSocialMedia, ModRoleSocialMedia, ModRoleRetired, ModRoleCharacterData, ModRoleStaffData:
		return true
	}
	return false
}

func (e ModRole) String() string {
	return string(e)
}

func (e *ModRole) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ModRole(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ModRole", str)
	}
	return nil
}

func (e ModRole) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Notification type enum
type NotificationType string

const (
	// A user has sent you message
	NotificationTypeActivityMessage NotificationType = "ACTIVITY_MESSAGE"
	// A user has replied to your activity
	NotificationTypeActivityReply NotificationType = "ACTIVITY_REPLY"
	// A user has followed you
	NotificationTypeFollowing NotificationType = "FOLLOWING"
	// A user has mentioned you in their activity
	NotificationTypeActivityMention NotificationType = "ACTIVITY_MENTION"
	// A user has mentioned you in a forum comment
	NotificationTypeThreadCommentMention NotificationType = "THREAD_COMMENT_MENTION"
	// A user has commented in one of your subscribed forum threads
	NotificationTypeThreadSubscribed NotificationType = "THREAD_SUBSCRIBED"
	// A user has replied to your forum comment
	NotificationTypeThreadCommentReply NotificationType = "THREAD_COMMENT_REPLY"
	// An anime you are currently watching has aired
	NotificationTypeAiring NotificationType = "AIRING"
	// A user has liked your activity
	NotificationTypeActivityLike NotificationType = "ACTIVITY_LIKE"
	// A user has liked your activity reply
	NotificationTypeActivityReplyLike NotificationType = "ACTIVITY_REPLY_LIKE"
	// A user has liked your forum thread
	NotificationTypeThreadLike NotificationType = "THREAD_LIKE"
	// A user has liked your forum comment
	NotificationTypeThreadCommentLike NotificationType = "THREAD_COMMENT_LIKE"
	// A user has replied to activity you have also replied to
	NotificationTypeActivityReplySubscribed NotificationType = "ACTIVITY_REPLY_SUBSCRIBED"
	// A new anime or manga has been added to the site where its related media is on the user's list
	NotificationTypeRelatedMediaAddition NotificationType = "RELATED_MEDIA_ADDITION"
	// An anime or manga has had a data change that affects how a user may track it in their lists
	NotificationTypeMediaDataChange NotificationType = "MEDIA_DATA_CHANGE"
	// Anime or manga entries on the user's list have been merged into a single entry
	NotificationTypeMediaMerge NotificationType = "MEDIA_MERGE"
	// An anime or manga on the user's list has been deleted from the site
	NotificationTypeMediaDeletion NotificationType = "MEDIA_DELETION"
)

var AllNotificationType = []NotificationType{
	NotificationTypeActivityMessage,
	NotificationTypeActivityReply,
	NotificationTypeFollowing,
	NotificationTypeActivityMention,
	NotificationTypeThreadCommentMention,
	NotificationTypeThreadSubscribed,
	NotificationTypeThreadCommentReply,
	NotificationTypeAiring,
	NotificationTypeActivityLike,
	NotificationTypeActivityReplyLike,
	NotificationTypeThreadLike,
	NotificationTypeThreadCommentLike,
	NotificationTypeActivityReplySubscribed,
	NotificationTypeRelatedMediaAddition,
	NotificationTypeMediaDataChange,
	NotificationTypeMediaMerge,
	NotificationTypeMediaDeletion,
}

func (e NotificationType) IsValid() bool {
	switch e {
	case NotificationTypeActivityMessage, NotificationTypeActivityReply, NotificationTypeFollowing, NotificationTypeActivityMention, NotificationTypeThreadCommentMention, NotificationTypeThreadSubscribed, NotificationTypeThreadCommentReply, NotificationTypeAiring, NotificationTypeActivityLike, NotificationTypeActivityReplyLike, NotificationTypeThreadLike, NotificationTypeThreadCommentLike, NotificationTypeActivityReplySubscribed, NotificationTypeRelatedMediaAddition, NotificationTypeMediaDataChange, NotificationTypeMediaMerge, NotificationTypeMediaDeletion:
		return true
	}
	return false
}

func (e NotificationType) String() string {
	return string(e)
}

func (e *NotificationType) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = NotificationType(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid NotificationType", str)
	}
	return nil
}

func (e NotificationType) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Recommendation rating enums
type RecommendationRating string

const (
	RecommendationRatingNoRating RecommendationRating = "NO_RATING"
	RecommendationRatingRateUp   RecommendationRating = "RATE_UP"
	RecommendationRatingRateDown RecommendationRating = "RATE_DOWN"
)

var AllRecommendationRating = []RecommendationRating{
	RecommendationRatingNoRating,
	RecommendationRatingRateUp,
	RecommendationRatingRateDown,
}

func (e RecommendationRating) IsValid() bool {
	switch e {
	case RecommendationRatingNoRating, RecommendationRatingRateUp, RecommendationRatingRateDown:
		return true
	}
	return false
}

func (e RecommendationRating) String() string {
	return string(e)
}

func (e *RecommendationRating) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = RecommendationRating(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid RecommendationRating", str)
	}
	return nil
}

func (e RecommendationRating) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Recommendation sort enums
type RecommendationSort string

const (
	RecommendationSortID         RecommendationSort = "ID"
	RecommendationSortIDDesc     RecommendationSort = "ID_DESC"
	RecommendationSortRating     RecommendationSort = "RATING"
	RecommendationSortRatingDesc RecommendationSort = "RATING_DESC"
)

var AllRecommendationSort = []RecommendationSort{
	RecommendationSortID,
	RecommendationSortIDDesc,
	RecommendationSortRating,
	RecommendationSortRatingDesc,
}

func (e RecommendationSort) IsValid() bool {
	switch e {
	case RecommendationSortID, RecommendationSortIDDesc, RecommendationSortRating, RecommendationSortRatingDesc:
		return true
	}
	return false
}

func (e RecommendationSort) String() string {
	return string(e)
}

func (e *RecommendationSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = RecommendationSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid RecommendationSort", str)
	}
	return nil
}

func (e RecommendationSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Review rating enums
type ReviewRating string

const (
	ReviewRatingNoVote   ReviewRating = "NO_VOTE"
	ReviewRatingUpVote   ReviewRating = "UP_VOTE"
	ReviewRatingDownVote ReviewRating = "DOWN_VOTE"
)

var AllReviewRating = []ReviewRating{
	ReviewRatingNoVote,
	ReviewRatingUpVote,
	ReviewRatingDownVote,
}

func (e ReviewRating) IsValid() bool {
	switch e {
	case ReviewRatingNoVote, ReviewRatingUpVote, ReviewRatingDownVote:
		return true
	}
	return false
}

func (e ReviewRating) String() string {
	return string(e)
}

func (e *ReviewRating) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ReviewRating(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ReviewRating", str)
	}
	return nil
}

func (e ReviewRating) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Review sort enums
type ReviewSort string

const (
	ReviewSortID            ReviewSort = "ID"
	ReviewSortIDDesc        ReviewSort = "ID_DESC"
	ReviewSortScore         ReviewSort = "SCORE"
	ReviewSortScoreDesc     ReviewSort = "SCORE_DESC"
	ReviewSortRating        ReviewSort = "RATING"
	ReviewSortRatingDesc    ReviewSort = "RATING_DESC"
	ReviewSortCreatedAt     ReviewSort = "CREATED_AT"
	ReviewSortCreatedAtDesc ReviewSort = "CREATED_AT_DESC"
	ReviewSortUpdatedAt     ReviewSort = "UPDATED_AT"
	ReviewSortUpdatedAtDesc ReviewSort = "UPDATED_AT_DESC"
)

var AllReviewSort = []ReviewSort{
	ReviewSortID,
	ReviewSortIDDesc,
	ReviewSortScore,
	ReviewSortScoreDesc,
	ReviewSortRating,
	ReviewSortRatingDesc,
	ReviewSortCreatedAt,
	ReviewSortCreatedAtDesc,
	ReviewSortUpdatedAt,
	ReviewSortUpdatedAtDesc,
}

func (e ReviewSort) IsValid() bool {
	switch e {
	case ReviewSortID, ReviewSortIDDesc, ReviewSortScore, ReviewSortScoreDesc, ReviewSortRating, ReviewSortRatingDesc, ReviewSortCreatedAt, ReviewSortCreatedAtDesc, ReviewSortUpdatedAt, ReviewSortUpdatedAtDesc:
		return true
	}
	return false
}

func (e ReviewSort) String() string {
	return string(e)
}

func (e *ReviewSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ReviewSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ReviewSort", str)
	}
	return nil
}

func (e ReviewSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Revision history actions
type RevisionHistoryAction string

const (
	RevisionHistoryActionCreate RevisionHistoryAction = "CREATE"
	RevisionHistoryActionEdit   RevisionHistoryAction = "EDIT"
)

var AllRevisionHistoryAction = []RevisionHistoryAction{
	RevisionHistoryActionCreate,
	RevisionHistoryActionEdit,
}

func (e RevisionHistoryAction) IsValid() bool {
	switch e {
	case RevisionHistoryActionCreate, RevisionHistoryActionEdit:
		return true
	}
	return false
}

func (e RevisionHistoryAction) String() string {
	return string(e)
}

func (e *RevisionHistoryAction) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = RevisionHistoryAction(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid RevisionHistoryAction", str)
	}
	return nil
}

func (e RevisionHistoryAction) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Media list scoring type
type ScoreFormat string

const (
	// An integer from 0-100
	ScoreFormatPoint100 ScoreFormat = "POINT_100"
	// A float from 0-10 with 1 decimal place
	ScoreFormatPoint10Decimal ScoreFormat = "POINT_10_DECIMAL"
	// An integer from 0-10
	ScoreFormatPoint10 ScoreFormat = "POINT_10"
	// An integer from 0-5. Should be represented in Stars
	ScoreFormatPoint5 ScoreFormat = "POINT_5"
	// An integer from 0-3. Should be represented in Smileys. 0 => No Score, 1 => :(, 2 => :|, 3 => :)
	ScoreFormatPoint3 ScoreFormat = "POINT_3"
)

var AllScoreFormat = []ScoreFormat{
	ScoreFormatPoint100,
	ScoreFormatPoint10Decimal,
	ScoreFormatPoint10,
	ScoreFormatPoint5,
	ScoreFormatPoint3,
}

func (e ScoreFormat) IsValid() bool {
	switch e {
	case ScoreFormatPoint100, ScoreFormatPoint10Decimal, ScoreFormatPoint10, ScoreFormatPoint5, ScoreFormatPoint3:
		return true
	}
	return false
}

func (e ScoreFormat) String() string {
	return string(e)
}

func (e *ScoreFormat) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ScoreFormat(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ScoreFormat", str)
	}
	return nil
}

func (e ScoreFormat) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Site trend sort enums
type SiteTrendSort string

const (
	SiteTrendSortDate       SiteTrendSort = "DATE"
	SiteTrendSortDateDesc   SiteTrendSort = "DATE_DESC"
	SiteTrendSortCount      SiteTrendSort = "COUNT"
	SiteTrendSortCountDesc  SiteTrendSort = "COUNT_DESC"
	SiteTrendSortChange     SiteTrendSort = "CHANGE"
	SiteTrendSortChangeDesc SiteTrendSort = "CHANGE_DESC"
)

var AllSiteTrendSort = []SiteTrendSort{
	SiteTrendSortDate,
	SiteTrendSortDateDesc,
	SiteTrendSortCount,
	SiteTrendSortCountDesc,
	SiteTrendSortChange,
	SiteTrendSortChangeDesc,
}

func (e SiteTrendSort) IsValid() bool {
	switch e {
	case SiteTrendSortDate, SiteTrendSortDateDesc, SiteTrendSortCount, SiteTrendSortCountDesc, SiteTrendSortChange, SiteTrendSortChangeDesc:
		return true
	}
	return false
}

func (e SiteTrendSort) String() string {
	return string(e)
}

func (e *SiteTrendSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = SiteTrendSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid SiteTrendSort", str)
	}
	return nil
}

func (e SiteTrendSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// The primary language of the voice actor
type StaffLanguage string

const (
	// Japanese
	StaffLanguageJapanese StaffLanguage = "JAPANESE"
	// English
	StaffLanguageEnglish StaffLanguage = "ENGLISH"
	// Korean
	StaffLanguageKorean StaffLanguage = "KOREAN"
	// Italian
	StaffLanguageItalian StaffLanguage = "ITALIAN"
	// Spanish
	StaffLanguageSpanish StaffLanguage = "SPANISH"
	// Portuguese
	StaffLanguagePortuguese StaffLanguage = "PORTUGUESE"
	// French
	StaffLanguageFrench StaffLanguage = "FRENCH"
	// German
	StaffLanguageGerman StaffLanguage = "GERMAN"
	// Hebrew
	StaffLanguageHebrew StaffLanguage = "HEBREW"
	// Hungarian
	StaffLanguageHungarian StaffLanguage = "HUNGARIAN"
)

var AllStaffLanguage = []StaffLanguage{
	StaffLanguageJapanese,
	StaffLanguageEnglish,
	StaffLanguageKorean,
	StaffLanguageItalian,
	StaffLanguageSpanish,
	StaffLanguagePortuguese,
	StaffLanguageFrench,
	StaffLanguageGerman,
	StaffLanguageHebrew,
	StaffLanguageHungarian,
}

func (e StaffLanguage) IsValid() bool {
	switch e {
	case StaffLanguageJapanese, StaffLanguageEnglish, StaffLanguageKorean, StaffLanguageItalian, StaffLanguageSpanish, StaffLanguagePortuguese, StaffLanguageFrench, StaffLanguageGerman, StaffLanguageHebrew, StaffLanguageHungarian:
		return true
	}
	return false
}

func (e StaffLanguage) String() string {
	return string(e)
}

func (e *StaffLanguage) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = StaffLanguage(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid StaffLanguage", str)
	}
	return nil
}

func (e StaffLanguage) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Staff sort enums
type StaffSort string

const (
	StaffSortID             StaffSort = "ID"
	StaffSortIDDesc         StaffSort = "ID_DESC"
	StaffSortRole           StaffSort = "ROLE"
	StaffSortRoleDesc       StaffSort = "ROLE_DESC"
	StaffSortLanguage       StaffSort = "LANGUAGE"
	StaffSortLanguageDesc   StaffSort = "LANGUAGE_DESC"
	StaffSortSearchMatch    StaffSort = "SEARCH_MATCH"
	StaffSortFavourites     StaffSort = "FAVOURITES"
	StaffSortFavouritesDesc StaffSort = "FAVOURITES_DESC"
	// Order manually decided by moderators
	StaffSortRelevance StaffSort = "RELEVANCE"
)

var AllStaffSort = []StaffSort{
	StaffSortID,
	StaffSortIDDesc,
	StaffSortRole,
	StaffSortRoleDesc,
	StaffSortLanguage,
	StaffSortLanguageDesc,
	StaffSortSearchMatch,
	StaffSortFavourites,
	StaffSortFavouritesDesc,
	StaffSortRelevance,
}

func (e StaffSort) IsValid() bool {
	switch e {
	case StaffSortID, StaffSortIDDesc, StaffSortRole, StaffSortRoleDesc, StaffSortLanguage, StaffSortLanguageDesc, StaffSortSearchMatch, StaffSortFavourites, StaffSortFavouritesDesc, StaffSortRelevance:
		return true
	}
	return false
}

func (e StaffSort) String() string {
	return string(e)
}

func (e *StaffSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = StaffSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid StaffSort", str)
	}
	return nil
}

func (e StaffSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Studio sort enums
type StudioSort string

const (
	StudioSortID             StudioSort = "ID"
	StudioSortIDDesc         StudioSort = "ID_DESC"
	StudioSortName           StudioSort = "NAME"
	StudioSortNameDesc       StudioSort = "NAME_DESC"
	StudioSortSearchMatch    StudioSort = "SEARCH_MATCH"
	StudioSortFavourites     StudioSort = "FAVOURITES"
	StudioSortFavouritesDesc StudioSort = "FAVOURITES_DESC"
)

var AllStudioSort = []StudioSort{
	StudioSortID,
	StudioSortIDDesc,
	StudioSortName,
	StudioSortNameDesc,
	StudioSortSearchMatch,
	StudioSortFavourites,
	StudioSortFavouritesDesc,
}

func (e StudioSort) IsValid() bool {
	switch e {
	case StudioSortID, StudioSortIDDesc, StudioSortName, StudioSortNameDesc, StudioSortSearchMatch, StudioSortFavourites, StudioSortFavouritesDesc:
		return true
	}
	return false
}

func (e StudioSort) String() string {
	return string(e)
}

func (e *StudioSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = StudioSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid StudioSort", str)
	}
	return nil
}

func (e StudioSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Submission sort enums
type SubmissionSort string

const (
	SubmissionSortID     SubmissionSort = "ID"
	SubmissionSortIDDesc SubmissionSort = "ID_DESC"
)

var AllSubmissionSort = []SubmissionSort{
	SubmissionSortID,
	SubmissionSortIDDesc,
}

func (e SubmissionSort) IsValid() bool {
	switch e {
	case SubmissionSortID, SubmissionSortIDDesc:
		return true
	}
	return false
}

func (e SubmissionSort) String() string {
	return string(e)
}

func (e *SubmissionSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = SubmissionSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid SubmissionSort", str)
	}
	return nil
}

func (e SubmissionSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Submission status
type SubmissionStatus string

const (
	SubmissionStatusPending           SubmissionStatus = "PENDING"
	SubmissionStatusRejected          SubmissionStatus = "REJECTED"
	SubmissionStatusPartiallyAccepted SubmissionStatus = "PARTIALLY_ACCEPTED"
	SubmissionStatusAccepted          SubmissionStatus = "ACCEPTED"
)

var AllSubmissionStatus = []SubmissionStatus{
	SubmissionStatusPending,
	SubmissionStatusRejected,
	SubmissionStatusPartiallyAccepted,
	SubmissionStatusAccepted,
}

func (e SubmissionStatus) IsValid() bool {
	switch e {
	case SubmissionStatusPending, SubmissionStatusRejected, SubmissionStatusPartiallyAccepted, SubmissionStatusAccepted:
		return true
	}
	return false
}

func (e SubmissionStatus) String() string {
	return string(e)
}

func (e *SubmissionStatus) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = SubmissionStatus(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid SubmissionStatus", str)
	}
	return nil
}

func (e SubmissionStatus) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Thread comments sort enums
type ThreadCommentSort string

const (
	ThreadCommentSortID     ThreadCommentSort = "ID"
	ThreadCommentSortIDDesc ThreadCommentSort = "ID_DESC"
)

var AllThreadCommentSort = []ThreadCommentSort{
	ThreadCommentSortID,
	ThreadCommentSortIDDesc,
}

func (e ThreadCommentSort) IsValid() bool {
	switch e {
	case ThreadCommentSortID, ThreadCommentSortIDDesc:
		return true
	}
	return false
}

func (e ThreadCommentSort) String() string {
	return string(e)
}

func (e *ThreadCommentSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ThreadCommentSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ThreadCommentSort", str)
	}
	return nil
}

func (e ThreadCommentSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// Thread sort enums
type ThreadSort string

const (
	ThreadSortID             ThreadSort = "ID"
	ThreadSortIDDesc         ThreadSort = "ID_DESC"
	ThreadSortTitle          ThreadSort = "TITLE"
	ThreadSortTitleDesc      ThreadSort = "TITLE_DESC"
	ThreadSortCreatedAt      ThreadSort = "CREATED_AT"
	ThreadSortCreatedAtDesc  ThreadSort = "CREATED_AT_DESC"
	ThreadSortUpdatedAt      ThreadSort = "UPDATED_AT"
	ThreadSortUpdatedAtDesc  ThreadSort = "UPDATED_AT_DESC"
	ThreadSortRepliedAt      ThreadSort = "REPLIED_AT"
	ThreadSortRepliedAtDesc  ThreadSort = "REPLIED_AT_DESC"
	ThreadSortReplyCount     ThreadSort = "REPLY_COUNT"
	ThreadSortReplyCountDesc ThreadSort = "REPLY_COUNT_DESC"
	ThreadSortViewCount      ThreadSort = "VIEW_COUNT"
	ThreadSortViewCountDesc  ThreadSort = "VIEW_COUNT_DESC"
	ThreadSortIsSticky       ThreadSort = "IS_STICKY"
	ThreadSortSearchMatch    ThreadSort = "SEARCH_MATCH"
)

var AllThreadSort = []ThreadSort{
	ThreadSortID,
	ThreadSortIDDesc,
	ThreadSortTitle,
	ThreadSortTitleDesc,
	ThreadSortCreatedAt,
	ThreadSortCreatedAtDesc,
	ThreadSortUpdatedAt,
	ThreadSortUpdatedAtDesc,
	ThreadSortRepliedAt,
	ThreadSortRepliedAtDesc,
	ThreadSortReplyCount,
	ThreadSortReplyCountDesc,
	ThreadSortViewCount,
	ThreadSortViewCountDesc,
	ThreadSortIsSticky,
	ThreadSortSearchMatch,
}

func (e ThreadSort) IsValid() bool {
	switch e {
	case ThreadSortID, ThreadSortIDDesc, ThreadSortTitle, ThreadSortTitleDesc, ThreadSortCreatedAt, ThreadSortCreatedAtDesc, ThreadSortUpdatedAt, ThreadSortUpdatedAtDesc, ThreadSortRepliedAt, ThreadSortRepliedAtDesc, ThreadSortReplyCount, ThreadSortReplyCountDesc, ThreadSortViewCount, ThreadSortViewCountDesc, ThreadSortIsSticky, ThreadSortSearchMatch:
		return true
	}
	return false
}

func (e ThreadSort) String() string {
	return string(e)
}

func (e *ThreadSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = ThreadSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid ThreadSort", str)
	}
	return nil
}

func (e ThreadSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// User sort enums
type UserSort string

const (
	UserSortID               UserSort = "ID"
	UserSortIDDesc           UserSort = "ID_DESC"
	UserSortUsername         UserSort = "USERNAME"
	UserSortUsernameDesc     UserSort = "USERNAME_DESC"
	UserSortWatchedTime      UserSort = "WATCHED_TIME"
	UserSortWatchedTimeDesc  UserSort = "WATCHED_TIME_DESC"
	UserSortChaptersRead     UserSort = "CHAPTERS_READ"
	UserSortChaptersReadDesc UserSort = "CHAPTERS_READ_DESC"
	UserSortSearchMatch      UserSort = "SEARCH_MATCH"
)

var AllUserSort = []UserSort{
	UserSortID,
	UserSortIDDesc,
	UserSortUsername,
	UserSortUsernameDesc,
	UserSortWatchedTime,
	UserSortWatchedTimeDesc,
	UserSortChaptersRead,
	UserSortChaptersReadDesc,
	UserSortSearchMatch,
}

func (e UserSort) IsValid() bool {
	switch e {
	case UserSortID, UserSortIDDesc, UserSortUsername, UserSortUsernameDesc, UserSortWatchedTime, UserSortWatchedTimeDesc, UserSortChaptersRead, UserSortChaptersReadDesc, UserSortSearchMatch:
		return true
	}
	return false
}

func (e UserSort) String() string {
	return string(e)
}

func (e *UserSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = UserSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid UserSort", str)
	}
	return nil
}

func (e UserSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// The language the user wants to see staff and character names in
type UserStaffNameLanguage string

const (
	// The romanization of the staff or character's native name, with western name ordering
	UserStaffNameLanguageRomajiWestern UserStaffNameLanguage = "ROMAJI_WESTERN"
	// The romanization of the staff or character's native name
	UserStaffNameLanguageRomaji UserStaffNameLanguage = "ROMAJI"
	// The staff or character's name in their native language
	UserStaffNameLanguageNative UserStaffNameLanguage = "NATIVE"
)

var AllUserStaffNameLanguage = []UserStaffNameLanguage{
	UserStaffNameLanguageRomajiWestern,
	UserStaffNameLanguageRomaji,
	UserStaffNameLanguageNative,
}

func (e UserStaffNameLanguage) IsValid() bool {
	switch e {
	case UserStaffNameLanguageRomajiWestern, UserStaffNameLanguageRomaji, UserStaffNameLanguageNative:
		return true
	}
	return false
}

func (e UserStaffNameLanguage) String() string {
	return string(e)
}

func (e *UserStaffNameLanguage) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = UserStaffNameLanguage(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid UserStaffNameLanguage", str)
	}
	return nil
}

func (e UserStaffNameLanguage) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// User statistics sort enum
type UserStatisticsSort string

const (
	UserStatisticsSortID            UserStatisticsSort = "ID"
	UserStatisticsSortIDDesc        UserStatisticsSort = "ID_DESC"
	UserStatisticsSortCount         UserStatisticsSort = "COUNT"
	UserStatisticsSortCountDesc     UserStatisticsSort = "COUNT_DESC"
	UserStatisticsSortProgress      UserStatisticsSort = "PROGRESS"
	UserStatisticsSortProgressDesc  UserStatisticsSort = "PROGRESS_DESC"
	UserStatisticsSortMeanScore     UserStatisticsSort = "MEAN_SCORE"
	UserStatisticsSortMeanScoreDesc UserStatisticsSort = "MEAN_SCORE_DESC"
)

var AllUserStatisticsSort = []UserStatisticsSort{
	UserStatisticsSortID,
	UserStatisticsSortIDDesc,
	UserStatisticsSortCount,
	UserStatisticsSortCountDesc,
	UserStatisticsSortProgress,
	UserStatisticsSortProgressDesc,
	UserStatisticsSortMeanScore,
	UserStatisticsSortMeanScoreDesc,
}

func (e UserStatisticsSort) IsValid() bool {
	switch e {
	case UserStatisticsSortID, UserStatisticsSortIDDesc, UserStatisticsSortCount, UserStatisticsSortCountDesc, UserStatisticsSortProgress, UserStatisticsSortProgressDesc, UserStatisticsSortMeanScore, UserStatisticsSortMeanScoreDesc:
		return true
	}
	return false
}

func (e UserStatisticsSort) String() string {
	return string(e)
}

func (e *UserStatisticsSort) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = UserStatisticsSort(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid UserStatisticsSort", str)
	}
	return nil
}

func (e UserStatisticsSort) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}

// The language the user wants to see media titles in
type UserTitleLanguage string

const (
	// The romanization of the native language title
	UserTitleLanguageRomaji UserTitleLanguage = "ROMAJI"
	// The official english title
	UserTitleLanguageEnglish UserTitleLanguage = "ENGLISH"
	// Official title in it's native language
	UserTitleLanguageNative UserTitleLanguage = "NATIVE"
	// The romanization of the native language title, stylised by media creator
	UserTitleLanguageRomajiStylised UserTitleLanguage = "ROMAJI_STYLISED"
	// The official english title, stylised by media creator
	UserTitleLanguageEnglishStylised UserTitleLanguage = "ENGLISH_STYLISED"
	// Official title in it's native language, stylised by media creator
	UserTitleLanguageNativeStylised UserTitleLanguage = "NATIVE_STYLISED"
)

var AllUserTitleLanguage = []UserTitleLanguage{
	UserTitleLanguageRomaji,
	UserTitleLanguageEnglish,
	UserTitleLanguageNative,
	UserTitleLanguageRomajiStylised,
	UserTitleLanguageEnglishStylised,
	UserTitleLanguageNativeStylised,
}

func (e UserTitleLanguage) IsValid() bool {
	switch e {
	case UserTitleLanguageRomaji, UserTitleLanguageEnglish, UserTitleLanguageNative, UserTitleLanguageRomajiStylised, UserTitleLanguageEnglishStylised, UserTitleLanguageNativeStylised:
		return true
	}
	return false
}

func (e UserTitleLanguage) String() string {
	return string(e)
}

func (e *UserTitleLanguage) UnmarshalGQL(v interface{}) error {
	str, ok := v.(string)
	if !ok {
		return fmt.Errorf("enums must be strings")
	}

	*e = UserTitleLanguage(str)
	if !e.IsValid() {
		return fmt.Errorf("%s is not a valid UserTitleLanguage", str)
	}
	return nil
}

func (e UserTitleLanguage) MarshalGQL(w io.Writer) {
	fmt.Fprint(w, strconv.Quote(e.String()))
}
