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

import * as z from "zod";
import { safeParse } from "../../lib/schemas.js";
import { Result as SafeParseResult } from "../../types/fp.js";
import { SDKValidationError } from "../errors/sdkvalidationerror.js";
import {
  LeadCreatedEvent,
  LeadCreatedEvent$inboundSchema,
  LeadCreatedEvent$Outbound,
  LeadCreatedEvent$outboundSchema,
} from "./leadcreatedevent.js";
import {
  LinkClickedEvent,
  LinkClickedEvent$inboundSchema,
  LinkClickedEvent$Outbound,
  LinkClickedEvent$outboundSchema,
} from "./linkclickedevent.js";
import {
  LinkWebhookEvent,
  LinkWebhookEvent$inboundSchema,
  LinkWebhookEvent$Outbound,
  LinkWebhookEvent$outboundSchema,
} from "./linkwebhookevent.js";
import {
  SaleCreatedEvent,
  SaleCreatedEvent$inboundSchema,
  SaleCreatedEvent$Outbound,
  SaleCreatedEvent$outboundSchema,
} from "./salecreatedevent.js";

/**
 * Webhook event schema
 */
export type WebhookEvent =
  | LinkWebhookEvent
  | LinkClickedEvent
  | LeadCreatedEvent
  | SaleCreatedEvent;

/** @internal */
export const WebhookEvent$inboundSchema: z.ZodType<
  WebhookEvent,
  z.ZodTypeDef,
  unknown
> = z.union([
  LinkWebhookEvent$inboundSchema,
  LinkClickedEvent$inboundSchema,
  LeadCreatedEvent$inboundSchema,
  SaleCreatedEvent$inboundSchema,
]);

/** @internal */
export type WebhookEvent$Outbound =
  | LinkWebhookEvent$Outbound
  | LinkClickedEvent$Outbound
  | LeadCreatedEvent$Outbound
  | SaleCreatedEvent$Outbound;

/** @internal */
export const WebhookEvent$outboundSchema: z.ZodType<
  WebhookEvent$Outbound,
  z.ZodTypeDef,
  WebhookEvent
> = z.union([
  LinkWebhookEvent$outboundSchema,
  LinkClickedEvent$outboundSchema,
  LeadCreatedEvent$outboundSchema,
  SaleCreatedEvent$outboundSchema,
]);

/**
 * @internal
 * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
 */
export namespace WebhookEvent$ {
  /** @deprecated use `WebhookEvent$inboundSchema` instead. */
  export const inboundSchema = WebhookEvent$inboundSchema;
  /** @deprecated use `WebhookEvent$outboundSchema` instead. */
  export const outboundSchema = WebhookEvent$outboundSchema;
  /** @deprecated use `WebhookEvent$Outbound` instead. */
  export type Outbound = WebhookEvent$Outbound;
}

export function webhookEventToJSON(webhookEvent: WebhookEvent): string {
  return JSON.stringify(WebhookEvent$outboundSchema.parse(webhookEvent));
}

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