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

import * as z from "zod/v4-mini";
import { remap as remap$ } from "../../lib/primitives.js";
import {
  EventMetadataInput,
  EventMetadataInput$Outbound,
  EventMetadataInput$outboundSchema,
} from "./eventmetadatainput.js";

export type EventCreateExternalCustomer = {
  /**
   * The timestamp of the event.
   */
  timestamp?: Date | undefined;
  /**
   * The name of the event.
   */
  name: string;
  /**
   * The ID of the organization owning the event. **Required unless you use an organization token.**
   */
  organizationId?: string | null | undefined;
  /**
   * Your unique identifier for this event. Useful for deduplication and parent-child relationships.
   */
  externalId?: string | null | undefined;
  /**
   * The ID of the parent event. Can be either a Polar event ID (UUID) or an external event ID.
   */
  parentId?: string | null | undefined;
  metadata?: { [k: string]: EventMetadataInput } | undefined;
  /**
   * ID of the customer in your system associated with the event.
   */
  externalCustomerId: string;
  /**
   * ID of the member in your system within the customer's organization who performed the action. Used for member-level attribution in B2B.
   */
  externalMemberId?: string | null | undefined;
};

/** @internal */
export type EventCreateExternalCustomer$Outbound = {
  timestamp?: string | undefined;
  name: string;
  organization_id?: string | null | undefined;
  external_id?: string | null | undefined;
  parent_id?: string | null | undefined;
  metadata?: { [k: string]: EventMetadataInput$Outbound } | undefined;
  external_customer_id: string;
  external_member_id?: string | null | undefined;
};

/** @internal */
export const EventCreateExternalCustomer$outboundSchema: z.ZodMiniType<
  EventCreateExternalCustomer$Outbound,
  EventCreateExternalCustomer
> = z.pipe(
  z.object({
    timestamp: z.optional(z.pipe(z.date(), z.transform(v => v.toISOString()))),
    name: z.string(),
    organizationId: z.optional(z.nullable(z.string())),
    externalId: z.optional(z.nullable(z.string())),
    parentId: z.optional(z.nullable(z.string())),
    metadata: z.optional(
      z.record(z.string(), EventMetadataInput$outboundSchema),
    ),
    externalCustomerId: z.string(),
    externalMemberId: z.optional(z.nullable(z.string())),
  }),
  z.transform((v) => {
    return remap$(v, {
      organizationId: "organization_id",
      externalId: "external_id",
      parentId: "parent_id",
      externalCustomerId: "external_customer_id",
      externalMemberId: "external_member_id",
    });
  }),
);

export function eventCreateExternalCustomerToJSON(
  eventCreateExternalCustomer: EventCreateExternalCustomer,
): string {
  return JSON.stringify(
    EventCreateExternalCustomer$outboundSchema.parse(
      eventCreateExternalCustomer,
    ),
  );
}
