/*
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

import * as z from "zod/v3";
import { remap as remap$ } from "../lib/primitives.js";

export type Event2 = {
  type: "resource.updated";
  /**
   * Partner-provided product slug or id
   */
  productId?: string | undefined;
  /**
   * Partner provided resource ID
   */
  resourceId: string;
};

export type Event1 = {
  type: "installation.updated";
  /**
   * The installation-level billing plan ID
   */
  billingPlanId?: string | undefined;
};

export type CreateEventEvent = Event1 | Event2;

export type CreateEventRequestBody = {
  event: Event1 | Event2;
};

export type CreateEventRequest = {
  integrationConfigurationId: string;
  requestBody: CreateEventRequestBody;
};

/** @internal */
export type Event2$Outbound = {
  type: "resource.updated";
  productId?: string | undefined;
  resourceId: string;
};

/** @internal */
export const Event2$outboundSchema: z.ZodType<
  Event2$Outbound,
  z.ZodTypeDef,
  Event2
> = z.object({
  type: z.literal("resource.updated"),
  productId: z.string().optional(),
  resourceId: z.string(),
});

export function event2ToJSON(event2: Event2): string {
  return JSON.stringify(Event2$outboundSchema.parse(event2));
}

/** @internal */
export type Event1$Outbound = {
  type: "installation.updated";
  billingPlanId?: string | undefined;
};

/** @internal */
export const Event1$outboundSchema: z.ZodType<
  Event1$Outbound,
  z.ZodTypeDef,
  Event1
> = z.object({
  type: z.literal("installation.updated"),
  billingPlanId: z.string().optional(),
});

export function event1ToJSON(event1: Event1): string {
  return JSON.stringify(Event1$outboundSchema.parse(event1));
}

/** @internal */
export type CreateEventEvent$Outbound = Event1$Outbound | Event2$Outbound;

/** @internal */
export const CreateEventEvent$outboundSchema: z.ZodType<
  CreateEventEvent$Outbound,
  z.ZodTypeDef,
  CreateEventEvent
> = z.union([
  z.lazy(() => Event1$outboundSchema),
  z.lazy(() => Event2$outboundSchema),
]);

export function createEventEventToJSON(
  createEventEvent: CreateEventEvent,
): string {
  return JSON.stringify(
    CreateEventEvent$outboundSchema.parse(createEventEvent),
  );
}

/** @internal */
export type CreateEventRequestBody$Outbound = {
  event: Event1$Outbound | Event2$Outbound;
};

/** @internal */
export const CreateEventRequestBody$outboundSchema: z.ZodType<
  CreateEventRequestBody$Outbound,
  z.ZodTypeDef,
  CreateEventRequestBody
> = z.object({
  event: z.union([
    z.lazy(() => Event1$outboundSchema),
    z.lazy(() => Event2$outboundSchema),
  ]),
});

export function createEventRequestBodyToJSON(
  createEventRequestBody: CreateEventRequestBody,
): string {
  return JSON.stringify(
    CreateEventRequestBody$outboundSchema.parse(createEventRequestBody),
  );
}

/** @internal */
export type CreateEventRequest$Outbound = {
  integrationConfigurationId: string;
  RequestBody: CreateEventRequestBody$Outbound;
};

/** @internal */
export const CreateEventRequest$outboundSchema: z.ZodType<
  CreateEventRequest$Outbound,
  z.ZodTypeDef,
  CreateEventRequest
> = z.object({
  integrationConfigurationId: z.string(),
  requestBody: z.lazy(() => CreateEventRequestBody$outboundSchema),
}).transform((v) => {
  return remap$(v, {
    requestBody: "RequestBody",
  });
});

export function createEventRequestToJSON(
  createEventRequest: CreateEventRequest,
): string {
  return JSON.stringify(
    CreateEventRequest$outboundSchema.parse(createEventRequest),
  );
}
