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

import * as z from "zod/v3";
import { remap as remap$ } from "../lib/primitives.js";
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 const UpdateResourceOwnership = {
  Owned: "owned",
  Linked: "linked",
  Sandbox: "sandbox",
} as const;
export type UpdateResourceOwnership = ClosedEnum<
  typeof UpdateResourceOwnership
>;

export const UpdateResourceStatus = {
  Ready: "ready",
  Pending: "pending",
  Onboarding: "onboarding",
  Suspended: "suspended",
  Resumed: "resumed",
  Uninstalled: "uninstalled",
  Error: "error",
} as const;
export type UpdateResourceStatus = ClosedEnum<typeof UpdateResourceStatus>;

export const UpdateResourceType = {
  Prepayment: "prepayment",
  Subscription: "subscription",
} as const;
export type UpdateResourceType = ClosedEnum<typeof UpdateResourceType>;

export type UpdateResourceDetails = {
  label: string;
  value?: string | undefined;
};

export type UpdateResourceHighlightedDetails = {
  label: string;
  value?: string | undefined;
};

export type UpdateResourceBillingPlan = {
  id: string;
  type: UpdateResourceType;
  name: string;
  description?: string | undefined;
  paymentMethodRequired?: boolean | undefined;
  cost?: string | undefined;
  details?: Array<UpdateResourceDetails> | undefined;
  highlightedDetails?: Array<UpdateResourceHighlightedDetails> | undefined;
  effectiveDate?: string | undefined;
  additionalProperties?: { [k: string]: any } | undefined;
};

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

export type UpdateResourceNotification1 = {
  level: NotificationLevel;
  title: string;
  message?: string | undefined;
  href?: string | undefined;
};

export type UpdateResourceNotification = UpdateResourceNotification1 | string;

/**
 * A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.
 */
export type UpdateResourceSecretsMarketplaceEnvironmentOverrides = {
  /**
   * Value used for development environment.
   */
  development?: string | undefined;
  /**
   * Value used for preview environment.
   */
  preview?: string | undefined;
  /**
   * Value used for production environment.
   */
  production?: string | undefined;
};

export type SecretsSecrets = {
  name: string;
  value: string;
  prefix?: string | undefined;
  /**
   * A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.
   */
  environmentOverrides?:
    | UpdateResourceSecretsMarketplaceEnvironmentOverrides
    | undefined;
};

export type Secrets2 = {
  secrets: Array<SecretsSecrets>;
  /**
   * If true, will only overwrite the provided secrets instead of replacing all secrets.
   */
  partial?: boolean | undefined;
};

/**
 * A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.
 */
export type SecretsEnvironmentOverrides = {
  /**
   * Value used for development environment.
   */
  development?: string | undefined;
  /**
   * Value used for preview environment.
   */
  preview?: string | undefined;
  /**
   * Value used for production environment.
   */
  production?: string | undefined;
};

export type Secrets1 = {
  name: string;
  value: string;
  prefix?: string | undefined;
  /**
   * A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.
   */
  environmentOverrides?: SecretsEnvironmentOverrides | undefined;
};

export type UpdateResourceSecrets = Secrets2 | Array<Secrets1>;

export type UpdateResourceRequestBody = {
  ownership?: UpdateResourceOwnership | undefined;
  name?: string | undefined;
  status?: UpdateResourceStatus | undefined;
  metadata?: { [k: string]: any } | undefined;
  billingPlan?: UpdateResourceBillingPlan | undefined;
  notification?: UpdateResourceNotification1 | string | undefined;
  extras?: { [k: string]: any } | undefined;
  secrets?: Secrets2 | Array<Secrets1> | undefined;
};

export type UpdateResourceRequest = {
  integrationConfigurationId: string;
  resourceId: string;
  requestBody?: UpdateResourceRequestBody | undefined;
};

export type UpdateResourceResponseBody = {
  name: string;
};

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

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

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

/** @internal */
export type UpdateResourceDetails$Outbound = {
  label: string;
  value?: string | undefined;
};

