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

import * as z from "zod/v3";
import { safeParse } from "../lib/schemas.js";
import { ClosedEnum } from "../types/enums.js";
import { Result as SafeParseResult } from "../types/fp.js";
import * as types from "../types/primitives.js";
import { SDKValidationError } from "./sdkvalidationerror.js";

export type GetRollingReleaseBillingStatusRequest = {
  /**
   * Project ID or project name (URL-encoded)
   */
  idOrName: string;
  /**
   * The Team identifier to perform the request on behalf of.
   */
  teamId?: string | undefined;
  /**
   * The Team slug to perform the request on behalf of.
   */
  slug?: string | undefined;
};

export type GetRollingReleaseBillingStatusResponseBody4 = {
  availableSlots: number;
  reason: "available_slots";
  message: string;
};

export type GetRollingReleaseBillingStatusResponseBody3 = {
  availableSlots: number;
  reason: "no_available_slots";
  message: string;
  enabledProjects: Array<string>;
};

export const AvailableSlots = {
  Unlimited: "unlimited",
} as const;
export type AvailableSlots = ClosedEnum<typeof AvailableSlots>;

export type GetRollingReleaseBillingStatusResponseBody2 = {
  availableSlots: AvailableSlots;
  reason: "unlimited_slots";
  message: string;
};

export type GetRollingReleaseBillingStatusResponseBody1 = {
  availableSlots: number;
  reason: "plan_not_supported";
  message: string;
};

export type GetRollingReleaseBillingStatusResponseBody =
  | GetRollingReleaseBillingStatusResponseBody1
  | GetRollingReleaseBillingStatusResponseBody2
  | GetRollingReleaseBillingStatusResponseBody3
  | GetRollingReleaseBillingStatusResponseBody4;

/** @internal */
export type GetRollingReleaseBillingStatusRequest$Outbound = {
  idOrName: string;
  teamId?: string | undefined;
  slug?: string | undefined;
};

/** @internal */
export const GetRollingReleaseBillingStatusRequest$outboundSchema: z.ZodType<
  GetRollingReleaseBillingStatusRequest$Outbound,
  z.ZodTypeDef,
  GetRollingReleaseBillingStatusRequest
> = z.object({
  idOrName: z.string(),
  teamId: z.string().optional(),
  slug: z.string().optional(),
});

export function getRollingReleaseBillingStatusRequestToJSON(
  getRollingReleaseBillingStatusRequest: GetRollingReleaseBillingStatusRequest,
): string {
  return JSON.stringify(
    GetRollingReleaseBillingStatusRequest$outboundSchema.parse(
      getRollingReleaseBillingStatusRequest,
    ),
  );
}

/** @internal */
export const GetRollingReleaseBillingStatusResponseBody4$inboundSchema:
  z.ZodType<
    GetRollingReleaseBillingStatusResponseBody4,
    z.ZodTypeDef,
    unknown
  > = z.object({
    availableSlots: types.number(),
    reason: types.literal("available_slots"),
    message: types.string(),
  });

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

/** @internal */
export const GetRollingReleaseBillingStatusResponseBody3$inboundSchema:
  z.ZodType<
    GetRollingReleaseBillingStatusResponseBody3,
    z.ZodTypeDef,
    unknown
  > = z.object({
    availableSlots: types.number(),
    reason: types.literal("no_available_slots"),
    message: types.string(),
    enabledProjects: z.array(types.string()),
  });

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

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

/** @internal */
export const GetRollingReleaseBillingStatusResponseBody2$inboundSchema:
  z.ZodType<
    GetRollingReleaseBillingStatusResponseBody2,
    z.ZodTypeDef,
    unknown
  > = z.object({
    availableSlots: AvailableSlots$inboundSchema,
    reason: types.literal("unlimited_slots"),
    message: types.string(),
  });

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

/** @internal */
export const GetRollingReleaseBillingStatusResponseBody1$inboundSchema:
  z.ZodType<
    GetRollingReleaseBillingStatusResponseBody1,
    z.ZodTypeDef,
    unknown
  > = z.object({
    availableSlots: types.number(),
    reason: types.literal("plan_not_supported"),
    message: types.string(),
  });

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

/** @internal */
export const GetRollingReleaseBillingStatusResponseBody$inboundSchema:
  z.ZodType<GetRollingReleaseBillingStatusResponseBody, z.ZodTypeDef, unknown> =
    z.union([
      z.lazy(() => GetRollingReleaseBillingStatusResponseBody1$inboundSchema),
      z.lazy(() => GetRollingReleaseBillingStatusResponseBody2$inboundSchema),
      z.lazy(() => GetRollingReleaseBillingStatusResponseBody3$inboundSchema),
      z.lazy(() => GetRollingReleaseBillingStatusResponseBody4$inboundSchema),
    ]);

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