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

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

export type ListProjectChecksRequest = {
  projectIdOrName: string;
  blocks?: QueryParamBlocks | undefined;
  /**
   * 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;
};

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

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

export type ListProjectChecksSource3 = {
  kind: "git-provider";
  provider: ListProjectChecksSourceProvider;
  externalCheckName: string;
};

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

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

export type ListProjectChecksSource =
  | ListProjectChecksSource1
  | ListProjectChecksSource2
  | ListProjectChecksSource3;

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

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

export type Checks = {
  id: string;
  name: string;
  ownerId: string;
  projectId: string;
  isRerequestable: boolean;
  requires: ListProjectChecksRequires;
  source:
    | ListProjectChecksSource1
    | ListProjectChecksSource2
    | ListProjectChecksSource3;
  blocks: ListProjectChecksBlocks;
  targets: Array<string>;
  sourceKind: ListProjectChecksSourceKind;
  sourceIntegrationConfigurationId?: string | undefined;
  timeout: number;
  createdAt: number;
  updatedAt: number;
  deletedAt?: number | undefined;
};

export type ListProjectChecksResponseBody = {
  checks: Array<Checks>;
};

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

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

/** @internal */
export const ListProjectChecksRequest$outboundSchema: z.ZodType<
  ListProjectChecksRequest$Outbound,
  z.ZodTypeDef,
  ListProjectChecksRequest
> = z.object({
  projectIdOrName: z.string(),
  blocks: QueryParamBlocks$outboundSchema.optional(),
  teamId: z.string().optional(),
  slug: z.string().optional(),
});

export function listProjectChecksRequestToJSON(
  listProjectChecksRequest: ListProjectChecksRequest,
): string {
  return JSON.stringify(
    ListProjectChecksRequest$outboundSchema.parse(listProjectChecksRequest),
  );
}

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

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

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

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

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

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

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

/** @internal */
export const ListProjectChecksSource$inboundSchema: z.ZodType<
  ListProjectChecksSource,
  z.ZodTypeDef,
  unknown
> = z.union([
  z.lazy(() => ListProjectChecksSource1$inboundSchema),
  z.lazy(() => ListProjectChecksSource2$inboundSchema),
  z.lazy(() => ListProjectChecksSource3$inboundSchema),
]);

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

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

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

/** @internal */
export const Checks$inboundSchema: z.ZodType<Checks, z.ZodTypeDef, unknown> = z
  .object({
    id: types.string(),
    name: types.string(),
    ownerId: types.string(),
    projectId: types.string(),
    isRerequestable: types.boolean(),
    requires: ListProjectChecksRequires$inboundSchema,
    source: z.union([
      z.lazy(() => ListProjectChecksSource1$inboundSchema),
      z.lazy(() => ListProjectChecksSource2$inboundSchema),
      z.lazy(() => ListProjectChecksSource3$inboundSchema),
    ]),
    blocks: ListProjectChecksBlocks$inboundSchema,
    targets: z.array(types.string()),
    sourceKind: ListProjectChecksSourceKind$inboundSchema,
    sourceIntegrationConfigurationId: types.optional(types.string()),
    timeout: types.number(),
    createdAt: types.number(),
    updatedAt: types.number(),
    deletedAt: types.optional(types.number()),
  });

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

/** @internal */
export const ListProjectChecksResponseBody$inboundSchema: z.ZodType<
  ListProjectChecksResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  checks: z.array(z.lazy(() => Checks$inboundSchema)),
});

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