/** @internal */
export const UpdateResourceDetails$outboundSchema: z.ZodType<
  UpdateResourceDetails$Outbound,
  z.ZodTypeDef,
  UpdateResourceDetails
> = z.object({
  label: z.string(),
  value: z.string().optional(),
});

export function updateResourceDetailsToJSON(
  updateResourceDetails: UpdateResourceDetails,
): string {
  return JSON.stringify(
    UpdateResourceDetails$outboundSchema.parse(updateResourceDetails),
  );
}

/** @internal */
export type UpdateResourceHighlightedDetails$Outbound = {
  label: string;
  value?: string | undefined;
};

/** @internal */
export const UpdateResourceHighlightedDetails$outboundSchema: z.ZodType<
  UpdateResourceHighlightedDetails$Outbound,
  z.ZodTypeDef,
  UpdateResourceHighlightedDetails
> = z.object({
  label: z.string(),
  value: z.string().optional(),
});

export function updateResourceHighlightedDetailsToJSON(
  updateResourceHighlightedDetails: UpdateResourceHighlightedDetails,
): string {
  return JSON.stringify(
    UpdateResourceHighlightedDetails$outboundSchema.parse(
      updateResourceHighlightedDetails,
    ),
  );
}

/** @internal */
export type UpdateResourceBillingPlan$Outbound = {
  id: string;
  type: string;
  name: string;
  description?: string | undefined;
  paymentMethodRequired?: boolean | undefined;
  cost?: string | undefined;
  details?: Array<UpdateResourceDetails$Outbound> | undefined;
  highlightedDetails?:
    | Array<UpdateResourceHighlightedDetails$Outbound>
    | undefined;
  effectiveDate?: string | undefined;
  [additionalProperties: string]: unknown;
};

/** @internal */
export const UpdateResourceBillingPlan$outboundSchema: z.ZodType<
  UpdateResourceBillingPlan$Outbound,
  z.ZodTypeDef,
  UpdateResourceBillingPlan
> = z.object({
  id: z.string(),
  type: UpdateResourceType$outboundSchema,
  name: z.string(),
  description: z.string().optional(),
  paymentMethodRequired: z.boolean().optional(),
  cost: z.string().optional(),
  details: z.array(z.lazy(() => UpdateResourceDetails$outboundSchema))
    .optional(),
  highlightedDetails: z.array(
    z.lazy(() => UpdateResourceHighlightedDetails$outboundSchema),
  ).optional(),
  effectiveDate: z.string().optional(),
  additionalProperties: z.record(z.any()).optional(),
}).transform((v) => {
  return {
    ...v.additionalProperties,
    ...remap$(v, {
      additionalProperties: null,
    }),
  };
});

export function updateResourceBillingPlanToJSON(
  updateResourceBillingPlan: UpdateResourceBillingPlan,
): string {
  return JSON.stringify(
    UpdateResourceBillingPlan$outboundSchema.parse(updateResourceBillingPlan),
  );
}

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

/** @internal */
export type UpdateResourceNotification1$Outbound = {
  level: string;
  title: string;
  message?: string | undefined;
  href?: string | undefined;
};

/** @internal */
export const UpdateResourceNotification1$outboundSchema: z.ZodType<
  UpdateResourceNotification1$Outbound,
  z.ZodTypeDef,
  UpdateResourceNotification1
> = z.object({
  level: NotificationLevel$outboundSchema,
  title: z.string(),
  message: z.string().optional(),
  href: z.string().optional(),
});

export function updateResourceNotification1ToJSON(
  updateResourceNotification1: UpdateResourceNotification1,
): string {
  return JSON.stringify(
    UpdateResourceNotification1$outboundSchema.parse(
      updateResourceNotification1,
    ),
  );
}

/** @internal */
export type UpdateResourceNotification$Outbound =
  | UpdateResourceNotification1$Outbound
  | string;

/** @internal */
export const UpdateResourceNotification$outboundSchema: z.ZodType<
  UpdateResourceNotification$Outbound,
  z.ZodTypeDef,
  UpdateResourceNotification
