/*
 * 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 { smartUnion } from "../../types/smartUnion.js";
import {
  AttachedCustomFieldCreate,
  AttachedCustomFieldCreate$Outbound,
  AttachedCustomFieldCreate$outboundSchema,
} from "./attachedcustomfieldcreate.js";
import {
  ProductPriceCustomCreate,
  ProductPriceCustomCreate$Outbound,
  ProductPriceCustomCreate$outboundSchema,
} from "./productpricecustomcreate.js";
import {
  ProductPriceFixedCreate,
  ProductPriceFixedCreate$Outbound,
  ProductPriceFixedCreate$outboundSchema,
} from "./productpricefixedcreate.js";
import {
  ProductPriceMeteredUnitCreate,
  ProductPriceMeteredUnitCreate$Outbound,
  ProductPriceMeteredUnitCreate$outboundSchema,
} from "./productpricemeteredunitcreate.js";
import {
  ProductPriceSeatBasedCreate,
  ProductPriceSeatBasedCreate$Outbound,
  ProductPriceSeatBasedCreate$outboundSchema,
} from "./productpriceseatbasedcreate.js";
import {
  ProductVisibility,
  ProductVisibility$outboundSchema,
} from "./productvisibility.js";

export type ProductCreateOneTimeMetadata = string | number | number | boolean;

export type ProductCreateOneTimePrices =
  | ProductPriceCustomCreate
  | ProductPriceFixedCreate
  | ProductPriceMeteredUnitCreate
  | ProductPriceSeatBasedCreate;

export type ProductCreateOneTime = {
  /**
   * Key-value object allowing you to store additional information.
   *
   * @remarks
   *
   * The key must be a string with a maximum length of **40 characters**.
   * The value must be either:
   *
   * * A string with a maximum length of **500 characters**
   * * An integer
   * * A floating-point number
   * * A boolean
   *
   * You can store up to **50 key-value pairs**.
   */
  metadata?: { [k: string]: string | number | number | boolean } | undefined;
  /**
   * The name of the product.
   */
  name: string;
  /**
   * The description of the product.
   */
  description?: string | null | undefined;
  visibility?: ProductVisibility | undefined;
  /**
   * List of available prices for this product. It may combine at most one fixed price with one seat-based price (billed as `fixed + seat_charge`), or contain a single custom or free price, plus any number of metered prices. A free price cannot be combined with other prices, and a custom price cannot be combined with a fixed or seat-based price. Metered prices are not supported on one-time purchase products.
   */
  prices: Array<
    | ProductPriceCustomCreate
    | ProductPriceFixedCreate
    | ProductPriceMeteredUnitCreate
    | ProductPriceSeatBasedCreate
  >;
  /**
   * List of file IDs. Each one must be on the same organization as the product, of type `product_media` and correctly uploaded.
   */
  medias?: Array<string> | null | undefined;
  /**
   * List of custom fields to attach.
   */
  attachedCustomFields?: Array<AttachedCustomFieldCreate> | undefined;
  /**
   * The ID of the organization owning the product. **Required unless you use an organization token.**
   */
  organizationId?: string | null | undefined;
  /**
   * States that the product is a one-time purchase.
   */
  recurringInterval?: any | null | undefined;
  /**
   * One-time products don't have a recurring interval count.
   */
  recurringIntervalCount?: any | null | undefined;
};

/** @internal */
export type ProductCreateOneTimeMetadata$Outbound =
  | string
  | number
  | number
  | boolean;

/** @internal */
export const ProductCreateOneTimeMetadata$outboundSchema: z.ZodMiniType<
  ProductCreateOneTimeMetadata$Outbound,
  ProductCreateOneTimeMetadata
> = smartUnion([z.string(), z.int(), z.number(), z.boolean()]);

export function productCreateOneTimeMetadataToJSON(
  productCreateOneTimeMetadata: ProductCreateOneTimeMetadata,
): string {
  return JSON.stringify(
    ProductCreateOneTimeMetadata$outboundSchema.parse(
      productCreateOneTimeMetadata,
    ),
  );
}

/** @internal */
export type ProductCreateOneTimePrices$Outbound =
  | ProductPriceCustomCreate$Outbound
  | ProductPriceFixedCreate$Outbound
  | ProductPriceMeteredUnitCreate$Outbound
  | ProductPriceSeatBasedCreate$Outbound;

/** @internal */
export const ProductCreateOneTimePrices$outboundSchema: z.ZodMiniType<
  ProductCreateOneTimePrices$Outbound,
  ProductCreateOneTimePrices
> = z.union([
  ProductPriceCustomCreate$outboundSchema,
  ProductPriceFixedCreate$outboundSchema,
  ProductPriceMeteredUnitCreate$outboundSchema,
  ProductPriceSeatBasedCreate$outboundSchema,
]);

export function productCreateOneTimePricesToJSON(
  productCreateOneTimePrices: ProductCreateOneTimePrices,
): string {
  return JSON.stringify(
    ProductCreateOneTimePrices$outboundSchema.parse(productCreateOneTimePrices),
  );
}

/** @internal */
export type ProductCreateOneTime$Outbound = {
  metadata?: { [k: string]: string | number | number | boolean } | undefined;
  name: string;
  description?: string | null | undefined;
  visibility?: string | undefined;
  prices: Array<
    | ProductPriceCustomCreate$Outbound
    | ProductPriceFixedCreate$Outbound
    | ProductPriceMeteredUnitCreate$Outbound
    | ProductPriceSeatBasedCreate$Outbound
  >;
  medias?: Array<string> | null | undefined;
  attached_custom_fields?:
    | Array<AttachedCustomFieldCreate$Outbound>
    | undefined;
  organization_id?: string | null | undefined;
  recurring_interval?: any | null | undefined;
  recurring_interval_count?: any | null | undefined;
};

/** @internal */
export const ProductCreateOneTime$outboundSchema: z.ZodMiniType<
  ProductCreateOneTime$Outbound,
  ProductCreateOneTime
> = z.pipe(
  z.object({
    metadata: z.optional(
      z.record(
        z.string(),
        smartUnion([z.string(), z.int(), z.number(), z.boolean()]),
      ),
    ),
    name: z.string(),
    description: z.optional(z.nullable(z.string())),
    visibility: z.optional(ProductVisibility$outboundSchema),
    prices: z.array(
      z.union([
        ProductPriceCustomCreate$outboundSchema,
        ProductPriceFixedCreate$outboundSchema,
        ProductPriceMeteredUnitCreate$outboundSchema,
        ProductPriceSeatBasedCreate$outboundSchema,
      ]),
    ),
    medias: z.optional(z.nullable(z.array(z.string()))),
    attachedCustomFields: z.optional(
      z.array(AttachedCustomFieldCreate$outboundSchema),
    ),
    organizationId: z.optional(z.nullable(z.string())),
    recurringInterval: z.optional(z.nullable(z.any())),
    recurringIntervalCount: z.optional(z.nullable(z.any())),
  }),
  z.transform((v) => {
    return remap$(v, {
      attachedCustomFields: "attached_custom_fields",
      organizationId: "organization_id",
      recurringInterval: "recurring_interval",
      recurringIntervalCount: "recurring_interval_count",
    });
  }),
);

export function productCreateOneTimeToJSON(
  productCreateOneTime: ProductCreateOneTime,
): string {
  return JSON.stringify(
    ProductCreateOneTime$outboundSchema.parse(productCreateOneTime),
  );
}
