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

import * as z from "zod";
import { remap as remap$ } from "../../../lib/primitives.js";
import { safeParse } from "../../../lib/schemas.js";
import { Result as SafeParseResult } from "../../types/fp.js";
import { SDKValidationError } from "../errors/sdkvalidationerror.js";

export const GetTokenDetailsServerList = [
  "https://plex.tv/api/v2",
] as const;

/**
 * Your current mailing list status (active or unsubscribed)
 */
export enum MailingListStatus {
  Active = "active",
  Unsubscribed = "unsubscribed",
}

/**
 * The auto-select subtitle mode (0 = Manually selected, 1 = Shown with foreign audio, 2 = Always enabled)
 */
export enum AutoSelectSubtitle {
  Disable = 0,
  Enable = 1,
}

/**
 * The subtitles for the deaf or hard-of-hearing (SDH) searches mode (0 = Prefer non-SDH subtitles, 1 = Prefer SDH subtitles, 2 = Only show SDH subtitles, 3 = Only show non-SDH subtitles)
 */
export enum DefaultSubtitleAccessibility {
  Disable = 0,
  Enable = 1,
}

/**
 * The forced subtitles searches mode (0 = Prefer non-forced subtitles, 1 = Prefer forced subtitles, 2 = Only show forced subtitles, 3 = Only show non-forced subtitles)
 */
export enum DefaultSubtitleForced {
  Disable = 0,
  Enable = 1,
}

/**
 * Whether or not media watched indicators are enabled (little orange dot on media)
 */
export enum WatchedIndicator {
  Disable = 0,
  Enable = 1,
}

/**
 * Whether or not the account has media reviews visibility enabled
 */
export enum MediaReviewsVisibility {
  Disable = 0,
  Enable = 1,
}

export type UserProfile = {
  /**
   * If the account has automatically select audio and subtitle tracks enabled
   */
  autoSelectAudio?: boolean | undefined;
  /**
   * The preferred audio language for the account
   */
  defaultAudioLanguage: string | null;
  /**
   * The preferred subtitle language for the account
   */
  defaultSubtitleLanguage: string | null;
  autoSelectSubtitle?: AutoSelectSubtitle | undefined;
  defaultSubtitleAccessibility?: DefaultSubtitleAccessibility | undefined;
  defaultSubtitleForced?: DefaultSubtitleForced | undefined;
  watchedIndicator?: WatchedIndicator | undefined;
  mediaReviewsVisibility?: MediaReviewsVisibility | undefined;
};

export enum GetTokenDetailsStatus {
  Online = "online",
  Offline = "offline",
}

export type Services = {
  identifier: string;
  endpoint: string;
  token: string | null;
  secret: string | null;
  status: GetTokenDetailsStatus;
};

/**
 * String representation of subscriptionActive
 */
export enum GetTokenDetailsAuthenticationStatus {
  Inactive = "Inactive",
  Active = "Active",
}

/**
 * If the account’s Plex Pass subscription is active
 */
export type Subscription = {
  /**
   * List of features allowed on your Plex Pass subscription
   */
  features?: Array<string> | undefined;
  /**
   * If the account's Plex Pass subscription is active
   */
  active?: boolean | undefined;
  /**
   * Date the account subscribed to Plex Pass
   */
  subscribedAt?: string | null | undefined;
  /**
   * String representation of subscriptionActive
   */
  status?: GetTokenDetailsAuthenticationStatus | undefined;
  /**
   * Payment service used for your Plex Pass subscription
   */
  paymentService?: string | null | undefined;
  /**
   * Name of Plex Pass subscription plan
   */
  plan?: string | null | undefined;
};

/**
 * String representation of subscriptionActive
 */
export enum GetTokenDetailsAuthenticationResponseStatus {
  Inactive = "Inactive",
  Active = "Active",
}

export type GetTokenDetailsSubscription = {
  /**
   * List of features allowed on your Plex Pass subscription
   */
  features?: Array<string> | undefined;
  /**
   * If the account's Plex Pass subscription is active
   */
  active?: boolean | undefined;
  /**
   * Date the account subscribed to Plex Pass
   */
  subscribedAt?: string | null | undefined;
  /**
   * String representation of subscriptionActive
   */
  status?: GetTokenDetailsAuthenticationResponseStatus | undefined;
  /**
   * Payment service used for your Plex Pass subscription
   */
  paymentService?: string | null | undefined;
  /**
   * Name of Plex Pass subscription plan
   */
  plan?: string | null | undefined;
};

