# This file was auto-generated by Fern from our API Definition.

from ..core.unchecked_base_model import UncheckedBaseModel
import typing
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2


class CatalogProductSet(UncheckedBaseModel):
    """
    Represents a collection of catalog objects for the purpose of applying a
    `PricingRule`. Including a catalog object will include all of its subtypes.
    For example, including a category in a product set will include all of its
    items and associated item variations in the product set. Including an item in
    a product set will also include its item variations.
    """

    name: typing.Optional[str] = pydantic.Field(default=None)
    """
    User-defined name for the product set. For example, "Clearance Items"
    or "Winter Sale Items".
    """

    product_ids_any: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
    """
     Unique IDs for any `CatalogObject` included in this product set. Any
    number of these catalog objects can be in an order for a pricing rule to apply.
    
    This can be used with `product_ids_all` in a parent `CatalogProductSet` to
    match groups of products for a bulk discount, such as a discount for an
    entree and side combo.
    
    Only one of `product_ids_all`, `product_ids_any`, or `all_products` can be set.
    
    Max: 500 catalog object IDs.
    """

    product_ids_all: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
    """
    Unique IDs for any `CatalogObject` included in this product set.
    All objects in this set must be included in an order for a pricing rule to apply.
    
    Only one of `product_ids_all`, `product_ids_any`, or `all_products` can be set.
    
    Max: 500 catalog object IDs.
    """

    quantity_exact: typing.Optional[int] = pydantic.Field(default=None)
    """
    If set, there must be exactly this many items from `products_any` or `products_all`
    in the cart for the discount to apply.
    
    Cannot be combined with either `quantity_min` or `quantity_max`.
    """

    quantity_min: typing.Optional[int] = pydantic.Field(default=None)
    """
    If set, there must be at least this many items from `products_any` or `products_all`
    in a cart for the discount to apply. See `quantity_exact`. Defaults to 0 if
    `quantity_exact`, `quantity_min` and `quantity_max` are all unspecified.
    """

    quantity_max: typing.Optional[int] = pydantic.Field(default=None)
    """
    If set, the pricing rule will apply to a maximum of this many items from
    `products_any` or `products_all`.
    """

    all_products: typing.Optional[bool] = pydantic.Field(default=None)
    """
    If set to `true`, the product set will include every item in the catalog.
    Only one of `product_ids_all`, `product_ids_any`, or `all_products` can be set.
    """

    if IS_PYDANTIC_V2:
        model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True)  # type: ignore # Pydantic v2
    else:

        class Config:
            frozen = True
            smart_union = True
            extra = pydantic.Extra.allow
