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

/**
 * The issuer policy kind.
 */
export const PathParamKind = {
  ProjectGrant: "project-grant",
} as const;
/**
 * The issuer policy kind.
 */
export type PathParamKind = ClosedEnum<typeof PathParamKind>;

export type UpdateKmsIssuerPolicyRequestBody = {
  /**
   * The environments for the project grant policy. Each entry is a system environment (production, preview, development) or a custom environment ID (env_...).
   */
  environments?: Array<string> | undefined;
  /**
   * The claims that KMS should include in signed JWTs for this policy. Pass null to remove them.
   */
  tokenClaims?: { [k: string]: any } | null | undefined;
};

export type UpdateKmsIssuerPolicyRequest = {
  /**
   * The ID of the issuer.
   */
  issuerId: string;
  /**
   * The issuer policy kind.
   */
  kind: PathParamKind;
  /**
   * The policy identifier.
   */
  policyKey: 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;
  requestBody?: UpdateKmsIssuerPolicyRequestBody | undefined;
};

export type UpdateKmsIssuerPolicyResponseBody2 = {
  kind: "connex-grant";
  clientId: string;
  tokenClaims?: { [k: string]: any } | undefined;
  createdAt: string;
  updatedAt: string;
};

export type UpdateKmsIssuerPolicyResponseBody1 = {
  kind: "project-grant";
  teamId: string;
  projectId: string;
  /**
   * Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim.
   */
  environments: Array<string>;
  tokenClaims?: { [k: string]: any } | undefined;
  createdAt: string;
  updatedAt: string;
};

export type UpdateKmsIssuerPolicyResponseBody =
  | UpdateKmsIssuerPolicyResponseBody1
  | UpdateKmsIssuerPolicyResponseBody2;

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

/** @internal */
export type UpdateKmsIssuerPolicyRequestBody$Outbound = {
  environments?: Array<string> | undefined;
  tokenClaims?: { [k: string]: any } | null | undefined;
};

/** @internal */
export const UpdateKmsIssuerPolicyRequestBody$outboundSchema: z.ZodType<
  UpdateKmsIssuerPolicyRequestBody$Outbound,
  z.ZodTypeDef,
  UpdateKmsIssuerPolicyRequestBody
> = z.object({
  environments: z.array(z.string()).optional(),
  tokenClaims: z.nullable(z.record(z.any())).optional(),
});

export function updateKmsIssuerPolicyRequestBodyToJSON(
  updateKmsIssuerPolicyRequestBody: UpdateKmsIssuerPolicyRequestBody,
): string {
  return JSON.stringify(
    UpdateKmsIssuerPolicyRequestBody$outboundSchema.parse(
      updateKmsIssuerPolicyRequestBody,
    ),
  );
}

/** @internal */
export type UpdateKmsIssuerPolicyRequest$Outbound = {
  issuerId: string;
  kind: string;
  policyKey: string;
  teamId?: string | undefined;
  slug?: string | undefined;
  RequestBody?: UpdateKmsIssuerPolicyRequestBody$Outbound | undefined;
};

/** @internal */
export const UpdateKmsIssuerPolicyRequest$outboundSchema: z.ZodType<
  UpdateKmsIssuerPolicyRequest$Outbound,
  z.ZodTypeDef,
  UpdateKmsIssuerPolicyRequest
> = z.object({
  issuerId: z.string(),
  kind: PathParamKind$outboundSchema,
  policyKey: z.string(),
  teamId: z.string().optional(),
  slug: z.string().optional(),
  requestBody: z.lazy(() => UpdateKmsIssuerPolicyRequestBody$outboundSchema)
    .optional(),
}).transform((v) => {
  return remap$(v, {
    requestBody: "RequestBody",
  });
});

export function updateKmsIssuerPolicyRequestToJSON(
  updateKmsIssuerPolicyRequest: UpdateKmsIssuerPolicyRequest,
): string {
  return JSON.stringify(
    UpdateKmsIssuerPolicyRequest$outboundSchema.parse(
      updateKmsIssuerPolicyRequest,
    ),
  );
}

/** @internal */
export const UpdateKmsIssuerPolicyResponseBody2$inboundSchema: z.ZodType<
  UpdateKmsIssuerPolicyResponseBody2,
  z.ZodTypeDef,
  unknown
> = z.object({
  kind: types.literal("connex-grant"),
  clientId: types.string(),
  tokenClaims: types.optional(z.record(z.any())),
  createdAt: types.string(),
  updatedAt: types.string(),
});

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

/** @internal */
export const UpdateKmsIssuerPolicyResponseBody1$inboundSchema: z.ZodType<
  UpdateKmsIssuerPolicyResponseBody1,
  z.ZodTypeDef,
  unknown
> = z.object({
  kind: types.literal("project-grant"),
  teamId: types.string(),
  projectId: types.string(),
  environments: z.array(types.string()),
  tokenClaims: types.optional(z.record(z.any())),
  createdAt: types.string(),
  updatedAt: types.string(),
});

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

/** @internal */
export const UpdateKmsIssuerPolicyResponseBody$inboundSchema: z.ZodType<
  UpdateKmsIssuerPolicyResponseBody,
  z.ZodTypeDef,
  unknown
> = z.union([
  z.lazy(() => UpdateKmsIssuerPolicyResponseBody1$inboundSchema),
  z.lazy(() => UpdateKmsIssuerPolicyResponseBody2$inboundSchema),
]);

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