> = smartUnion([
  z.lazy(() => UpdateResourceNotification1$outboundSchema),
  z.string(),
]);

export function updateResourceNotificationToJSON(
  updateResourceNotification: UpdateResourceNotification,
): string {
  return JSON.stringify(
    UpdateResourceNotification$outboundSchema.parse(updateResourceNotification),
  );
}

/** @internal */
export type UpdateResourceSecretsMarketplaceEnvironmentOverrides$Outbound = {
  development?: string | undefined;
  preview?: string | undefined;
  production?: string | undefined;
};

/** @internal */
export const UpdateResourceSecretsMarketplaceEnvironmentOverrides$outboundSchema:
  z.ZodType<
    UpdateResourceSecretsMarketplaceEnvironmentOverrides$Outbound,
    z.ZodTypeDef,
    UpdateResourceSecretsMarketplaceEnvironmentOverrides
  > = z.object({
    development: z.string().optional(),
    preview: z.string().optional(),
    production: z.string().optional(),
  });

export function updateResourceSecretsMarketplaceEnvironmentOverridesToJSON(
  updateResourceSecretsMarketplaceEnvironmentOverrides:
    UpdateResourceSecretsMarketplaceEnvironmentOverrides,
): string {
  return JSON.stringify(
    UpdateResourceSecretsMarketplaceEnvironmentOverrides$outboundSchema.parse(
      updateResourceSecretsMarketplaceEnvironmentOverrides,
    ),
  );
}

/** @internal */
export type SecretsSecrets$Outbound = {
  name: string;
  value: string;
  prefix?: string | undefined;
  environmentOverrides?:
    | UpdateResourceSecretsMarketplaceEnvironmentOverrides$Outbound
    | undefined;
};

/** @internal */
export const SecretsSecrets$outboundSchema: z.ZodType<
  SecretsSecrets$Outbound,
  z.ZodTypeDef,
  SecretsSecrets
> = z.object({
  name: z.string(),
  value: z.string(),
  prefix: z.string().optional(),
  environmentOverrides: z.lazy(() =>
    UpdateResourceSecretsMarketplaceEnvironmentOverrides$outboundSchema
  ).optional(),
});

export function secretsSecretsToJSON(secretsSecrets: SecretsSecrets): string {
  return JSON.stringify(SecretsSecrets$outboundSchema.parse(secretsSecrets));
}

/** @internal */
export type Secrets2$Outbound = {
  secrets: Array<SecretsSecrets$Outbound>;
  partial?: boolean | undefined;
};

/** @internal */
export const Secrets2$outboundSchema: z.ZodType<
  Secrets2$Outbound,
  z.ZodTypeDef,
  Secrets2
> = z.object({
  secrets: z.array(z.lazy(() => SecretsSecrets$outboundSchema)),
  partial: z.boolean().optional(),
});

export function secrets2ToJSON(secrets2: Secrets2): string {
  return JSON.stringify(Secrets2$outboundSchema.parse(secrets2));
}

/** @internal */
export type SecretsEnvironmentOverrides$Outbound = {
  development?: string | undefined;
  preview?: string | undefined;
  production?: string | undefined;
};

/** @internal */
export const SecretsEnvironmentOverrides$outboundSchema: z.ZodType<
  SecretsEnvironmentOverrides$Outbound,
  z.ZodTypeDef,
  SecretsEnvironmentOverrides
> = z.object({
  development: z.string().optional(),
  preview: z.string().optional(),
  production: z.string().optional(),
});

export function secretsEnvironmentOverridesToJSON(
  secretsEnvironmentOverrides: SecretsEnvironmentOverrides,
): string {
  return JSON.stringify(
    SecretsEnvironmentOverrides$outboundSchema.parse(
      secretsEnvironmentOverrides,
    ),
  );
}

/** @internal */
export type Secrets1$Outbound = {
  name: string;
  value: string;
  prefix?: string | undefined;
  environmentOverrides?: SecretsEnvironmentOverrides$Outbound | undefined;
};

