/*
 * 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 Requires = {
  BuildReady: "build-ready",
  DeploymentUrl: "deployment-url",
  None: "none",
} as const;
export type Requires = ClosedEnum<typeof Requires>;

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

export const SourceProvider = {
  Github: "github",
} as const;
export type SourceProvider = ClosedEnum<typeof SourceProvider>;

export type Source3 = {
  kind: string;
  externalCheckName: string;
  provider: SourceProvider;
};

export type CreateProjectCheckSource2 = {
  kind: string;
  webhookId?: string | undefined;
};

export type CreateProjectCheckSource1 = {
  kind?: string | undefined;
  externalResourceId?: string | undefined;
};

export type CreateProjectCheckSource =
  | Source3
  | CreateProjectCheckSource2
  | CreateProjectCheckSource1;

export type CreateProjectCheckRequestBody = {
  name: string;
  isRerequestable?: boolean | undefined;
  requires?: Requires | undefined;
  targets?: Array<string> | undefined;
  blocks?: Blocks | undefined;
  source?:
    | Source3
    | CreateProjectCheckSource2
    | CreateProjectCheckSource1
    | undefined;
  timeout?: number | undefined;
};

export type CreateProjectCheckRequest = {
  projectIdOrName: 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?: CreateProjectCheckRequestBody | undefined;
};

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

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

export type CreateProjectCheckSource3 = {
  kind: "git-provider";
  provider: CreateProjectCheckSourceProvider;
  externalCheckName: string;
};

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

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

export type CreateProjectCheckChecksV2Source =
  | CreateProjectCheckSourceChecksV21
  | CreateProjectCheckSourceChecksV22
  | CreateProjectCheckSource3;

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

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

export type CreateProjectCheckResponseBody = {
  id: string;
  name: string;
  ownerId: string;
  projectId: string;
  isRerequestable: boolean;
  requires: CreateProjectCheckRequires;
  source:
    | CreateProjectCheckSourceChecksV21
    | CreateProjectCheckSourceChecksV22
    | CreateProjectCheckSource3;
  blocks: CreateProjectCheckBlocks;
  targets: Array<string>;
  sourceKind: SourceKind;
  sourceIntegrationConfigurationId?: string | undefined;
  timeout: number;
  createdAt: number;
  updatedAt: number;
  deletedAt?: number | undefined;
};

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

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

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

/** @internal */
export type Source3$Outbound = {
  kind: string;
  externalCheckName: string;
  provider: string;
};

/** @internal */
export const Source3$outboundSchema: z.ZodType<
  Source3$Outbound,
  z.ZodTypeDef,
  Source3
> = z.object({
  kind: z.string(),
  externalCheckName: z.string(),
  provider: SourceProvider$outboundSchema,
});

export function source3ToJSON(source3: Source3): string {
  return JSON.stringify(Source3$outboundSchema.parse(source3));
}

/** @internal */
export type CreateProjectCheckSource2$Outbound = {
  kind: string;
  webhookId?: string | undefined;
};

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

export function createProjectCheckSource2ToJSON(
  createProjectCheckSource2: CreateProjectCheckSource2,
): string {
  return JSON.stringify(
    CreateProjectCheckSource2$outboundSchema.parse(createProjectCheckSource2),
  );
}

/** @internal */
export type CreateProjectCheckSource1$Outbound = {
  kind: string;
  externalResourceId?: string | undefined;
};

/** @internal */
export const CreateProjectCheckSource1$outboundSchema: z.ZodType<
  CreateProjectCheckSource1$Outbound,
  z.ZodTypeDef,
  CreateProjectCheckSource1
> = z.object({
  kind: z.string().default("integration"),
  externalResourceId: z.string().optional(),
});

export function createProjectCheckSource1ToJSON(
  createProjectCheckSource1: CreateProjectCheckSource1,
): string {
  return JSON.stringify(
    CreateProjectCheckSource1$outboundSchema.parse(createProjectCheckSource1),
  );
}

/** @internal */
export type CreateProjectCheckSource$Outbound =
  | Source3$Outbound
  | CreateProjectCheckSource2$Outbound
  | CreateProjectCheckSource1$Outbound;

