# -*- coding: utf-8 -*-
# File generated from our OpenAPI spec
from stripe._stripe_object import StripeObject, UntypedStripeObject
from typing import ClassVar, Optional, Union
from typing_extensions import Literal


class Plan(StripeObject):
    """
    ReservePlans are used to automatically place holds on a merchant's funds until the plan expires. It takes a portion of each incoming Charge (including those resulting from a Transfer from a platform account).
    """

    OBJECT_NAME: ClassVar[Literal["reserve.plan"]] = "reserve.plan"

    class FixedRelease(StripeObject):
        release_after: int
        """
        The time after which all reserved funds are requested for release.
        """
        scheduled_release: int
        """
        The time at which reserved funds are scheduled for release, automatically set to midnight UTC of the day after `release_after`.
        """

    class RollingRelease(StripeObject):
        days_after_charge: int
        """
        The number of days to reserve funds before releasing.
        """
        expires_on: Optional[int]
        """
        The time at which the ReservePlan expires.
        """

    created: int
    """
    Time at which the object was created. Measured in seconds since the Unix epoch.
    """
    created_by: Union[Literal["application", "stripe"], str]
    """
    Indicates which party created this ReservePlan.
    """
    currency: Optional[str]
    """
    Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. Must be a [supported currency](https://stripe.com/docs/currencies). An unset currency indicates that the plan applies to all currencies.
    """
    disabled_at: Optional[int]
    """
    Time at which the ReservePlan was disabled.
    """
    fixed_release: Optional[FixedRelease]
    id: str
    """
    Unique identifier for the object.
    """
    livemode: bool
    """
    If the object exists in live mode, the value is `true`. If the object exists in test mode, the value is `false`.
    """
    metadata: Optional[UntypedStripeObject[str]]
    """
    Set of [key-value pairs](https://docs.stripe.com/api/metadata) that you can attach to an object. This can be useful for storing additional information about the object in a structured format.
    """
    object: Literal["reserve.plan"]
    """
    String representing the object's type. Objects of the same type share the same value.
    """
    percent: int
    """
    The percent of each Charge to reserve.
    """
    rolling_release: Optional[RollingRelease]
    status: Union[Literal["active", "disabled", "expired"], str]
    """
    The current status of the ReservePlan. The ReservePlan only affects charges if it is `active`.
    """
    type: Union[Literal["fixed_release", "rolling_release"], str]
    """
    The type of the ReservePlan.
    """
    _inner_class_types = {
        "fixed_release": FixedRelease,
        "rolling_release": RollingRelease,
    }
