/*
 * 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 Type = {
  Deny: "deny",
  Rewrite: "rewrite",
} as const;
export type Type = ClosedEnum<typeof Type>;

export type Match = {
  model?: string | undefined;
};

export type Action = {
  rewriteModel?: string | undefined;
  reason?: string | undefined;
};

/**
 * Public response shape for AI Gateway routing rules. Used so OpenAPI generation can avoid ElectroDB's recursive EntityItem types.
 */
export type AiGatewayRule = {
  ownerId: string;
  ruleId: string;
  type: Type;
  match?: Match | undefined;
  action?: Action | undefined;
  enabled: boolean;
  deleted?: boolean | undefined;
  description?: string | undefined;
  createdBy?: string | undefined;
  updatedBy?: string | undefined;
  createdAt: number;
  updatedAt: number;
};

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

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

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

/** @internal */
export const Action$inboundSchema: z.ZodType<Action, z.ZodTypeDef, unknown> = z
  .object({
    rewriteModel: types.optional(types.string()),
    reason: types.optional(types.string()),
  });

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

/** @internal */
export const AiGatewayRule$inboundSchema: z.ZodType<
  AiGatewayRule,
  z.ZodTypeDef,
  unknown
> = z.object({
  ownerId: types.string(),
  ruleId: types.string(),
  type: Type$inboundSchema,
  match: types.optional(z.lazy(() => Match$inboundSchema)),
  action: types.optional(z.lazy(() => Action$inboundSchema)),
  enabled: types.boolean(),
  deleted: types.optional(types.boolean()),
  description: types.optional(types.string()),
  createdBy: types.optional(types.string()),
  updatedBy: types.optional(types.string()),
  createdAt: types.number(),
  updatedAt: types.number(),
});

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