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

export type ListCheckRunsRequest = {
  projectIdOrName: string;
  /**
   * The ID of the resource that will be updated.
   */
  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;
};

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

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

export const ListCheckRunsRunsStatus = {
  Completed: "completed",
  Queued: "queued",
  Running: "running",
} as const;
export type ListCheckRunsRunsStatus = ClosedEnum<
  typeof ListCheckRunsRunsStatus
>;

export const RunsConclusion = {
  Canceled: "canceled",
  Failed: "failed",
  Neutral: "neutral",
  Skipped: "skipped",
  Succeeded: "succeeded",
  Timeout: "timeout",
} as const;
export type RunsConclusion = ClosedEnum<typeof RunsConclusion>;

export const ListCheckRunsSourceOrigin = {
  Platform: "platform",
} as const;
export type ListCheckRunsSourceOrigin = ClosedEnum<
  typeof ListCheckRunsSourceOrigin
>;

/**
 * CI sentinel — check run `source` only (no parent check).
 */
export type ListCheckRunsSourceChecksV22 = {
  subKind: "vercel-ci-sentinel";
  origin: ListCheckRunsSourceOrigin;
};

export const ListCheckRunsSourceChecksV2ResponseOrigin = {
  Config: "config",
} as const;
export type ListCheckRunsSourceChecksV2ResponseOrigin = ClosedEnum<
  typeof ListCheckRunsSourceChecksV2ResponseOrigin
>;

/**
 * Config-driven CI task — check run `source` only (no parent check).
 */
export type ListCheckRunsSourceChecksV21 = {
  subKind: "vercel-ci";
  origin: ListCheckRunsSourceChecksV2ResponseOrigin;
  invocationId: string;
  jobDefinitionId: string;
};

export type ListCheckRunsRunsSource =
  | ListCheckRunsSourceChecksV21
  | ListCheckRunsSourceChecksV22;

/**
 * Vercel CI check run without a parent `check` (no `checkId` field).
 */
export type Runs2 = {
  id: string;
  name: string;
  ownerId: string;
  deploymentId: string;
  projectId?: string | undefined;
  requires?: ListCheckRunsRunsRequires | undefined;
  blocks?: ListCheckRunsRunsBlocks | undefined;
  targets?: Array<string> | undefined;
  status: ListCheckRunsRunsStatus;
  conclusion?: RunsConclusion | undefined;
  conclusionText?: string | undefined;
  externalId?: string | undefined;
  externalUrl?: string | undefined;
  output?: { [k: string]: any } | undefined;
  timeout: number;
  createdAt: number;
  updatedAt: number;
  completedAt?: number | undefined;
  source: ListCheckRunsSourceChecksV21 | ListCheckRunsSourceChecksV22;
};

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

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

export const RunsStatus = {
  Completed: "completed",
  Queued: "queued",
  Running: "running",
} as const;
export type RunsStatus = ClosedEnum<typeof RunsStatus>;

export const ListCheckRunsRunsConclusion = {
  Canceled: "canceled",
  Failed: "failed",
  Neutral: "neutral",
  Skipped: "skipped",
  Succeeded: "succeeded",
  Timeout: "timeout",
} as const;
export type ListCheckRunsRunsConclusion = ClosedEnum<
  typeof ListCheckRunsRunsConclusion
>;

export const ListCheckRunsSourceChecksV2SubKind = {
  VercelNativeCheck: "vercel-native-check",
} as const;
export type ListCheckRunsSourceChecksV2SubKind = ClosedEnum<
  typeof ListCheckRunsSourceChecksV2SubKind
>;

export const ListCheckRunsSourceChecksV2Origin = {
  Api: "api",
  Platform: "platform",
} as const;
export type ListCheckRunsSourceChecksV2Origin = ClosedEnum<
  typeof ListCheckRunsSourceChecksV2Origin
>;

/**
 * Native Vercel checks — check definition and check run `source`.
 */
