/*
 * 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 { Result as SafeParseResult } from "../../types/fp.js";
import { SDKValidationError } from "../errors/sdkvalidationerror.js";
import {
  AIConfigTargetingEnvironmentFallthrough,
  AIConfigTargetingEnvironmentFallthrough$inboundSchema,
  AIConfigTargetingEnvironmentFallthrough$Outbound,
  AIConfigTargetingEnvironmentFallthrough$outboundSchema,
} from "./aiconfigtargetingenvironmentfallthrough.js";
import {
  AIConfigTargetingEnvironmentRule,
  AIConfigTargetingEnvironmentRule$inboundSchema,
  AIConfigTargetingEnvironmentRule$Outbound,
  AIConfigTargetingEnvironmentRule$outboundSchema,
} from "./aiconfigtargetingenvironmentrule.js";
import {
  AIConfigTargetingEnvironmentTarget,
  AIConfigTargetingEnvironmentTarget$inboundSchema,
  AIConfigTargetingEnvironmentTarget$Outbound,
  AIConfigTargetingEnvironmentTarget$outboundSchema,
} from "./aiconfigtargetingenvironmenttarget.js";

export type AIConfigTargetingEnvironment = {
  /**
   * Individual context targets for non-user context kinds
   */
  contextTargets: Array<AIConfigTargetingEnvironmentTarget>;
  /**
   * Whether targeting is on in this environment
   */
  enabled: boolean;
  fallthrough: AIConfigTargetingEnvironmentFallthrough;
  lastModified: number;
  /**
   * Index of the variation served when targeting is off
   */
  offVariation?: number | undefined;
  /**
   * The targeting rules
   */
  rules: Array<AIConfigTargetingEnvironmentRule>;
  /**
   * Individual user targets
   */
  targets: Array<AIConfigTargetingEnvironmentTarget>;
  /**
   * Whether to send detailed events for all evaluations
   */
  trackEvents: boolean;
  /**
   * Whether to send detailed events for evaluations that fall through to the default rule
   */
  trackEventsFallthrough: boolean;
  /**
   * The environment name
   */
  environmentName: string;
  /**
   * The version of the targeting in this environment
   */
  version: number;
};

/** @internal */
export const AIConfigTargetingEnvironment$inboundSchema: z.ZodType<
  AIConfigTargetingEnvironment,
  z.ZodTypeDef,
  unknown
> = z.object({
  contextTargets: z.array(AIConfigTargetingEnvironmentTarget$inboundSchema),
  enabled: z.boolean(),
  fallthrough: AIConfigTargetingEnvironmentFallthrough$inboundSchema,
  lastModified: z.number().int(),
  offVariation: z.number().int().optional(),
  rules: z.array(AIConfigTargetingEnvironmentRule$inboundSchema),
  targets: z.array(AIConfigTargetingEnvironmentTarget$inboundSchema),
  trackEvents: z.boolean(),
  trackEventsFallthrough: z.boolean(),
  _environmentName: z.string(),
  _version: z.number().int(),
}).transform((v) => {
  return remap$(v, {
    "_environmentName": "environmentName",
    "_version": "version",
  });
});
/** @internal */
export type AIConfigTargetingEnvironment$Outbound = {
  contextTargets: Array<AIConfigTargetingEnvironmentTarget$Outbound>;
  enabled: boolean;
  fallthrough: AIConfigTargetingEnvironmentFallthrough$Outbound;
  lastModified: number;
  offVariation?: number | undefined;
  rules: Array<AIConfigTargetingEnvironmentRule$Outbound>;
  targets: Array<AIConfigTargetingEnvironmentTarget$Outbound>;
  trackEvents: boolean;
  trackEventsFallthrough: boolean;
  _environmentName: string;
  _version: number;
};

/** @internal */
export const AIConfigTargetingEnvironment$outboundSchema: z.ZodType<
  AIConfigTargetingEnvironment$Outbound,
  z.ZodTypeDef,
  AIConfigTargetingEnvironment
> = z.object({
  contextTargets: z.array(AIConfigTargetingEnvironmentTarget$outboundSchema),
  enabled: z.boolean(),
  fallthrough: AIConfigTargetingEnvironmentFallthrough$outboundSchema,
  lastModified: z.number().int(),
  offVariation: z.number().int().optional(),
  rules: z.array(AIConfigTargetingEnvironmentRule$outboundSchema),
  targets: z.array(AIConfigTargetingEnvironmentTarget$outboundSchema),
  trackEvents: z.boolean(),
  trackEventsFallthrough: z.boolean(),
  environmentName: z.string(),
  version: z.number().int(),
}).transform((v) => {
  return remap$(v, {
    environmentName: "_environmentName",
    version: "_version",
  });
});

export function aiConfigTargetingEnvironmentToJSON(
  aiConfigTargetingEnvironment: AIConfigTargetingEnvironment,
): string {
  return JSON.stringify(
    AIConfigTargetingEnvironment$outboundSchema.parse(
      aiConfigTargetingEnvironment,
    ),
  );
}
export function aiConfigTargetingEnvironmentFromJSON(
  jsonString: string,
): SafeParseResult<AIConfigTargetingEnvironment, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => AIConfigTargetingEnvironment$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'AIConfigTargetingEnvironment' from JSON`,
  );
}