/** @internal */
export const Secrets1$outboundSchema: z.ZodType<
  Secrets1$Outbound,
  z.ZodTypeDef,
  Secrets1
> = z.object({
  name: z.string(),
  value: z.string(),
  prefix: z.string().optional(),
  environmentOverrides: z.lazy(() => SecretsEnvironmentOverrides$outboundSchema)
    .optional(),
});

export function secrets1ToJSON(secrets1: Secrets1): string {
  return JSON.stringify(Secrets1$outboundSchema.parse(secrets1));
}

/** @internal */
export type UpdateResourceSecrets$Outbound =
  | Secrets2$Outbound
  | Array<Secrets1$Outbound>;

/** @internal */
export const UpdateResourceSecrets$outboundSchema: z.ZodType<
  UpdateResourceSecrets$Outbound,
  z.ZodTypeDef,
  UpdateResourceSecrets
> = smartUnion([
  z.lazy(() => Secrets2$outboundSchema),
  z.array(z.lazy(() => Secrets1$outboundSchema)),
]);

export function updateResourceSecretsToJSON(
  updateResourceSecrets: UpdateResourceSecrets,
): string {
  return JSON.stringify(
    UpdateResourceSecrets$outboundSchema.parse(updateResourceSecrets),
  );
}

/** @internal */
export type UpdateResourceRequestBody$Outbound = {
  ownership?: string | undefined;
  name?: string | undefined;
  status?: string | undefined;
  metadata?: { [k: string]: any } | undefined;
  billingPlan?: UpdateResourceBillingPlan$Outbound | undefined;
  notification?: UpdateResourceNotification1$Outbound | string | undefined;
  extras?: { [k: string]: any } | undefined;
  secrets?: Secrets2$Outbound | Array<Secrets1$Outbound> | undefined;
};

/** @internal */
export const UpdateResourceRequestBody$outboundSchema: z.ZodType<
  UpdateResourceRequestBody$Outbound,
  z.ZodTypeDef,
  UpdateResourceRequestBody
> = z.object({
  ownership: UpdateResourceOwnership$outboundSchema.optional(),
  name: z.string().optional(),
  status: UpdateResourceStatus$outboundSchema.optional(),
  metadata: z.record(z.any()).optional(),
  billingPlan: z.lazy(() => UpdateResourceBillingPlan$outboundSchema)
    .optional(),
  notification: smartUnion([
    z.lazy(() => UpdateResourceNotification1$outboundSchema),
    z.string(),
  ]).optional(),
  extras: z.record(z.any()).optional(),
  secrets: smartUnion([
    z.lazy(() => Secrets2$outboundSchema),
    z.array(z.lazy(() => Secrets1$outboundSchema)),
  ]).optional(),
});

export function updateResourceRequestBodyToJSON(
  updateResourceRequestBody: UpdateResourceRequestBody,
): string {
  return JSON.stringify(
    UpdateResourceRequestBody$outboundSchema.parse(updateResourceRequestBody),
  );
}

/** @internal */
export type UpdateResourceRequest$Outbound = {
  integrationConfigurationId: string;
  resourceId: string;
  RequestBody?: UpdateResourceRequestBody$Outbound | undefined;
};

/** @internal */
export const UpdateResourceRequest$outboundSchema: z.ZodType<
  UpdateResourceRequest$Outbound,
  z.ZodTypeDef,
  UpdateResourceRequest
> = z.object({
  integrationConfigurationId: z.string(),
  resourceId: z.string(),
  requestBody: z.lazy(() => UpdateResourceRequestBody$outboundSchema)
    .optional(),
}).transform((v) => {
  return remap$(v, {
    requestBody: "RequestBody",
  });
});

export function updateResourceRequestToJSON(
  updateResourceRequest: UpdateResourceRequest,
): string {
  return JSON.stringify(
    UpdateResourceRequest$outboundSchema.parse(updateResourceRequest),
  );
}

/** @internal */
export const UpdateResourceResponseBody$inboundSchema: z.ZodType<
  UpdateResourceResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  name: types.string(),
});

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