/**
 * Logged in user details
 */
export type GetTokenDetailsUserPlexAccount = {
  /**
   * Unknown
   */
  adsConsent: boolean | null;
  adsConsentReminderAt: number | null;
  adsConsentSetAt: number | null;
  /**
   * Unknown
   */
  anonymous?: boolean | null | undefined;
  /**
   * The account token
   */
  authToken: string;
  /**
   * If the two-factor authentication backup codes have been created
   */
  backupCodesCreated?: boolean | undefined;
  /**
   * If the account has been confirmed
   */
  confirmed?: boolean | undefined;
  /**
   * The account country
   */
  country: string;
  /**
   * The account email address
   */
  email: string;
  /**
   * If login with email only is enabled
   */
  emailOnlyAuth?: boolean | undefined;
  /**
   * If experimental features are enabled
   */
  experimentalFeatures?: boolean | undefined;
  /**
   * Your account full name
   */
  friendlyName: string;
  /**
   * List of devices your allowed to use with this account
   */
  entitlements: Array<string>;
  /**
   * If the account is a Plex Home guest user
   */
  guest?: boolean | undefined;
  /**
   * If the account has a password
   */
  hasPassword?: boolean | undefined;
  /**
   * If the account is a Plex Home user
   */
  home?: boolean | undefined;
  /**
   * If the account is the Plex Home admin
   */
  homeAdmin?: boolean | undefined;
  /**
   * The number of accounts in the Plex Home
   */
  homeSize: number;
  /**
   * The Plex account ID
   */
  id: number;
  /**
   * Unix epoch datetime in seconds
   */
  joinedAt: number;
  /**
   * The account locale
   */
  locale: string | null;
  /**
   * If you are subscribed to the Plex newsletter
   */
  mailingListActive?: boolean | undefined;
  /**
   * Your current mailing list status (active or unsubscribed)
   */
  mailingListStatus: MailingListStatus;
  /**
   * The maximum number of accounts allowed in the Plex Home
   */
  maxHomeSize: number;
  /**
   * [Might be removed] The hashed Plex Home PIN
   *
   * @deprecated field: This will be removed in a future release, please migrate away from it as soon as possible.
   */
  pin?: string | undefined;
  profile: UserProfile;
  /**
   * If the account has a Plex Home PIN enabled
   */
  protected?: boolean | undefined;
  /**
   * Unix epoch datetime in seconds
   */
  rememberExpiresAt: number;
  /**
   * If the account is a Plex Home managed user
   */
  restricted?: boolean | undefined;
  /**
   * [Might be removed] List of account roles. Plexpass membership listed here
   */
  roles?: Array<string> | undefined;
  /**
   * Unknown
   */
  scrobbleTypes: string;
  services: Array<Services>;
  /**
   * If the account’s Plex Pass subscription is active
   */
  subscription: Subscription;
  /**
   * Description of the Plex Pass subscription
   */
  subscriptionDescription: string | null;
  subscriptions: Array<GetTokenDetailsSubscription>;
  /**
   * URL of the account thumbnail
   */
  thumb: string;
  /**
   * The title of the account (username or friendly name)
   */
  title: string;
  /**
   * If two-factor authentication is enabled
   */
  twoFactorEnabled?: boolean | undefined;
  /**
   * The account username
   */
  username: string;
  /**
   * The account UUID
   */
  uuid: string;
  attributionPartner: string | null;
};

export type GetTokenDetailsResponse = {
  /**
   * HTTP response content type for this operation
   */
  contentType: string;
  /**
   * HTTP response status code for this operation
   */
  statusCode: number;
  /**
   * Raw HTTP response; suitable for custom response parsing
   */
  rawResponse: Response;
  /**
   * Logged in user details
   */
  userPlexAccount?: GetTokenDetailsUserPlexAccount | undefined;
};

/** @internal */
export const MailingListStatus$inboundSchema: z.ZodNativeEnum<
  typeof MailingListStatus
> = z.nativeEnum(MailingListStatus);

