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

import typing_extensions
import typing_extensions
import typing
from ..types.fulfillment_type import FulfillmentType
from ..types.fulfillment_state import FulfillmentState
from ..types.fulfillment_fulfillment_line_item_application import FulfillmentFulfillmentLineItemApplication
from .fulfillment_fulfillment_entry import FulfillmentFulfillmentEntryParams
from .fulfillment_pickup_details import FulfillmentPickupDetailsParams
from .fulfillment_shipment_details import FulfillmentShipmentDetailsParams
from .fulfillment_delivery_details import FulfillmentDeliveryDetailsParams


class FulfillmentParams(typing_extensions.TypedDict):
    """
    Contains details about how to fulfill this order.
    Orders can only be created with at most one fulfillment using the API.
    However, orders returned by the Orders API might contain multiple fulfillments because sellers can create multiple fulfillments using Square products such as Square Online.
    """

    uid: typing_extensions.NotRequired[typing.Optional[str]]
    """
    A unique ID that identifies the fulfillment only within this order.
    """

    type: typing_extensions.NotRequired[FulfillmentType]
    """
    The type of the fulfillment.
    See [FulfillmentType](#type-fulfillmenttype) for possible values
    """

    state: typing_extensions.NotRequired[FulfillmentState]
    """
    The state of the fulfillment.
    See [FulfillmentState](#type-fulfillmentstate) for possible values
    """

    line_item_application: typing_extensions.NotRequired[FulfillmentFulfillmentLineItemApplication]
    """
    Describes what order line items this fulfillment applies to.
    It can be `ALL` or `ENTRY_LIST` with a supplied list of fulfillment entries.
    See [FulfillmentFulfillmentLineItemApplication](#type-fulfillmentfulfillmentlineitemapplication) for possible values
    """

    entries: typing_extensions.NotRequired[typing.Sequence[FulfillmentFulfillmentEntryParams]]
    """
    A list of entries pertaining to the fulfillment of an order. Each entry must reference
    a valid `uid` for an order line item in the `line_item_uid` field, as well as a `quantity` to
    fulfill.
    
    Multiple entries can reference the same line item `uid`, as long as the total quantity among
    all fulfillment entries referencing a single line item does not exceed the quantity of the
    order's line item itself.
    
    An order cannot be marked as `COMPLETED` before all fulfillments are `COMPLETED`,
    `CANCELED`, or `FAILED`. Fulfillments can be created and completed independently
    before order completion.
    """

    metadata: typing_extensions.NotRequired[typing.Optional[typing.Dict[str, typing.Optional[str]]]]
    """
    Application-defined data attached to this fulfillment. Metadata fields are intended
    to store descriptive references or associations with an entity in another system or store brief
    information about the object. Square does not process this field; it only stores and returns it
    in relevant API calls. Do not use metadata to store any sensitive information (such as personally
    identifiable information or card details).
    
    Keys written by applications must be 60 characters or less and must be in the character set
    `[a-zA-Z0-9_-]`. Entries can also include metadata generated by Square. These keys are prefixed
    with a namespace, separated from the key with a ':' character.
    
    Values have a maximum length of 255 characters.
    
    An application can have up to 10 entries per metadata field.
    
    Entries written by applications are private and can only be read or modified by the same
    application.
    
    For more information, see [Metadata](https://developer.squareup.com/docs/build-basics/metadata).
    """

    pickup_details: typing_extensions.NotRequired[FulfillmentPickupDetailsParams]
    """
    Contains details for a pickup fulfillment. These details are required when the fulfillment
    type is `PICKUP`.
    """

    shipment_details: typing_extensions.NotRequired[FulfillmentShipmentDetailsParams]
    """
    Contains details for a shipment fulfillment. These details are required when the fulfillment type
    is `SHIPMENT`.
    
    A shipment fulfillment's relationship to fulfillment `state`:
    `PROPOSED`: A shipment is requested.
    `RESERVED`: Fulfillment in progress. Shipment processing.
    `PREPARED`: Shipment packaged. Shipping label created.
    `COMPLETED`: Package has been shipped.
    `CANCELED`: Shipment has been canceled.
    `FAILED`: Shipment has failed.
    """

    delivery_details: typing_extensions.NotRequired[FulfillmentDeliveryDetailsParams]
    """
    Describes delivery details of an order fulfillment.
    """
