/*
 * 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 type AddBypassIpRequestBody2 = {
  domain?: string | undefined;
  /**
   * If the specified bypass will apply to all domains for a project.
   */
  projectScope: boolean;
  sourceIp?: string | undefined;
  allSources?: boolean | undefined;
  /**
   * Time to live in milliseconds
   */
  ttl?: number | undefined;
  note?: string | undefined;
};

export type AddBypassIpRequestBody1 = {
  domain: string;
  /**
   * If the specified bypass will apply to all domains for a project.
   */
  projectScope?: boolean | undefined;
  sourceIp?: string | undefined;
  allSources?: boolean | undefined;
  /**
   * Time to live in milliseconds
   */
  ttl?: number | undefined;
  note?: string | undefined;
};

export type AddBypassIpRequestBody =
  | AddBypassIpRequestBody1
  | AddBypassIpRequestBody2;

export type AddBypassIpRequest = {
  projectId: 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?: AddBypassIpRequestBody1 | AddBypassIpRequestBody2 | undefined;
};

export const ResponseBodyAction = {
  Block: "block",
  Bypass: "bypass",
} as const;
export type ResponseBodyAction = ClosedEnum<typeof ResponseBodyAction>;

export type AddBypassIpResponseBodyResult = {
  ownerId: string;
  id: string;
  domain: string;
  ip: string;
  action?: ResponseBodyAction | undefined;
  projectId?: string | undefined;
  isProjectRule?: boolean | undefined;
  note?: string | undefined;
  createdAt: string;
  actorId?: string | undefined;
  updatedAt: string;
  updatedAtHour: string;
  deletedAt?: string | undefined;
  expiresAt?: number | null | undefined;
};

export type AddBypassIpResponseBody2 = {
  ok: boolean;
  result?: Array<AddBypassIpResponseBodyResult> | undefined;
};

export type ResponseBodyResult = {
  ownerId: string;
  id: string;
  domain: string;
  ip?: string | undefined;
  projectId: string;
  note: string;
  isProjectRule: boolean;
};

export type AddBypassIpResponseBody1 = {
  ok: boolean;
  result: Array<ResponseBodyResult>;
  pagination?: any | null | undefined;
};

export type AddBypassIpResponseBody =
  | AddBypassIpResponseBody1
  | AddBypassIpResponseBody2;

/** @internal */
export type AddBypassIpRequestBody2$Outbound = {
  domain?: string | undefined;
  projectScope: boolean;
  sourceIp?: string | undefined;
  allSources?: boolean | undefined;
  ttl?: number | undefined;
  note?: string | undefined;
};

/** @internal */
export const AddBypassIpRequestBody2$outboundSchema: z.ZodType<
  AddBypassIpRequestBody2$Outbound,
  z.ZodTypeDef,
  AddBypassIpRequestBody2
> = z.object({
  domain: z.string().optional(),
  projectScope: z.boolean(),
  sourceIp: z.string().optional(),
  allSources: z.boolean().optional(),
  ttl: z.number().optional(),
  note: z.string().optional(),
});

export function addBypassIpRequestBody2ToJSON(
  addBypassIpRequestBody2: AddBypassIpRequestBody2,
): string {
  return JSON.stringify(
    AddBypassIpRequestBody2$outboundSchema.parse(addBypassIpRequestBody2),
  );
}

/** @internal */
export type AddBypassIpRequestBody1$Outbound = {
  domain: string;
  projectScope?: boolean | undefined;
  sourceIp?: string | undefined;
  allSources?: boolean | undefined;
  ttl?: number | undefined;
  note?: string | undefined;
};

/** @internal */
export const AddBypassIpRequestBody1$outboundSchema: z.ZodType<
  AddBypassIpRequestBody1$Outbound,
  z.ZodTypeDef,
  AddBypassIpRequestBody1
> = z.object({
  domain: z.string(),
  projectScope: z.boolean().optional(),
  sourceIp: z.string().optional(),
  allSources: z.boolean().optional(),
  ttl: z.number().optional(),
  note: z.string().optional(),
});

export function addBypassIpRequestBody1ToJSON(
  addBypassIpRequestBody1: AddBypassIpRequestBody1,
): string {
  return JSON.stringify(
    AddBypassIpRequestBody1$outboundSchema.parse(addBypassIpRequestBody1),
  );
}

/** @internal */
export type AddBypassIpRequestBody$Outbound =
  | AddBypassIpRequestBody1$Outbound
  | AddBypassIpRequestBody2$Outbound;