/** @internal */
export const MailingListStatus$outboundSchema: z.ZodNativeEnum<
  typeof MailingListStatus
> = MailingListStatus$inboundSchema;

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace MailingListStatus$ {
  /** @deprecated use `MailingListStatus$inboundSchema` instead. */
  export const inboundSchema = MailingListStatus$inboundSchema;
  /** @deprecated use `MailingListStatus$outboundSchema` instead. */
  export const outboundSchema = MailingListStatus$outboundSchema;
}

/** @internal */
export const AutoSelectSubtitle$inboundSchema: z.ZodNativeEnum<
  typeof AutoSelectSubtitle
> = z.nativeEnum(AutoSelectSubtitle);

/** @internal */
export const AutoSelectSubtitle$outboundSchema: z.ZodNativeEnum<
  typeof AutoSelectSubtitle
> = AutoSelectSubtitle$inboundSchema;

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace AutoSelectSubtitle$ {
  /** @deprecated use `AutoSelectSubtitle$inboundSchema` instead. */
  export const inboundSchema = AutoSelectSubtitle$inboundSchema;
  /** @deprecated use `AutoSelectSubtitle$outboundSchema` instead. */
  export const outboundSchema = AutoSelectSubtitle$outboundSchema;
}

/** @internal */
export const DefaultSubtitleAccessibility$inboundSchema: z.ZodNativeEnum<
  typeof DefaultSubtitleAccessibility
> = z.nativeEnum(DefaultSubtitleAccessibility);

/** @internal */
export const DefaultSubtitleAccessibility$outboundSchema: z.ZodNativeEnum<
  typeof DefaultSubtitleAccessibility
> = DefaultSubtitleAccessibility$inboundSchema;

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace DefaultSubtitleAccessibility$ {
  /** @deprecated use `DefaultSubtitleAccessibility$inboundSchema` instead. */
  export const inboundSchema = DefaultSubtitleAccessibility$inboundSchema;
  /** @deprecated use `DefaultSubtitleAccessibility$outboundSchema` instead. */
  export const outboundSchema = DefaultSubtitleAccessibility$outboundSchema;
}

/** @internal */
export const DefaultSubtitleForced$inboundSchema: z.ZodNativeEnum<
  typeof DefaultSubtitleForced
> = z.nativeEnum(DefaultSubtitleForced);

/** @internal */
export const DefaultSubtitleForced$outboundSchema: z.ZodNativeEnum<
  typeof DefaultSubtitleForced
> = DefaultSubtitleForced$inboundSchema;

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace DefaultSubtitleForced$ {
  /** @deprecated use `DefaultSubtitleForced$inboundSchema` instead. */
  export const inboundSchema = DefaultSubtitleForced$inboundSchema;
  /** @deprecated use `DefaultSubtitleForced$outboundSchema` instead. */
  export const outboundSchema = DefaultSubtitleForced$outboundSchema;
}

/** @internal */
export const WatchedIndicator$inboundSchema: z.ZodNativeEnum<
  typeof WatchedIndicator
> = z.nativeEnum(WatchedIndicator);

/** @internal */
export const WatchedIndicator$outboundSchema: z.ZodNativeEnum<
  typeof WatchedIndicator
> = WatchedIndicator$inboundSchema;

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace WatchedIndicator$ {
  /** @deprecated use `WatchedIndicator$inboundSchema` instead. */
  export const inboundSchema = WatchedIndicator$inboundSchema;
  /** @deprecated use `WatchedIndicator$outboundSchema` instead. */
  export const outboundSchema = WatchedIndicator$outboundSchema;
}

/** @internal */
export const MediaReviewsVisibility$inboundSchema: z.ZodNativeEnum<
  typeof MediaReviewsVisibility
> = z.nativeEnum(MediaReviewsVisibility);

/** @internal */
export const MediaReviewsVisibility$outboundSchema: z.ZodNativeEnum<
  typeof MediaReviewsVisibility
> = MediaReviewsVisibility$inboundSchema;

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace MediaReviewsVisibility$ {
  /** @deprecated use `MediaReviewsVisibility$inboundSchema` instead. */
  export const inboundSchema = MediaReviewsVisibility$inboundSchema;
  /** @deprecated use `MediaReviewsVisibility$outboundSchema` instead. */
  export const outboundSchema = MediaReviewsVisibility$outboundSchema;
}

