// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.

package operations

import (
	"encoding/json"
	"fmt"
	"github.com/LukeHagar/plexgo/internal/utils"
	"github.com/LukeHagar/plexgo/models/components"
	"net/http"
)

type TranscodeSubtitlesGlobals struct {
	// Indicates the client accepts the indicated media types
	Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"`
	// An opaque identifier unique to the client
	ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
	// The name of the client product
	Product *string `header:"style=simple,explode=false,name=X-Plex-Product"`
	// The version of the client application
	Version *string `header:"style=simple,explode=false,name=X-Plex-Version"`
	// The platform of the client
	Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"`
	// The version of the platform
	PlatformVersion *string `header:"style=simple,explode=false,name=X-Plex-Platform-Version"`
	// A relatively friendly name for the client device
	Device *string `header:"style=simple,explode=false,name=X-Plex-Device"`
	// A potentially less friendly identifier for the device model
	Model *string `header:"style=simple,explode=false,name=X-Plex-Model"`
	// The device vendor
	DeviceVendor *string `header:"style=simple,explode=false,name=X-Plex-Device-Vendor"`
	// A friendly name for the client
	DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"`
	// The marketplace on which the client application is distributed
	Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"`
}

func (t TranscodeSubtitlesGlobals) MarshalJSON() ([]byte, error) {
	return utils.MarshalJSON(t, "", false)
}

func (t *TranscodeSubtitlesGlobals) UnmarshalJSON(data []byte) error {
	if err := utils.UnmarshalJSON(data, &t, "", false, nil); err != nil {
		return err
	}
	return nil
}

func (t *TranscodeSubtitlesGlobals) GetAccepts() *components.Accepts {
	if t == nil {
		return nil
	}
	return t.Accepts
}

func (t *TranscodeSubtitlesGlobals) GetClientIdentifier() *string {
	if t == nil {
		return nil
	}
	return t.ClientIdentifier
}

func (t *TranscodeSubtitlesGlobals) GetProduct() *string {
	if t == nil {
		return nil
	}
	return t.Product
}

func (t *TranscodeSubtitlesGlobals) GetVersion() *string {
	if t == nil {
		return nil
	}
	return t.Version
}

func (t *TranscodeSubtitlesGlobals) GetPlatform() *string {
	if t == nil {
		return nil
	}
	return t.Platform
}

func (t *TranscodeSubtitlesGlobals) GetPlatformVersion() *string {
	if t == nil {
		return nil
	}
	return t.PlatformVersion
}

func (t *TranscodeSubtitlesGlobals) GetDevice() *string {
	if t == nil {
		return nil
	}
	return t.Device
}

func (t *TranscodeSubtitlesGlobals) GetModel() *string {
	if t == nil {
		return nil
	}
	return t.Model
}

func (t *TranscodeSubtitlesGlobals) GetDeviceVendor() *string {
	if t == nil {
		return nil
	}
	return t.DeviceVendor
}

func (t *TranscodeSubtitlesGlobals) GetDeviceName() *string {
	if t == nil {
		return nil
	}
	return t.DeviceName
}

func (t *TranscodeSubtitlesGlobals) GetMarketplace() *string {
	if t == nil {
		return nil
	}
	return t.Marketplace
}

// QueryParamLocation - Network type of the client, can be used to help determine target bitrate.
type QueryParamLocation string

const (
	QueryParamLocationLan      QueryParamLocation = "lan"
	QueryParamLocationWan      QueryParamLocation = "wan"
	QueryParamLocationCellular QueryParamLocation = "cellular"
)

func (e QueryParamLocation) ToPointer() *QueryParamLocation {
	return &e
}
func (e *QueryParamLocation) UnmarshalJSON(data []byte) error {
	var v string
	if err := json.Unmarshal(data, &v); err != nil {
		return err
	}
	switch v {
	case "lan":
		fallthrough
	case "wan":
		fallthrough
	case "cellular":
		*e = QueryParamLocation(v)
		return nil
	default:
		return fmt.Errorf("invalid value for QueryParamLocation: %v", v)
	}
}

// QueryParamProtocol - Indicates the network streaming protocol to be used for the transcode session: * 'http' - include the file in the http response such as MKV streaming * 'hls' - hls stream (RFC 8216) * 'dash' - dash stream (ISO/IEC 23009-1:2022)
type QueryParamProtocol string

