/*
 * 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";

export const UpdateProjectCheckRequires = {
  BuildReady: "build-ready",
  DeploymentUrl: "deployment-url",
} as const;
export type UpdateProjectCheckRequires = ClosedEnum<
  typeof UpdateProjectCheckRequires
>;

export const UpdateProjectCheckBlocks = {
  BuildStart: "build-start",
  DeploymentStart: "deployment-start",
  DeploymentAlias: "deployment-alias",
  DeploymentPromotion: "deployment-promotion",
  None: "none",
} as const;
export type UpdateProjectCheckBlocks = ClosedEnum<
  typeof UpdateProjectCheckBlocks
>;

export type UpdateProjectCheckRequestBody = {
  name?: string | undefined;
  isRerequestable?: boolean | undefined;
  requires?: UpdateProjectCheckRequires | undefined;
  targets?: Array<string> | undefined;
  blocks?: UpdateProjectCheckBlocks | undefined;
  timeout?: number | undefined;
};

export type UpdateProjectCheckRequest = {
  projectIdOrName: string;
  checkId: 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?: UpdateProjectCheckRequestBody | undefined;
};

export const UpdateProjectCheckChecksV2Requires = {
  BuildReady: "build-ready",
  DeploymentUrl: "deployment-url",
  None: "none",
} as const;
export type UpdateProjectCheckChecksV2Requires = ClosedEnum<
  typeof UpdateProjectCheckChecksV2Requires
>;

export const UpdateProjectCheckSourceProvider = {
  Bitbucket: "bitbucket",
  Github: "github",
  Gitlab: "gitlab",
} as const;
export type UpdateProjectCheckSourceProvider = ClosedEnum<
  typeof UpdateProjectCheckSourceProvider
>;

export type UpdateProjectCheckSource3 = {
  kind: "git-provider";
  provider: UpdateProjectCheckSourceProvider;
  externalCheckName: string;
};

export type UpdateProjectCheckSource2 = {
  kind: "webhook";
  webhookId?: string | undefined;
};

export type UpdateProjectCheckSource1 = {
  kind: "integration";
  integrationId: string;
  integrationConfigurationId: string;
  resourceId?: string | undefined;
  externalResourceId?: string | undefined;
};

export type UpdateProjectCheckSource =
  | UpdateProjectCheckSource1
  | UpdateProjectCheckSource2
  | UpdateProjectCheckSource3;

export const UpdateProjectCheckChecksV2Blocks = {
  BuildStart: "build-start",
  DeploymentAlias: "deployment-alias",
  DeploymentPromotion: "deployment-promotion",
  DeploymentStart: "deployment-start",
  None: "none",
} as const;
export type UpdateProjectCheckChecksV2Blocks = ClosedEnum<
  typeof UpdateProjectCheckChecksV2Blocks
>;

export const UpdateProjectCheckSourceKind = {
  GitProvider: "git-provider",
  Integration: "integration",
  Vercel: "vercel",
  Webhook: "webhook",
} as const;
export type UpdateProjectCheckSourceKind = ClosedEnum<
  typeof UpdateProjectCheckSourceKind
>;

export type UpdateProjectCheckResponseBody = {
  id: string;
  name: string;
  ownerId: string;
  projectId: string;
  isRerequestable: boolean;
  requires: UpdateProjectCheckChecksV2Requires;
  source:
    | UpdateProjectCheckSource1
    | UpdateProjectCheckSource2
    | UpdateProjectCheckSource3;
  blocks: UpdateProjectCheckChecksV2Blocks;
  targets: Array<string>;
  sourceKind: UpdateProjectCheckSourceKind;
  sourceIntegrationConfigurationId?: string | undefined;
  timeout: number;
  createdAt: number;
  updatedAt: number;
  deletedAt?: number | undefined;
};

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

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

/** @internal */
export type UpdateProjectCheckRequestBody$Outbound = {
  name?: string | undefined;
  isRerequestable?: boolean | undefined;
  requires: string;
  targets?: Array<string> | undefined;
  blocks: string;
  timeout: number;
};

/** @internal */
export const UpdateProjectCheckRequestBody$outboundSchema: z.ZodType<
  UpdateProjectCheckRequestBody$Outbound,
  z.ZodTypeDef,
  UpdateProjectCheckRequestBody