/** @internal */
export const UserProfile$inboundSchema: z.ZodType<
  UserProfile,
  z.ZodTypeDef,
  unknown
> = z.object({
  autoSelectAudio: z.boolean().default(true),
  defaultAudioLanguage: z.nullable(z.string()),
  defaultSubtitleLanguage: z.nullable(z.string()),
  autoSelectSubtitle: AutoSelectSubtitle$inboundSchema,
  defaultSubtitleAccessibility: DefaultSubtitleAccessibility$inboundSchema,
  defaultSubtitleForced: DefaultSubtitleForced$inboundSchema,
  watchedIndicator: WatchedIndicator$inboundSchema,
  mediaReviewsVisibility: MediaReviewsVisibility$inboundSchema,
});

/** @internal */
export type UserProfile$Outbound = {
  autoSelectAudio: boolean;
  defaultAudioLanguage: string | null;
  defaultSubtitleLanguage: string | null;
  autoSelectSubtitle: number;
  defaultSubtitleAccessibility: number;
  defaultSubtitleForced: number;
  watchedIndicator: number;
  mediaReviewsVisibility: number;
};

/** @internal */
export const UserProfile$outboundSchema: z.ZodType<
  UserProfile$Outbound,
  z.ZodTypeDef,
  UserProfile
> = z.object({
  autoSelectAudio: z.boolean().default(true),
  defaultAudioLanguage: z.nullable(z.string()),
  defaultSubtitleLanguage: z.nullable(z.string()),
  autoSelectSubtitle: AutoSelectSubtitle$outboundSchema.default(
    AutoSelectSubtitle.Disable,
  ),
  defaultSubtitleAccessibility: DefaultSubtitleAccessibility$outboundSchema
    .default(DefaultSubtitleAccessibility.Disable),
  defaultSubtitleForced: DefaultSubtitleForced$outboundSchema.default(
    DefaultSubtitleForced.Disable,
  ),
  watchedIndicator: WatchedIndicator$outboundSchema.default(
    WatchedIndicator.Disable,
  ),
  mediaReviewsVisibility: MediaReviewsVisibility$outboundSchema.default(
    MediaReviewsVisibility.Disable,
  ),
});

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace UserProfile$ {
  /** @deprecated use `UserProfile$inboundSchema` instead. */
  export const inboundSchema = UserProfile$inboundSchema;
  /** @deprecated use `UserProfile$outboundSchema` instead. */
  export const outboundSchema = UserProfile$outboundSchema;
  /** @deprecated use `UserProfile$Outbound` instead. */
  export type Outbound = UserProfile$Outbound;
}

export function userProfileToJSON(userProfile: UserProfile): string {
  return JSON.stringify(UserProfile$outboundSchema.parse(userProfile));
}

export function userProfileFromJSON(
  jsonString: string,
): SafeParseResult<UserProfile, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => UserProfile$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'UserProfile' from JSON`,
  );
}

/** @internal */
export const GetTokenDetailsStatus$inboundSchema: z.ZodNativeEnum<
  typeof GetTokenDetailsStatus
> = z.nativeEnum(GetTokenDetailsStatus);

/** @internal */
export const GetTokenDetailsStatus$outboundSchema: z.ZodNativeEnum<
  typeof GetTokenDetailsStatus
> = GetTokenDetailsStatus$inboundSchema;

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace GetTokenDetailsStatus$ {
  /** @deprecated use `GetTokenDetailsStatus$inboundSchema` instead. */
  export const inboundSchema = GetTokenDetailsStatus$inboundSchema;
  /** @deprecated use `GetTokenDetailsStatus$outboundSchema` instead. */
  export const outboundSchema = GetTokenDetailsStatus$outboundSchema;
}

/** @internal */
export const Services$inboundSchema: z.ZodType<
  Services,
  z.ZodTypeDef,
  unknown
> = z.object({
  identifier: z.string(),
  endpoint: z.string(),
  token: z.nullable(z.string()),
  secret: z.nullable(z.string()),
  status: GetTokenDetailsStatus$inboundSchema,
});

/** @internal */
export type Services$Outbound = {
  identifier: string;
  endpoint: string;
  token: string | null;
  secret: string | null;
  status: string;
};

/** @internal */
export const Services$outboundSchema: z.ZodType<
  Services$Outbound,
  z.ZodTypeDef,
  Services
> = z.object({
  identifier: z.string(),
  endpoint: z.string(),
  token: z.nullable(z.string()),
  secret: z.nullable(z.string()),
  status: GetTokenDetailsStatus$outboundSchema,
});

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace Services$ {
  /** @deprecated use `Services$inboundSchema` instead. */
  export const inboundSchema = Services$inboundSchema;
  /** @deprecated use `Services$outboundSchema` instead. */
  export const outboundSchema = Services$outboundSchema;
  /** @deprecated use `Services$Outbound` instead. */
  export type Outbound = Services$Outbound;
}

export function servicesToJSON(services: Services): string {
  return JSON.stringify(Services$outboundSchema.parse(services));
}

export function servicesFromJSON(
  jsonString: string,
): SafeParseResult<Services, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => Services$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'Services' from JSON`,
  );
}

