import { APIResource } from "../../resource.js";
import * as Core from "../../core.js";
import * as Shared from "../shared.js";
import * as SubscriptionsAPI from "./subscriptions.js";
import { SubscriptionListParams, Subscriptions } from "./subscriptions.js";
import { Page, type PageParams } from "../../pagination.js";
/**
 * A coupon represents a reusable discount configuration that can be applied either as a fixed or percentage amount to an invoice or subscription. Coupons are activated using a redemption code, which applies the discount to a subscription or invoice. The duration of a coupon determines how long it remains available for use by end users.
 */
export declare class Coupons extends APIResource {
    subscriptions: SubscriptionsAPI.Subscriptions;
    /**
     * This endpoint allows the creation of coupons, which can then be redeemed at
     * subscription creation or plan change.
     */
    create(body: CouponCreateParams, options?: Core.RequestOptions): Core.APIPromise<Coupon>;
    /**
     * This endpoint returns a list of all coupons for an account in a list format.
     *
     * The list of coupons is ordered starting from the most recently created coupon.
     * The response also includes `pagination_metadata`, which lets the caller retrieve
     * the next page of results if they exist. More information about pagination can be
     * found in the Pagination-metadata schema.
     */
    list(query?: CouponListParams, options?: Core.RequestOptions): Core.PagePromise<CouponsPage, Coupon>;
    list(options?: Core.RequestOptions): Core.PagePromise<CouponsPage, Coupon>;
    /**
     * This endpoint allows a coupon to be archived. Archived coupons can no longer be
     * redeemed, and will be hidden from lists of active coupons. Additionally, once a
     * coupon is archived, its redemption code can be reused for a different coupon.
     */
    archive(couponId: string, options?: Core.RequestOptions): Core.APIPromise<Coupon>;
    /**
     * This endpoint retrieves a coupon by its ID. To fetch coupons by their redemption
     * code, use the [List coupons](list-coupons) endpoint with the redemption_code
     * parameter.
     */
    fetch(couponId: string, options?: Core.RequestOptions): Core.APIPromise<Coupon>;
}
export declare class CouponsPage extends Page<Coupon> {
}
/**
 * A coupon represents a reusable discount configuration that can be applied either
 * as a fixed or percentage amount to an invoice or subscription. Coupons are
 * activated using a redemption code, which applies the discount to a subscription
 * or invoice. The duration of a coupon determines how long it remains available
 * for use by end users.
 */
export interface Coupon {
    /**
     * Also referred to as coupon_id in this documentation.
     */
    id: string;
    /**
     * An archived coupon can no longer be redeemed. Active coupons will have a value
     * of null for `archived_at`; this field will be non-null for archived coupons.
     */
    archived_at: string | null;
    discount: Shared.PercentageDiscount | Shared.AmountDiscount;
    /**
     * This allows for a coupon's discount to apply for a limited time (determined in
     * months); a `null` value here means "unlimited time".
     */
    duration_in_months: number | null;
    /**
     * The maximum number of redemptions allowed for this coupon before it is
     * exhausted; `null` here means "unlimited".
     */
    max_redemptions: number | null;
    /**
     * This string can be used to redeem this coupon for a given subscription.
     */
    redemption_code: string;
    /**
     * The number of times this coupon has been redeemed.
     */
    times_redeemed: number;
}
export interface CouponCreateParams {
    discount: CouponCreateParams.NewCouponPercentageDiscount | CouponCreateParams.NewCouponAmountDiscount;
    /**
     * This string can be used to redeem this coupon for a given subscription.
     */
    redemption_code: string;
    /**
     * This allows for a coupon's discount to apply for a limited time (determined in
     * months); a `null` value here means "unlimited time".
     */
    duration_in_months?: number | null;
    /**
     * The maximum number of redemptions allowed for this coupon before it is
     * exhausted;`null` here means "unlimited".
     */
    max_redemptions?: number | null;
}
export declare namespace CouponCreateParams {
    interface NewCouponPercentageDiscount {
        discount_type: 'percentage';
        percentage_discount: number;
    }
    interface NewCouponAmountDiscount {
        amount_discount: string;
        discount_type: 'amount';
    }
}
export interface CouponListParams extends PageParams {
    /**
     * Filter to coupons matching this redemption code.
     */
    redemption_code?: string | null;
    /**
     * Show archived coupons as well (by default, this endpoint only returns active
     * coupons).
     */
    show_archived?: boolean | null;
}
export declare namespace Coupons {
    export { type Coupon as Coupon, CouponsPage as CouponsPage, type CouponCreateParams as CouponCreateParams, type CouponListParams as CouponListParams, };
    export { Subscriptions as Subscriptions, type SubscriptionListParams as SubscriptionListParams };
}
//# sourceMappingURL=coupons.d.ts.map