> = z.object({
  name: z.string().optional(),
  isRerequestable: z.boolean().optional(),
  requires: UpdateProjectCheckRequires$outboundSchema.default("deployment-url"),
  targets: z.array(z.string()).optional(),
  blocks: UpdateProjectCheckBlocks$outboundSchema.default("deployment-alias"),
  timeout: z.number().default(300),
});

export function updateProjectCheckRequestBodyToJSON(
  updateProjectCheckRequestBody: UpdateProjectCheckRequestBody,
): string {
  return JSON.stringify(
    UpdateProjectCheckRequestBody$outboundSchema.parse(
      updateProjectCheckRequestBody,
    ),
  );
}

/** @internal */
export type UpdateProjectCheckRequest$Outbound = {
  projectIdOrName: string;
  checkId: string;
  teamId?: string | undefined;
  slug?: string | undefined;
  RequestBody?: UpdateProjectCheckRequestBody$Outbound | undefined;
};

/** @internal */
export const UpdateProjectCheckRequest$outboundSchema: z.ZodType<
  UpdateProjectCheckRequest$Outbound,
  z.ZodTypeDef,
  UpdateProjectCheckRequest
> = z.object({
  projectIdOrName: z.string(),
  checkId: z.string(),
  teamId: z.string().optional(),
  slug: z.string().optional(),
  requestBody: z.lazy(() => UpdateProjectCheckRequestBody$outboundSchema)
    .optional(),
}).transform((v) => {
  return remap$(v, {
    requestBody: "RequestBody",
  });
});

export function updateProjectCheckRequestToJSON(
  updateProjectCheckRequest: UpdateProjectCheckRequest,
): string {
  return JSON.stringify(
    UpdateProjectCheckRequest$outboundSchema.parse(updateProjectCheckRequest),
  );
}

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

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

/** @internal */
export const UpdateProjectCheckSource3$inboundSchema: z.ZodType<
  UpdateProjectCheckSource3,
  z.ZodTypeDef,
  unknown
> = z.object({
  kind: types.literal("git-provider"),
  provider: UpdateProjectCheckSourceProvider$inboundSchema,
  externalCheckName: types.string(),
});

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

/** @internal */
export const UpdateProjectCheckSource2$inboundSchema: z.ZodType<
  UpdateProjectCheckSource2,
  z.ZodTypeDef,
  unknown
> = z.object({
  kind: types.literal("webhook"),
  webhookId: types.optional(types.string()),
});

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

/** @internal */
export const UpdateProjectCheckSource1$inboundSchema: z.ZodType<
  UpdateProjectCheckSource1,
  z.ZodTypeDef,
  unknown
> = z.object({
  kind: types.literal("integration"),
  integrationId: types.string(),
  integrationConfigurationId: types.string(),
  resourceId: types.optional(types.string()),
  externalResourceId: types.optional(types.string()),
});

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

/** @internal */
export const UpdateProjectCheckSource$inboundSchema: z.ZodType<
  UpdateProjectCheckSource,
  z.ZodTypeDef,
  unknown
> = z.union([
  z.lazy(() => UpdateProjectCheckSource1$inboundSchema),
  z.lazy(() => UpdateProjectCheckSource2$inboundSchema),
  z.lazy(() => UpdateProjectCheckSource3$inboundSchema),
]);

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

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

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

/** @internal */
export const UpdateProjectCheckResponseBody$inboundSchema: z.ZodType<
  UpdateProjectCheckResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  id: types.string(),
  name: types.string(),
  ownerId: types.string(),
  projectId: types.string(),
  isRerequestable: types.boolean(),
  requires: UpdateProjectCheckChecksV2Requires$inboundSchema,
  source: z.union([
    z.lazy(() => UpdateProjectCheckSource1$inboundSchema),
    z.lazy(() => UpdateProjectCheckSource2$inboundSchema),
    z.lazy(() => UpdateProjectCheckSource3$inboundSchema),
  ]),
  blocks: UpdateProjectCheckChecksV2Blocks$inboundSchema,
  targets: z.array(types.string()),
  sourceKind: UpdateProjectCheckSourceKind$inboundSchema,
  sourceIntegrationConfigurationId: types.optional(types.string()),
  timeout: types.number(),
  createdAt: types.number(),
  updatedAt: types.number(),
  deletedAt: types.optional(types.number()),
});

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