/** @internal */
export const GetTokenDetailsAuthenticationStatus$inboundSchema: z.ZodNativeEnum<
  typeof GetTokenDetailsAuthenticationStatus
> = z.nativeEnum(GetTokenDetailsAuthenticationStatus);

/** @internal */
export const GetTokenDetailsAuthenticationStatus$outboundSchema:
  z.ZodNativeEnum<typeof GetTokenDetailsAuthenticationStatus> =
    GetTokenDetailsAuthenticationStatus$inboundSchema;

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace GetTokenDetailsAuthenticationStatus$ {
  /** @deprecated use `GetTokenDetailsAuthenticationStatus$inboundSchema` instead. */
  export const inboundSchema =
    GetTokenDetailsAuthenticationStatus$inboundSchema;
  /** @deprecated use `GetTokenDetailsAuthenticationStatus$outboundSchema` instead. */
  export const outboundSchema =
    GetTokenDetailsAuthenticationStatus$outboundSchema;
}

/** @internal */
export const Subscription$inboundSchema: z.ZodType<
  Subscription,
  z.ZodTypeDef,
  unknown
> = z.object({
  features: z.array(z.string()).optional(),
  active: z.boolean().optional(),
  subscribedAt: z.nullable(z.string()).optional(),
  status: GetTokenDetailsAuthenticationStatus$inboundSchema.optional(),
  paymentService: z.nullable(z.string()).optional(),
  plan: z.nullable(z.string()).optional(),
});

/** @internal */
export type Subscription$Outbound = {
  features?: Array<string> | undefined;
  active?: boolean | undefined;
  subscribedAt?: string | null | undefined;
  status?: string | undefined;
  paymentService?: string | null | undefined;
  plan?: string | null | undefined;
};

/** @internal */
export const Subscription$outboundSchema: z.ZodType<
  Subscription$Outbound,
  z.ZodTypeDef,
  Subscription
> = z.object({
  features: z.array(z.string()).optional(),
  active: z.boolean().optional(),
  subscribedAt: z.nullable(z.string()).optional(),
  status: GetTokenDetailsAuthenticationStatus$outboundSchema.optional(),
  paymentService: z.nullable(z.string()).optional(),
  plan: z.nullable(z.string()).optional(),
});

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace Subscription$ {
  /** @deprecated use `Subscription$inboundSchema` instead. */
  export const inboundSchema = Subscription$inboundSchema;
  /** @deprecated use `Subscription$outboundSchema` instead. */
  export const outboundSchema = Subscription$outboundSchema;
  /** @deprecated use `Subscription$Outbound` instead. */
  export type Outbound = Subscription$Outbound;
}

export function subscriptionToJSON(subscription: Subscription): string {
  return JSON.stringify(Subscription$outboundSchema.parse(subscription));
}