export type ListCheckRunsSource4 = {
  subKind?: ListCheckRunsSourceChecksV2SubKind | undefined;
  origin?: ListCheckRunsSourceChecksV2Origin | undefined;
};

export const ListCheckRunsSourceChecksV2ResponseKind = {
  GitProvider: "git-provider",
} as const;
export type ListCheckRunsSourceChecksV2ResponseKind = ClosedEnum<
  typeof ListCheckRunsSourceChecksV2ResponseKind
>;

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

export type ListCheckRunsSource3 = {
  kind: ListCheckRunsSourceChecksV2ResponseKind;
  provider: ListCheckRunsSourceProvider;
  externalCheckName: string;
};

export const ListCheckRunsSourceChecksV2Kind = {
  Webhook: "webhook",
} as const;
export type ListCheckRunsSourceChecksV2Kind = ClosedEnum<
  typeof ListCheckRunsSourceChecksV2Kind
>;

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

export const ListCheckRunsSourceKind = {
  Integration: "integration",
} as const;
export type ListCheckRunsSourceKind = ClosedEnum<
  typeof ListCheckRunsSourceKind
>;

export type ListCheckRunsSource1 = {
  kind: ListCheckRunsSourceKind;
  integrationId: string;
  integrationConfigurationId: string;
  resourceId?: string | undefined;
  externalResourceId?: string | undefined;
};

export type RunsSource =
  | ListCheckRunsSource1
  | ListCheckRunsSource3
  | ListCheckRunsSource2
  | ListCheckRunsSource4;

/**
 * Check run backed by a project-level `check` definition.
 */
export type Runs1 = {
  id: string;
  name: string;
  ownerId: string;
  deploymentId: string;
  projectId?: string | undefined;
  requires?: RunsRequires | undefined;
  blocks?: RunsBlocks | undefined;
  targets?: Array<string> | undefined;
  status: RunsStatus;
  conclusion?: ListCheckRunsRunsConclusion | undefined;
  conclusionText?: string | undefined;
  externalId?: string | undefined;
  externalUrl?: string | undefined;
  output?: { [k: string]: any } | undefined;
  timeout: number;
  createdAt: number;
  updatedAt: number;
  completedAt?: number | undefined;
  checkId: string;
  source:
    | ListCheckRunsSource1
    | ListCheckRunsSource3
    | ListCheckRunsSource2
    | ListCheckRunsSource4;
};

export type Runs = Runs1 | Runs2;

export type ListCheckRunsResponseBody = {
  runs: Array<Runs1 | Runs2>;
};

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

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

export function listCheckRunsRequestToJSON(
  listCheckRunsRequest: ListCheckRunsRequest,
): string {
  return JSON.stringify(
    ListCheckRunsRequest$outboundSchema.parse(listCheckRunsRequest),
  );
}

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

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

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

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

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

/** @internal */
export const ListCheckRunsSourceChecksV22$inboundSchema: z.ZodType<
  ListCheckRunsSourceChecksV22,
  z.ZodTypeDef,
  unknown
> = z.object({
  subKind: types.literal("vercel-ci-sentinel"),
  origin: ListCheckRunsSourceOrigin$inboundSchema,
});

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

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

/** @internal */
export const ListCheckRunsSourceChecksV21$inboundSchema: z.ZodType<
  ListCheckRunsSourceChecksV21,
  z.ZodTypeDef,
  unknown
> = z.object({
  subKind: types.literal("vercel-ci"),
  origin: ListCheckRunsSourceChecksV2ResponseOrigin$inboundSchema,
  invocationId: types.string(),
  jobDefinitionId: types.string(),
});

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

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

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

