/*
 * 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 {
  CustomerCancellationReason,
  CustomerCancellationReason$outboundSchema,
} from "./customercancellationreason.js";

export type SubscriptionCancel = {
  /**
   * Customer reason for cancellation.
   *
   * @remarks
   *
   * Helpful to monitor reasons behind churn for future improvements.
   *
   * Only set this in case your own service is requesting the reason from the
   * customer. Or you know based on direct conversations, i.e support, with
   * the customer.
   *
   * * `too_expensive`: Too expensive for the customer.
   * * `missing_features`: Customer is missing certain features.
   * * `switched_service`: Customer switched to another service.
   * * `unused`: Customer is not using it enough.
   * * `customer_service`: Customer is not satisfied with the customer service.
   * * `low_quality`: Customer is unhappy with the quality.
   * * `too_complex`: Customer considers the service too complicated.
   * * `other`: Other reason(s).
   */
  customerCancellationReason?: CustomerCancellationReason | null | undefined;
  /**
   * Customer feedback and why they decided to cancel.
   *
   * @remarks
   *
   * **IMPORTANT:**
   * Do not use this to store internal notes! It's intended to be input
   * from the customer and is therefore also available in their Polar
   * purchases library.
   *
   * Only set this in case your own service is requesting the reason from the
   * customer. Or you copy a message directly from a customer
   * conversation, i.e support.
   */
  customerCancellationComment?: string | null | undefined;
  /**
   * Cancel an active subscription once the current period ends.
   *
   * @remarks
   *
   * Or uncancel a subscription currently set to be revoked at period end.
   */
  cancelAtPeriodEnd: boolean;
};

/** @internal */
export type SubscriptionCancel$Outbound = {
  customer_cancellation_reason?: string | null | undefined;
  customer_cancellation_comment?: string | null | undefined;
  cancel_at_period_end: boolean;
};

/** @internal */
export const SubscriptionCancel$outboundSchema: z.ZodMiniType<
  SubscriptionCancel$Outbound,
  SubscriptionCancel
> = z.pipe(
  z.object({
    customerCancellationReason: z.optional(
      z.nullable(CustomerCancellationReason$outboundSchema),
    ),
    customerCancellationComment: z.optional(z.nullable(z.string())),
    cancelAtPeriodEnd: z.boolean(),
  }),
  z.transform((v) => {
    return remap$(v, {
      customerCancellationReason: "customer_cancellation_reason",
      customerCancellationComment: "customer_cancellation_comment",
      cancelAtPeriodEnd: "cancel_at_period_end",
    });
  }),
);

export function subscriptionCancelToJSON(
  subscriptionCancel: SubscriptionCancel,
): string {
  return JSON.stringify(
    SubscriptionCancel$outboundSchema.parse(subscriptionCancel),
  );
}