export function subscriptionFromJSON(
  jsonString: string,
): SafeParseResult<Subscription, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => Subscription$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'Subscription' from JSON`,
  );
}

/** @internal */
export const GetTokenDetailsAuthenticationResponseStatus$inboundSchema:
  z.ZodNativeEnum<typeof GetTokenDetailsAuthenticationResponseStatus> = z
    .nativeEnum(GetTokenDetailsAuthenticationResponseStatus);

/** @internal */
export const GetTokenDetailsAuthenticationResponseStatus$outboundSchema:
  z.ZodNativeEnum<typeof GetTokenDetailsAuthenticationResponseStatus> =
    GetTokenDetailsAuthenticationResponseStatus$inboundSchema;

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace GetTokenDetailsAuthenticationResponseStatus$ {
  /** @deprecated use `GetTokenDetailsAuthenticationResponseStatus$inboundSchema` instead. */
  export const inboundSchema =
    GetTokenDetailsAuthenticationResponseStatus$inboundSchema;
  /** @deprecated use `GetTokenDetailsAuthenticationResponseStatus$outboundSchema` instead. */
  export const outboundSchema =
    GetTokenDetailsAuthenticationResponseStatus$outboundSchema;
}

/** @internal */
export const GetTokenDetailsSubscription$inboundSchema: z.ZodType<
  GetTokenDetailsSubscription,
  z.ZodTypeDef,
  unknown
> = z.object({
  features: z.array(z.string()).optional(),
  active: z.boolean().optional(),
  subscribedAt: z.nullable(z.string()).optional(),
  status: GetTokenDetailsAuthenticationResponseStatus$inboundSchema.optional(),
  paymentService: z.nullable(z.string()).optional(),
  plan: z.nullable(z.string()).optional(),
});

/** @internal */
export type GetTokenDetailsSubscription$Outbound = {
  features?: Array<string> | undefined;
  active?: boolean | undefined;
  subscribedAt?: string | null | undefined;
  status?: string | undefined;
  paymentService?: string | null | undefined;
  plan?: string | null | undefined;
};

/** @internal */
export const GetTokenDetailsSubscription$outboundSchema: z.ZodType<
  GetTokenDetailsSubscription$Outbound,
  z.ZodTypeDef,
  GetTokenDetailsSubscription
> = z.object({
  features: z.array(z.string()).optional(),
  active: z.boolean().optional(),
  subscribedAt: z.nullable(z.string()).optional(),
  status: GetTokenDetailsAuthenticationResponseStatus$outboundSchema.optional(),
  paymentService: z.nullable(z.string()).optional(),
  plan: z.nullable(z.string()).optional(),
});

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace GetTokenDetailsSubscription$ {
  /** @deprecated use `GetTokenDetailsSubscription$inboundSchema` instead. */
  export const inboundSchema = GetTokenDetailsSubscription$inboundSchema;
  /** @deprecated use `GetTokenDetailsSubscription$outboundSchema` instead. */
  export const outboundSchema = GetTokenDetailsSubscription$outboundSchema;
  /** @deprecated use `GetTokenDetailsSubscription$Outbound` instead. */
  export type Outbound = GetTokenDetailsSubscription$Outbound;
}

export function getTokenDetailsSubscriptionToJSON(
  getTokenDetailsSubscription: GetTokenDetailsSubscription,
): string {
  return JSON.stringify(
    GetTokenDetailsSubscription$outboundSchema.parse(
      getTokenDetailsSubscription,
    ),
  );
}

export function getTokenDetailsSubscriptionFromJSON(
  jsonString: string,
): SafeParseResult<GetTokenDetailsSubscription, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTokenDetailsSubscription$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTokenDetailsSubscription' from JSON`,
  );
}

/** @internal */
export const GetTokenDetailsUserPlexAccount$inboundSchema: z.ZodType<
  GetTokenDetailsUserPlexAccount,
  z.ZodTypeDef,
  unknown