/** @internal */
export const Runs2$inboundSchema: z.ZodType<Runs2, z.ZodTypeDef, unknown> = z
  .object({
    id: types.string(),
    name: types.string(),
    ownerId: types.string(),
    deploymentId: types.string(),
    projectId: types.optional(types.string()),
    requires: types.optional(ListCheckRunsRunsRequires$inboundSchema),
    blocks: types.optional(ListCheckRunsRunsBlocks$inboundSchema),
    targets: types.optional(z.array(types.string())),
    status: ListCheckRunsRunsStatus$inboundSchema,
    conclusion: types.optional(RunsConclusion$inboundSchema),
    conclusionText: types.optional(types.string()),
    externalId: types.optional(types.string()),
    externalUrl: types.optional(types.string()),
    output: types.optional(z.record(z.any())),
    timeout: types.number(),
    createdAt: types.number(),
    updatedAt: types.number(),
    completedAt: types.optional(types.number()),
    source: z.union([
      z.lazy(() => ListCheckRunsSourceChecksV21$inboundSchema),
      z.lazy(() => ListCheckRunsSourceChecksV22$inboundSchema),
    ]),
  });

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

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

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

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

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

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

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

/** @internal */
export const ListCheckRunsSource4$inboundSchema: z.ZodType<
  ListCheckRunsSource4,
  z.ZodTypeDef,
  unknown
> = z.object({
  subKind: types.optional(ListCheckRunsSourceChecksV2SubKind$inboundSchema),
  origin: types.optional(ListCheckRunsSourceChecksV2Origin$inboundSchema),
});

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

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

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

/** @internal */
export const ListCheckRunsSource3$inboundSchema: z.ZodType<
  ListCheckRunsSource3,
  z.ZodTypeDef,
  unknown
> = z.object({
  kind: ListCheckRunsSourceChecksV2ResponseKind$inboundSchema,
  provider: ListCheckRunsSourceProvider$inboundSchema,
  externalCheckName: types.string(),
});

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

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

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

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

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

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

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

/** @internal */
export const RunsSource$inboundSchema: z.ZodType<
  RunsSource,
  z.ZodTypeDef,
  unknown
> = smartUnion([
  z.lazy(() => ListCheckRunsSource1$inboundSchema),
  z.lazy(() => ListCheckRunsSource3$inboundSchema),
  z.lazy(() => ListCheckRunsSource2$inboundSchema),
  z.lazy(() => ListCheckRunsSource4$inboundSchema),
]);

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

/** @internal */
export const Runs1$inboundSchema: z.ZodType<Runs1, z.ZodTypeDef, unknown> = z
  .object({
    id: types.string(),
    name: types.string(),
    ownerId: types.string(),
    deploymentId: types.string(),
    projectId: types.optional(types.string()),
    requires: types.optional(RunsRequires$inboundSchema),
    blocks: types.optional(RunsBlocks$inboundSchema),
    targets: types.optional(z.array(types.string())),
    status: RunsStatus$inboundSchema,
    conclusion: types.optional(ListCheckRunsRunsConclusion$inboundSchema),
    conclusionText: types.optional(types.string()),
    externalId: types.optional(types.string()),
    externalUrl: types.optional(types.string()),
    output: types.optional(z.record(z.any())),
    timeout: types.number(),
    createdAt: types.number(),
    updatedAt: types.number(),
    completedAt: types.optional(types.number()),
    checkId: types.string(),
    source: smartUnion([
      z.lazy(() => ListCheckRunsSource1$inboundSchema),
      z.lazy(() => ListCheckRunsSource3$inboundSchema),
      z.lazy(() => ListCheckRunsSource2$inboundSchema),
      z.lazy(() => ListCheckRunsSource4$inboundSchema),
    ]),
  });

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

/** @internal */
export const Runs$inboundSchema: z.ZodType<Runs, z.ZodTypeDef, unknown> =
  smartUnion([
    z.lazy(() => Runs1$inboundSchema),
    z.lazy(() => Runs2$inboundSchema),
  ]);

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

/** @internal */
export const ListCheckRunsResponseBody$inboundSchema: z.ZodType<
  ListCheckRunsResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  runs: z.array(
    smartUnion([
      z.lazy(() => Runs1$inboundSchema),
      z.lazy(() => Runs2$inboundSchema),
    ]),
  ),
});

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