const (
	QueryParamProtocolHTTP QueryParamProtocol = "http"
	QueryParamProtocolHls  QueryParamProtocol = "hls"
	QueryParamProtocolDash QueryParamProtocol = "dash"
)

func (e QueryParamProtocol) ToPointer() *QueryParamProtocol {
	return &e
}
func (e *QueryParamProtocol) UnmarshalJSON(data []byte) error {
	var v string
	if err := json.Unmarshal(data, &v); err != nil {
		return err
	}
	switch v {
	case "http":
		fallthrough
	case "hls":
		fallthrough
	case "dash":
		*e = QueryParamProtocol(v)
		return nil
	default:
		return fmt.Errorf("invalid value for QueryParamProtocol: %v", v)
	}
}

// QueryParamSubtitles - Indicates how subtitles should be included: * 'auto' - Compute the appropriate subtitle setting automatically * 'burn' - Burn the selected subtitle; auto if no selected subtitle * 'none' - Ignore all subtitle streams * 'sidecar' - The selected subtitle should be provided as a sidecar * 'embedded' - The selected subtitle should be provided as an embedded stream * 'segmented' - The selected subtitle should be provided as a segmented stream
type QueryParamSubtitles string

const (
	QueryParamSubtitlesAuto      QueryParamSubtitles = "auto"
	QueryParamSubtitlesBurn      QueryParamSubtitles = "burn"
	QueryParamSubtitlesNone      QueryParamSubtitles = "none"
	QueryParamSubtitlesSidecar   QueryParamSubtitles = "sidecar"
	QueryParamSubtitlesEmbedded  QueryParamSubtitles = "embedded"
	QueryParamSubtitlesSegmented QueryParamSubtitles = "segmented"
	QueryParamSubtitlesUnknown   QueryParamSubtitles = "unknown"
)

func (e QueryParamSubtitles) ToPointer() *QueryParamSubtitles {
	return &e
}
func (e *QueryParamSubtitles) UnmarshalJSON(data []byte) error {
	var v string
	if err := json.Unmarshal(data, &v); err != nil {
		return err
	}
	switch v {
	case "auto":
		fallthrough
	case "burn":
		fallthrough
	case "none":
		fallthrough
	case "sidecar":
		fallthrough
	case "embedded":
		fallthrough
	case "segmented":
		fallthrough
	case "unknown":
		*e = QueryParamSubtitles(v)
		return nil
	default:
		return fmt.Errorf("invalid value for QueryParamSubtitles: %v", v)
	}
}