> = z.object({
  adsConsent: z.nullable(z.boolean()),
  adsConsentReminderAt: z.nullable(z.number().int()),
  adsConsentSetAt: z.nullable(z.number().int()),
  anonymous: z.nullable(z.boolean().default(false)),
  authToken: z.string(),
  backupCodesCreated: z.boolean().default(false),
  confirmed: z.boolean().default(false),
  country: z.string(),
  email: z.string(),
  emailOnlyAuth: z.boolean().default(false),
  experimentalFeatures: z.boolean().default(false),
  friendlyName: z.string(),
  entitlements: z.array(z.string()),
  guest: z.boolean().default(false),
  hasPassword: z.boolean().default(true),
  home: z.boolean().default(false),
  homeAdmin: z.boolean().default(false),
  homeSize: z.number().int(),
  id: z.number().int(),
  joinedAt: z.number().int(),
  locale: z.nullable(z.string()),
  mailingListActive: z.boolean().default(false),
  mailingListStatus: MailingListStatus$inboundSchema,
  maxHomeSize: z.number().int(),
  pin: z.string().optional(),
  profile: z.lazy(() => UserProfile$inboundSchema),
  protected: z.boolean().default(false),
  rememberExpiresAt: z.number().int(),
  restricted: z.boolean().default(false),
  roles: z.array(z.string()).optional(),
  scrobbleTypes: z.string(),
  services: z.array(z.lazy(() => Services$inboundSchema)),
  subscription: z.lazy(() => Subscription$inboundSchema),
  subscriptionDescription: z.nullable(z.string()),
  subscriptions: z.array(
    z.lazy(() => GetTokenDetailsSubscription$inboundSchema),
  ),
  thumb: z.string(),
  title: z.string(),
  twoFactorEnabled: z.boolean().default(false),
  username: z.string(),
  uuid: z.string(),
  attributionPartner: z.nullable(z.string()),
});

/** @internal */
export type GetTokenDetailsUserPlexAccount$Outbound = {
  adsConsent: boolean | null;
  adsConsentReminderAt: number | null;
  adsConsentSetAt: number | null;
  anonymous: boolean | null;
  authToken: string;
  backupCodesCreated: boolean;
  confirmed: boolean;
  country: string;
  email: string;
  emailOnlyAuth: boolean;
  experimentalFeatures: boolean;
  friendlyName: string;
  entitlements: Array<string>;
  guest: boolean;
  hasPassword: boolean;
  home: boolean;
  homeAdmin: boolean;
  homeSize: number;
  id: number;
  joinedAt: number;
  locale: string | null;
  mailingListActive: boolean;
  mailingListStatus: string;
  maxHomeSize: number;
  pin?: string | undefined;
  profile: UserProfile$Outbound;
  protected: boolean;
  rememberExpiresAt: number;
  restricted: boolean;
  roles?: Array<string> | undefined;
  scrobbleTypes: string;
  services: Array<Services$Outbound>;
  subscription: Subscription$Outbound;
  subscriptionDescription: string | null;
  subscriptions: Array<GetTokenDetailsSubscription$Outbound>;
  thumb: string;
  title: string;
  twoFactorEnabled: boolean;
  username: string;
  uuid: string;
  attributionPartner: string | null;
};

/** @internal */
export const GetTokenDetailsUserPlexAccount$outboundSchema: z.ZodType<
  GetTokenDetailsUserPlexAccount$Outbound,
  z.ZodTypeDef,
  GetTokenDetailsUserPlexAccount
> = z.object({
  adsConsent: z.nullable(z.boolean()),
  adsConsentReminderAt: z.nullable(z.number().int()),
  adsConsentSetAt: z.nullable(z.number().int()),
  anonymous: z.nullable(z.boolean().default(false)),
  authToken: z.string(),
  backupCodesCreated: z.boolean().default(false),
  confirmed: z.boolean().default(false),
  country: z.string(),
  email: z.string(),
  emailOnlyAuth: z.boolean().default(false),
  experimentalFeatures: z.boolean().default(false),
  friendlyName: z.string(),
  entitlements: z.array(z.string()),
  guest: z.boolean().default(false),
  hasPassword: z.boolean().default(true),
  home: z.boolean().default(false),
  homeAdmin: z.boolean().default(false),
  homeSize: z.number().int(),
  id: z.number().int(),
  joinedAt: z.number().int(),
  locale: z.nullable(z.string()),
  mailingListActive: z.boolean().default(false),
  mailingListStatus: MailingListStatus$outboundSchema,
  maxHomeSize: z.number().int(),
  pin: z.string().optional(),
  profile: z.lazy(() => UserProfile$outboundSchema),
  protected: z.boolean().default(false),
  rememberExpiresAt: z.number().int(),
  restricted: z.boolean().default(false),
  roles: z.array(z.string()).optional(),
  scrobbleTypes: z.string(),
  services: z.array(z.lazy(() => Services$outboundSchema)),
  subscription: z.lazy(() => Subscription$outboundSchema),
  subscriptionDescription: z.nullable(z.string()),
  subscriptions: z.array(
    z.lazy(() => GetTokenDetailsSubscription$outboundSchema),
  ),
  thumb: z.string(),
  title: z.string(),
  twoFactorEnabled: z.boolean().default(false),
  username: z.string(),
  uuid: z.string(),
  attributionPartner: z.nullable(z.string()),
});

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace GetTokenDetailsUserPlexAccount$ {
  /** @deprecated use `GetTokenDetailsUserPlexAccount$inboundSchema` instead. */
  export const inboundSchema = GetTokenDetailsUserPlexAccount$inboundSchema;
  /** @deprecated use `GetTokenDetailsUserPlexAccount$outboundSchema` instead. */
  export const outboundSchema = GetTokenDetailsUserPlexAccount$outboundSchema;
  /** @deprecated use `GetTokenDetailsUserPlexAccount$Outbound` instead. */
  export type Outbound = GetTokenDetailsUserPlexAccount$Outbound;
}