/** @internal */
export const CreateProjectCheckSource$outboundSchema: z.ZodType<
  CreateProjectCheckSource$Outbound,
  z.ZodTypeDef,
  CreateProjectCheckSource
> = smartUnion([
  z.lazy(() => Source3$outboundSchema),
  z.lazy(() => CreateProjectCheckSource2$outboundSchema),
  z.lazy(() => CreateProjectCheckSource1$outboundSchema),
]);

export function createProjectCheckSourceToJSON(
  createProjectCheckSource: CreateProjectCheckSource,
): string {
  return JSON.stringify(
    CreateProjectCheckSource$outboundSchema.parse(createProjectCheckSource),
  );
}

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

/** @internal */
export const CreateProjectCheckRequestBody$outboundSchema: z.ZodType<
  CreateProjectCheckRequestBody$Outbound,
  z.ZodTypeDef,
  CreateProjectCheckRequestBody
> = z.object({
  name: z.string(),
  isRerequestable: z.boolean().optional(),
  requires: Requires$outboundSchema.default("deployment-url"),
  targets: z.array(z.string()).optional(),
  blocks: Blocks$outboundSchema.default("deployment-alias"),
  source: smartUnion([
    z.lazy(() => Source3$outboundSchema),
    z.lazy(() => CreateProjectCheckSource2$outboundSchema),
    z.lazy(() => CreateProjectCheckSource1$outboundSchema),
  ]).optional(),
  timeout: z.number().default(300),
});

export function createProjectCheckRequestBodyToJSON(
  createProjectCheckRequestBody: CreateProjectCheckRequestBody,
): string {
  return JSON.stringify(
    CreateProjectCheckRequestBody$outboundSchema.parse(
      createProjectCheckRequestBody,
    ),
  );
}

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

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

export function createProjectCheckRequestToJSON(
  createProjectCheckRequest: CreateProjectCheckRequest,
): string {
  return JSON.stringify(
    CreateProjectCheckRequest$outboundSchema.parse(createProjectCheckRequest),
  );
}

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

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

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

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

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

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

/** @internal */
export const CreateProjectCheckSourceChecksV21$inboundSchema: z.ZodType<
  CreateProjectCheckSourceChecksV21,
  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 createProjectCheckSourceChecksV21FromJSON(
  jsonString: string,
): SafeParseResult<CreateProjectCheckSourceChecksV21, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => CreateProjectCheckSourceChecksV21$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'CreateProjectCheckSourceChecksV21' from JSON`,
  );
}

/** @internal */
export const CreateProjectCheckChecksV2Source$inboundSchema: z.ZodType<
  CreateProjectCheckChecksV2Source,
  z.ZodTypeDef,
  unknown
> = z.union([
  z.lazy(() => CreateProjectCheckSourceChecksV21$inboundSchema),
  z.lazy(() => CreateProjectCheckSourceChecksV22$inboundSchema),
  z.lazy(() => CreateProjectCheckSource3$inboundSchema),
]);

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

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

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

/** @internal */
export const CreateProjectCheckResponseBody$inboundSchema: z.ZodType<
  CreateProjectCheckResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  id: types.string(),
  name: types.string(),
  ownerId: types.string(),
  projectId: types.string(),
  isRerequestable: types.boolean(),
  requires: CreateProjectCheckRequires$inboundSchema,
  source: z.union([
    z.lazy(() => CreateProjectCheckSourceChecksV21$inboundSchema),
    z.lazy(() => CreateProjectCheckSourceChecksV22$inboundSchema),
    z.lazy(() => CreateProjectCheckSource3$inboundSchema),
  ]),
  blocks: CreateProjectCheckBlocks$inboundSchema,
  targets: z.array(types.string()),
  sourceKind: SourceKind$inboundSchema,
  sourceIntegrationConfigurationId: types.optional(types.string()),
  timeout: types.number(),
  createdAt: types.number(),
  updatedAt: types.number(),
  deletedAt: types.optional(types.number()),
});

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