type TranscodeSubtitlesRequest struct {
	// Indicates the client accepts the indicated media types
	Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"`
	// An opaque identifier unique to the client
	ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
	// The name of the client product
	Product *string `header:"style=simple,explode=false,name=X-Plex-Product"`
	// The version of the client application
	Version *string `header:"style=simple,explode=false,name=X-Plex-Version"`
	// The platform of the client
	Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"`
	// The version of the platform
	PlatformVersion *string `header:"style=simple,explode=false,name=X-Plex-Platform-Version"`
	// A relatively friendly name for the client device
	Device *string `header:"style=simple,explode=false,name=X-Plex-Device"`
	// A potentially less friendly identifier for the device model
	Model *string `header:"style=simple,explode=false,name=X-Plex-Model"`
	// The device vendor
	DeviceVendor *string `header:"style=simple,explode=false,name=X-Plex-Device-Vendor"`
	// A friendly name for the client
	DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"`
	// The marketplace on which the client application is distributed
	Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"`
	// Type of transcode media
	TranscodeType components.TranscodeType `pathParam:"style=simple,explode=false,name=transcodeType"`
	// Transcode session UUID
	TranscodeSessionID *string `queryParam:"style=form,explode=true,name=transcodeSessionId"`
	// Indicates how incompatible advanced subtitles (such as ass/ssa) should be included: * 'burn' - Burn incompatible advanced text subtitles into the video stream * 'text' - Transcode incompatible advanced text subtitles to a compatible text format, even if some markup is lost
	//
	AdvancedSubtitles *components.AdvancedSubtitles `queryParam:"style=form,explode=true,name=advancedSubtitles"`
	// Percentage of original audio loudness to use when transcoding (100 is equivalent to original volume, 50 is half, 200 is double, etc)
	AudioBoost *int64 `queryParam:"style=form,explode=true,name=audioBoost"`
	// Target video number of audio channels.
	AudioChannelCount *int64 `queryParam:"style=form,explode=true,name=audioChannelCount"`
	// Indicates the client supports ABR.
	AutoAdjustQuality *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustQuality"`
	// Indicates if the server should adjust subtitles based on Voice Activity Data.
	AutoAdjustSubtitle *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustSubtitle"`
	// Indicates the client supports direct playing the indicated content.
	DirectPlay *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directPlay"`
	// Indicates the client supports direct streaming the video of the indicated content.
	DirectStream *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStream"`
	// Indicates the client supports direct streaming the audio of the indicated content.
	DirectStreamAudio *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStreamAudio"`
	// Indicates if resolution should be adjusted for orientation.
	DisableResolutionRotation *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=disableResolutionRotation"`
	// Ignore client profiles when determining if direct play is possible. Only has an effect when directPlay=1 and both mediaIndex and partIndex are specified and neither are -1
	HasMDE *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=hasMDE"`
	// Network type of the client, can be used to help determine target bitrate.
	Location *QueryParamLocation `queryParam:"style=form,explode=true,name=location"`
	// Buffer size used in playback (in KB). Clients should specify a lower bound if not known exactly. This value could make the difference between transcoding and direct play on bandwidth constrained networks.
	MediaBufferSize *int64 `queryParam:"style=form,explode=true,name=mediaBufferSize"`
	// Index of the media to transcode. -1 or not specified indicates let the server choose.
	MediaIndex *int64 `queryParam:"style=form,explode=true,name=mediaIndex"`
	// Target bitrate for audio only files (in kbps, used to transcode).
	MusicBitrate *int64 `queryParam:"style=form,explode=true,name=musicBitrate"`
	// Offset from the start of the media (in seconds).
	Offset *float64 `queryParam:"style=form,explode=true,name=offset"`
	// Index of the part to transcode. -1 or not specified indicates the server should join parts together in a transcode
	PartIndex *int64 `queryParam:"style=form,explode=true,name=partIndex"`
	// Internal PMS path of the media to transcode.
	Path *string `queryParam:"style=form,explode=true,name=path"`
	// Maximum bitrate (in kbps) to use in ABR.
	PeakBitrate *int64 `queryParam:"style=form,explode=true,name=peakBitrate"`
	// Target photo resolution.
	PhotoResolution *string `queryParam:"style=form,explode=true,name=photoResolution"`
	// Indicates the network streaming protocol to be used for the transcode session: * 'http' - include the file in the http response such as MKV streaming * 'hls' - hls stream (RFC 8216) * 'dash' - dash stream (ISO/IEC 23009-1:2022)
	//
	Protocol *QueryParamProtocol `queryParam:"style=form,explode=true,name=protocol"`
	// Number of seconds to include in each transcoded segment
	SecondsPerSegment *int64 `queryParam:"style=form,explode=true,name=secondsPerSegment"`
	// Percentage of original subtitle size to use when burning subtitles (100 is equivalent to original size, 50 is half, ect)
	SubtitleSize *int64 `queryParam:"style=form,explode=true,name=subtitleSize"`
	// Indicates how subtitles should be included: * 'auto' - Compute the appropriate subtitle setting automatically * 'burn' - Burn the selected subtitle; auto if no selected subtitle * 'none' - Ignore all subtitle streams * 'sidecar' - The selected subtitle should be provided as a sidecar * 'embedded' - The selected subtitle should be provided as an embedded stream * 'segmented' - The selected subtitle should be provided as a segmented stream
	//
	Subtitles *QueryParamSubtitles `queryParam:"style=form,explode=true,name=subtitles"`
	// Target video bitrate (in kbps).
	VideoBitrate *int64 `queryParam:"style=form,explode=true,name=videoBitrate"`
	// Target photo quality.
	VideoQuality *int64 `queryParam:"style=form,explode=true,name=videoQuality"`
	// Target maximum video resolution.
	VideoResolution *string `queryParam:"style=form,explode=true,name=videoResolution"`
	// See [Profile Augmentations](#section/API-Info/Profile-Augmentations) .
	XPlexClientProfileExtra *string `header:"style=simple,explode=false,name=X-Plex-Client-Profile-Extra"`
	// Which built in Client Profile to use in the decision. Generally should only be used to specify the Generic profile.
	XPlexClientProfileName *string `header:"style=simple,explode=false,name=X-Plex-Client-Profile-Name"`
	// Unique per client playback session.  Used if a client can playback multiple items at a time (such as a browser with multiple tabs)
	XPlexSessionIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Session-Identifier"`
}