export function getTokenDetailsUserPlexAccountToJSON(
  getTokenDetailsUserPlexAccount: GetTokenDetailsUserPlexAccount,
): string {
  return JSON.stringify(
    GetTokenDetailsUserPlexAccount$outboundSchema.parse(
      getTokenDetailsUserPlexAccount,
    ),
  );
}

export function getTokenDetailsUserPlexAccountFromJSON(
  jsonString: string,
): SafeParseResult<GetTokenDetailsUserPlexAccount, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTokenDetailsUserPlexAccount$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTokenDetailsUserPlexAccount' from JSON`,
  );
}

/** @internal */
export const GetTokenDetailsResponse$inboundSchema: z.ZodType<
  GetTokenDetailsResponse,
  z.ZodTypeDef,
  unknown
> = z.object({
  ContentType: z.string(),
  StatusCode: z.number().int(),
  RawResponse: z.instanceof(Response),
  UserPlexAccount: z.lazy(() => GetTokenDetailsUserPlexAccount$inboundSchema)
    .optional(),
}).transform((v) => {
  return remap$(v, {
    "ContentType": "contentType",
    "StatusCode": "statusCode",
    "RawResponse": "rawResponse",
    "UserPlexAccount": "userPlexAccount",
  });
});

/** @internal */
export type GetTokenDetailsResponse$Outbound = {
  ContentType: string;
  StatusCode: number;
  RawResponse: never;
  UserPlexAccount?: GetTokenDetailsUserPlexAccount$Outbound | undefined;
};

/** @internal */
export const GetTokenDetailsResponse$outboundSchema: z.ZodType<
  GetTokenDetailsResponse$Outbound,
  z.ZodTypeDef,
  GetTokenDetailsResponse
> = z.object({
  contentType: z.string(),
  statusCode: z.number().int(),
  rawResponse: z.instanceof(Response).transform(() => {
    throw new Error("Response cannot be serialized");
  }),
  userPlexAccount: z.lazy(() => GetTokenDetailsUserPlexAccount$outboundSchema)
    .optional(),
}).transform((v) => {
  return remap$(v, {
    contentType: "ContentType",
    statusCode: "StatusCode",
    rawResponse: "RawResponse",
    userPlexAccount: "UserPlexAccount",
  });
});

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace GetTokenDetailsResponse$ {
  /** @deprecated use `GetTokenDetailsResponse$inboundSchema` instead. */
  export const inboundSchema = GetTokenDetailsResponse$inboundSchema;
  /** @deprecated use `GetTokenDetailsResponse$outboundSchema` instead. */
  export const outboundSchema = GetTokenDetailsResponse$outboundSchema;
  /** @deprecated use `GetTokenDetailsResponse$Outbound` instead. */
  export type Outbound = GetTokenDetailsResponse$Outbound;
}

export function getTokenDetailsResponseToJSON(
  getTokenDetailsResponse: GetTokenDetailsResponse,
): string {
  return JSON.stringify(
    GetTokenDetailsResponse$outboundSchema.parse(getTokenDetailsResponse),
  );
}

export function getTokenDetailsResponseFromJSON(
  jsonString: string,
): SafeParseResult<GetTokenDetailsResponse, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => GetTokenDetailsResponse$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'GetTokenDetailsResponse' from JSON`,
  );
}