/** @internal */
export const AddBypassIpRequestBody$outboundSchema: z.ZodType<
  AddBypassIpRequestBody$Outbound,
  z.ZodTypeDef,
  AddBypassIpRequestBody
> = smartUnion([
  z.lazy(() => AddBypassIpRequestBody1$outboundSchema),
  z.lazy(() => AddBypassIpRequestBody2$outboundSchema),
]);

export function addBypassIpRequestBodyToJSON(
  addBypassIpRequestBody: AddBypassIpRequestBody,
): string {
  return JSON.stringify(
    AddBypassIpRequestBody$outboundSchema.parse(addBypassIpRequestBody),
  );
}

/** @internal */
export type AddBypassIpRequest$Outbound = {
  projectId: string;
  teamId?: string | undefined;
  slug?: string | undefined;
  RequestBody?:
    | AddBypassIpRequestBody1$Outbound
    | AddBypassIpRequestBody2$Outbound
    | undefined;
};

/** @internal */
export const AddBypassIpRequest$outboundSchema: z.ZodType<
  AddBypassIpRequest$Outbound,
  z.ZodTypeDef,
  AddBypassIpRequest
> = z.object({
  projectId: z.string(),
  teamId: z.string().optional(),
  slug: z.string().optional(),
  requestBody: smartUnion([
    z.lazy(() => AddBypassIpRequestBody1$outboundSchema),
    z.lazy(() => AddBypassIpRequestBody2$outboundSchema),
  ]).optional(),
}).transform((v) => {
  return remap$(v, {
    requestBody: "RequestBody",
  });
});

export function addBypassIpRequestToJSON(
  addBypassIpRequest: AddBypassIpRequest,
): string {
  return JSON.stringify(
    AddBypassIpRequest$outboundSchema.parse(addBypassIpRequest),
  );
}

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

/** @internal */
export const AddBypassIpResponseBodyResult$inboundSchema: z.ZodType<
  AddBypassIpResponseBodyResult,
  z.ZodTypeDef,
  unknown
> = z.object({
  OwnerId: types.string(),
  Id: types.string(),
  Domain: types.string(),
  Ip: types.string(),
  Action: types.optional(ResponseBodyAction$inboundSchema),
  ProjectId: types.optional(types.string()),
  IsProjectRule: types.optional(types.boolean()),
  Note: types.optional(types.string()),
  CreatedAt: types.string(),
  ActorId: types.optional(types.string()),
  UpdatedAt: types.string(),
  UpdatedAtHour: types.string(),
  DeletedAt: types.optional(types.string()),
  ExpiresAt: z.nullable(types.number()).optional(),
}).transform((v) => {
  return remap$(v, {
    "OwnerId": "ownerId",
    "Id": "id",
    "Domain": "domain",
    "Ip": "ip",
    "Action": "action",
    "ProjectId": "projectId",
    "IsProjectRule": "isProjectRule",
    "Note": "note",
    "CreatedAt": "createdAt",
    "ActorId": "actorId",
    "UpdatedAt": "updatedAt",
    "UpdatedAtHour": "updatedAtHour",
    "DeletedAt": "deletedAt",
    "ExpiresAt": "expiresAt",
  });
});

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

/** @internal */
export const AddBypassIpResponseBody2$inboundSchema: z.ZodType<
  AddBypassIpResponseBody2,
  z.ZodTypeDef,
  unknown
> = z.object({
  ok: types.boolean(),
  result: types.optional(
    z.array(z.lazy(() => AddBypassIpResponseBodyResult$inboundSchema)),
  ),
});

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

/** @internal */
export const ResponseBodyResult$inboundSchema: z.ZodType<
  ResponseBodyResult,
  z.ZodTypeDef,
  unknown
> = z.object({
  OwnerId: types.string(),
  Id: types.string(),
  Domain: types.string(),
  Ip: types.optional(types.string()),
  ProjectId: types.string(),
  Note: types.string(),
  IsProjectRule: types.boolean(),
}).transform((v) => {
  return remap$(v, {
    "OwnerId": "ownerId",
    "Id": "id",
    "Domain": "domain",
    "Ip": "ip",
    "ProjectId": "projectId",
    "Note": "note",
    "IsProjectRule": "isProjectRule",
  });
});

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

/** @internal */
export const AddBypassIpResponseBody1$inboundSchema: z.ZodType<
  AddBypassIpResponseBody1,
  z.ZodTypeDef,
  unknown
> = z.object({
  ok: types.boolean(),
  result: z.array(z.lazy(() => ResponseBodyResult$inboundSchema)),
  pagination: z.nullable(z.any()).optional(),
});

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

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

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