func (t TranscodeSubtitlesRequest) MarshalJSON() ([]byte, error) {
	return utils.MarshalJSON(t, "", false)
}

func (t *TranscodeSubtitlesRequest) UnmarshalJSON(data []byte) error {
	if err := utils.UnmarshalJSON(data, &t, "", false, []string{"transcodeType"}); err != nil {
		return err
	}
	return nil
}

func (t *TranscodeSubtitlesRequest) GetAccepts() *components.Accepts {
	if t == nil {
		return nil
	}
	return t.Accepts
}

func (t *TranscodeSubtitlesRequest) GetClientIdentifier() *string {
	if t == nil {
		return nil
	}
	return t.ClientIdentifier
}

func (t *TranscodeSubtitlesRequest) GetProduct() *string {
	if t == nil {
		return nil
	}
	return t.Product
}

func (t *TranscodeSubtitlesRequest) GetVersion() *string {
	if t == nil {
		return nil
	}
	return t.Version
}

func (t *TranscodeSubtitlesRequest) GetPlatform() *string {
	if t == nil {
		return nil
	}
	return t.Platform
}

func (t *TranscodeSubtitlesRequest) GetPlatformVersion() *string {
	if t == nil {
		return nil
	}
	return t.PlatformVersion
}

func (t *TranscodeSubtitlesRequest) GetDevice() *string {
	if t == nil {
		return nil
	}
	return t.Device
}

func (t *TranscodeSubtitlesRequest) GetModel() *string {
	if t == nil {
		return nil
	}
	return t.Model
}

func (t *TranscodeSubtitlesRequest) GetDeviceVendor() *string {
	if t == nil {
		return nil
	}
	return t.DeviceVendor
}

func (t *TranscodeSubtitlesRequest) GetDeviceName() *string {
	if t == nil {
		return nil
	}
	return t.DeviceName
}

func (t *TranscodeSubtitlesRequest) GetMarketplace() *string {
	if t == nil {
		return nil
	}
	return t.Marketplace
}

func (t *TranscodeSubtitlesRequest) GetTranscodeType() components.TranscodeType {
	if t == nil {
		return components.TranscodeType("")
	}
	return t.TranscodeType
}

func (t *TranscodeSubtitlesRequest) GetTranscodeSessionID() *string {
	if t == nil {
		return nil
	}
	return t.TranscodeSessionID
}

func (t *TranscodeSubtitlesRequest) GetAdvancedSubtitles() *components.AdvancedSubtitles {
	if t == nil {
		return nil
	}
	return t.AdvancedSubtitles
}

func (t *TranscodeSubtitlesRequest) GetAudioBoost() *int64 {
	if t == nil {
		return nil
	}
	return t.AudioBoost
}

func (t *TranscodeSubtitlesRequest) GetAudioChannelCount() *int64 {
	if t == nil {
		return nil
	}
	return t.AudioChannelCount
}

func (t *TranscodeSubtitlesRequest) GetAutoAdjustQuality() *components.BoolInt {
	if t == nil {
		return nil
	}
	return t.AutoAdjustQuality
}

func (t *TranscodeSubtitlesRequest) GetAutoAdjustSubtitle() *components.BoolInt {
	if t == nil {
		return nil
	}
	return t.AutoAdjustSubtitle
}

func (t *TranscodeSubtitlesRequest) GetDirectPlay() *components.BoolInt {
	if t == nil {
		return nil
	}
	return t.DirectPlay
}

func (t *TranscodeSubtitlesRequest) GetDirectStream() *components.BoolInt {
	if t == nil {
		return nil
	}
	return t.DirectStream
}

