/*
 * 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 { smartUnion } from "../types/smartUnion.js";
import { SDKValidationError } from "./sdkvalidationerror.js";

export type GetIntegrationResourceRequest = {
  /**
   * The ID of the integration configuration (installation) the resource belongs to
   */
  integrationConfigurationId: string;
  /**
   * The ID provided by the 3rd party provider for the given resource
   */
  resourceId: string;
};

/**
 * The current status of the resource
 */
export const GetIntegrationResourceStatus = {
  Error: "error",
  Onboarding: "onboarding",
  Pending: "pending",
  Ready: "ready",
  Resumed: "resumed",
  Suspended: "suspended",
  Uninstalled: "uninstalled",
} as const;
/**
 * The current status of the resource
 */
export type GetIntegrationResourceStatus = ClosedEnum<
  typeof GetIntegrationResourceStatus
>;

export type Experimentation = {
  edgeConfigSyncingEnabled?: boolean | undefined;
  edgeConfigId?: string | undefined;
  edgeConfigTokenId?: string | undefined;
};

/**
 * Any settings provided for the resource to support its product's protocols
 */
export type ProtocolSettings = {
  experimentation?: Experimentation | undefined;
};

export const GetIntegrationResourceLevel = {
  Error: "error",
  Info: "info",
  Warn: "warn",
} as const;
export type GetIntegrationResourceLevel = ClosedEnum<
  typeof GetIntegrationResourceLevel
>;

/**
 * The notification, if set, displayed to the user when viewing the resource in Vercel
 */
export type GetIntegrationResourceNotification = {
  level: GetIntegrationResourceLevel;
  title: string;
  message?: string | undefined;
  href?: string | undefined;
};

export type GetIntegrationResourceMetadata =
  | string
  | number
  | Array<string>
  | Array<number>
  | boolean;

export type GetIntegrationResourceResponseBody = {
  /**
   * The ID provided by the 3rd party provider for the given resource
   */
  id: string;
  /**
   * The ID assigned by Vercel for the given resource
   */
  internalId: string;
  /**
   * The name of the resource as it is recorded in Vercel
   */
  name: string;
  /**
   * The current status of the resource
   */
  status?: GetIntegrationResourceStatus | undefined;
  /**
   * The ID of the product the resource is derived from
   */
  productId: string;
  /**
   * Any settings provided for the resource to support its product's protocols
   */
  protocolSettings?: ProtocolSettings | undefined;
  /**
   * The notification, if set, displayed to the user when viewing the resource in Vercel
   */
  notification?: GetIntegrationResourceNotification | undefined;
  /**
   * The ID of the billing plan the resource is subscribed to, if applicable
   */
  billingPlanId?: string | undefined;
  /**
   * The configured metadata for the resource as defined by its product's Metadata Schema
   */
  metadata?: {
    [k: string]: string | number | Array<string> | Array<number> | boolean;
  } | undefined;
};

/** @internal */
export type GetIntegrationResourceRequest$Outbound = {
  integrationConfigurationId: string;
  resourceId: string;
};

/** @internal */
export const GetIntegrationResourceRequest$outboundSchema: z.ZodType<
  GetIntegrationResourceRequest$Outbound,
  z.ZodTypeDef,
  GetIntegrationResourceRequest
> = z.object({
  integrationConfigurationId: z.string(),
  resourceId: z.string(),
});

export function getIntegrationResourceRequestToJSON(
  getIntegrationResourceRequest: GetIntegrationResourceRequest,
): string {
  return JSON.stringify(
    GetIntegrationResourceRequest$outboundSchema.parse(
      getIntegrationResourceRequest,
    ),
  );
}

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

/** @internal */
export const Experimentation$inboundSchema: z.ZodType<
  Experimentation,
  z.ZodTypeDef,
  unknown
> = z.object({
  edgeConfigSyncingEnabled: types.optional(types.boolean()),
  edgeConfigId: types.optional(types.string()),
  edgeConfigTokenId: types.optional(types.string()),
});

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

/** @internal */
export const ProtocolSettings$inboundSchema: z.ZodType<
  ProtocolSettings,
  z.ZodTypeDef,
  unknown
> = z.object({
  experimentation: types.optional(z.lazy(() => Experimentation$inboundSchema)),
});

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

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

/** @internal */
export const GetIntegrationResourceNotification$inboundSchema: z.ZodType<
  GetIntegrationResourceNotification,
  z.ZodTypeDef,
  unknown
> = z.object({
  level: GetIntegrationResourceLevel$inboundSchema,
  title: types.string(),
  message: types.optional(types.string()),
  href: types.optional(types.string()),
});

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

/** @internal */
export const GetIntegrationResourceMetadata$inboundSchema: z.ZodType<
  GetIntegrationResourceMetadata,
  z.ZodTypeDef,
  unknown
> = smartUnion([
  types.string(),
  types.number(),
  z.array(types.string()),
  z.array(types.number()),
  types.boolean(),
]);

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

/** @internal */
export const GetIntegrationResourceResponseBody$inboundSchema: z.ZodType<
  GetIntegrationResourceResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  id: types.string(),
  internalId: types.string(),
  name: types.string(),
  status: types.optional(GetIntegrationResourceStatus$inboundSchema),
  productId: types.string(),
  protocolSettings: types.optional(
    z.lazy(() => ProtocolSettings$inboundSchema),
  ),
  notification: types.optional(
    z.lazy(() => GetIntegrationResourceNotification$inboundSchema),
  ),
  billingPlanId: types.optional(types.string()),
  metadata: types.optional(
    z.record(
      smartUnion([
        types.string(),
        types.number(),
        z.array(types.string()),
        z.array(types.number()),
        types.boolean(),
      ]),
    ),
  ),
});

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