func (t *TranscodeSubtitlesRequest) GetDirectStreamAudio() *components.BoolInt {
	if t == nil {
		return nil
	}
	return t.DirectStreamAudio
}

func (t *TranscodeSubtitlesRequest) GetDisableResolutionRotation() *components.BoolInt {
	if t == nil {
		return nil
	}
	return t.DisableResolutionRotation
}

func (t *TranscodeSubtitlesRequest) GetHasMDE() *components.BoolInt {
	if t == nil {
		return nil
	}
	return t.HasMDE
}

func (t *TranscodeSubtitlesRequest) GetLocation() *QueryParamLocation {
	if t == nil {
		return nil
	}
	return t.Location
}

func (t *TranscodeSubtitlesRequest) GetMediaBufferSize() *int64 {
	if t == nil {
		return nil
	}
	return t.MediaBufferSize
}

func (t *TranscodeSubtitlesRequest) GetMediaIndex() *int64 {
	if t == nil {
		return nil
	}
	return t.MediaIndex
}

func (t *TranscodeSubtitlesRequest) GetMusicBitrate() *int64 {
	if t == nil {
		return nil
	}
	return t.MusicBitrate
}

func (t *TranscodeSubtitlesRequest) GetOffset() *float64 {
	if t == nil {
		return nil
	}
	return t.Offset
}

func (t *TranscodeSubtitlesRequest) GetPartIndex() *int64 {
	if t == nil {
		return nil
	}
	return t.PartIndex
}

func (t *TranscodeSubtitlesRequest) GetPath() *string {
	if t == nil {
		return nil
	}
	return t.Path
}

func (t *TranscodeSubtitlesRequest) GetPeakBitrate() *int64 {
	if t == nil {
		return nil
	}
	return t.PeakBitrate
}

func (t *TranscodeSubtitlesRequest) GetPhotoResolution() *string {
	if t == nil {
		return nil
	}
	return t.PhotoResolution
}

func (t *TranscodeSubtitlesRequest) GetProtocol() *QueryParamProtocol {
	if t == nil {
		return nil
	}
	return t.Protocol
}

func (t *TranscodeSubtitlesRequest) GetSecondsPerSegment() *int64 {
	if t == nil {
		return nil
	}
	return t.SecondsPerSegment
}

func (t *TranscodeSubtitlesRequest) GetSubtitleSize() *int64 {
	if t == nil {
		return nil
	}
	return t.SubtitleSize
}

func (t *TranscodeSubtitlesRequest) GetSubtitles() *QueryParamSubtitles {
	if t == nil {
		return nil
	}
	return t.Subtitles
}

func (t *TranscodeSubtitlesRequest) GetVideoBitrate() *int64 {
	if t == nil {
		return nil
	}
	return t.VideoBitrate
}

func (t *TranscodeSubtitlesRequest) GetVideoQuality() *int64 {
	if t == nil {
		return nil
	}
	return t.VideoQuality
}

func (t *TranscodeSubtitlesRequest) GetVideoResolution() *string {
	if t == nil {
		return nil
	}
	return t.VideoResolution
}

func (t *TranscodeSubtitlesRequest) GetXPlexClientProfileExtra() *string {
	if t == nil {
		return nil
	}
	return t.XPlexClientProfileExtra
}

func (t *TranscodeSubtitlesRequest) GetXPlexClientProfileName() *string {
	if t == nil {
		return nil
	}
	return t.XPlexClientProfileName
}

func (t *TranscodeSubtitlesRequest) GetXPlexSessionIdentifier() *string {
	if t == nil {
		return nil
	}
	return t.XPlexSessionIdentifier
}

type TranscodeSubtitlesResponse struct {
	// HTTP response content type for this operation
	ContentType string
	// HTTP response status code for this operation
	StatusCode int
	// Raw HTTP response; suitable for custom response parsing
	RawResponse *http.Response
}

func (t *TranscodeSubtitlesResponse) GetContentType() string {
	if t == nil {
		return ""
	}
	return t.ContentType
}

func (t *TranscodeSubtitlesResponse) GetStatusCode() int {
	if t == nil {
		return 0
	}
	return t.StatusCode
}

func (t *TranscodeSubtitlesResponse) GetRawResponse() *http.Response {
	if t == nil {
		return nil
	}
	return t.RawResponse
}
