"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
# @generated-id: d01fd0dff5f5

from __future__ import annotations
from .amount import Amount, AmountTypedDict
from .payment_address import PaymentAddress, PaymentAddressTypedDict
from .payment_line_item import PaymentLineItem, PaymentLineItemTypedDict
from .payment_link_method import PaymentLinkMethod
from mollie.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
from mollie.utils import (
    FieldMetadata,
    HeaderMetadata,
    PathParamMetadata,
    RequestMetadata,
)
import pydantic
from pydantic import model_serializer
from typing import List, Optional
from typing_extensions import Annotated, NotRequired, TypedDict


class UpdatePaymentLinkRequestBodyTypedDict(TypedDict):
    description: NotRequired[str]
    r"""A short description of the payment link. The description is visible in the Dashboard and will be shown
    on the customer's bank or card statement when possible.

    Updating the description does not affect any previously existing payments created for this payment link.
    """
    minimum_amount: NotRequired[AmountTypedDict]
    r"""In v2 endpoints, monetary amounts are represented as objects with a `currency` and `value` field."""
    archived: NotRequired[bool]
    r"""Whether the payment link is archived. Customers will not be able to complete payments on archived
    payment links.
    """
    allowed_methods: NotRequired[Nullable[List[PaymentLinkMethod]]]
    r"""An array of payment methods that are allowed to be used for this payment link. When this parameter is
    not provided or is an empty array, all enabled payment methods will be available.
    """
    lines: NotRequired[Nullable[List[PaymentLineItemTypedDict]]]
    r"""Optionally provide the order lines for the payment. Each line contains details such as a description of the item
    ordered and its price.

    All lines must have the same currency as the payment.

    Required for payment methods `billie`, `in3`, `klarna`, `riverty` and `voucher`.
    """
    billing_address: NotRequired[PaymentAddressTypedDict]
    shipping_address: NotRequired[PaymentAddressTypedDict]
    testmode: NotRequired[bool]
    r"""Whether the entity was created in test mode or live mode. This field does not update the mode of the entity.

    Most API credentials are specifically created for either live mode or test mode, in which case this parameter must
    not be sent. For organization-level credentials such as OAuth access tokens, you can enable test mode by setting
    `testmode` to `true`.
    """


class UpdatePaymentLinkRequestBody(BaseModel):
    description: Optional[str] = None
    r"""A short description of the payment link. The description is visible in the Dashboard and will be shown
    on the customer's bank or card statement when possible.

    Updating the description does not affect any previously existing payments created for this payment link.
    """

    minimum_amount: Annotated[
        Optional[Amount], pydantic.Field(alias="minimumAmount")
    ] = None
    r"""In v2 endpoints, monetary amounts are represented as objects with a `currency` and `value` field."""

    archived: Optional[bool] = None
    r"""Whether the payment link is archived. Customers will not be able to complete payments on archived
    payment links.
    """

    allowed_methods: Annotated[
        OptionalNullable[List[PaymentLinkMethod]],
        pydantic.Field(alias="allowedMethods"),
    ] = UNSET
    r"""An array of payment methods that are allowed to be used for this payment link. When this parameter is
    not provided or is an empty array, all enabled payment methods will be available.
    """

    lines: OptionalNullable[List[PaymentLineItem]] = UNSET
    r"""Optionally provide the order lines for the payment. Each line contains details such as a description of the item
    ordered and its price.

    All lines must have the same currency as the payment.

    Required for payment methods `billie`, `in3`, `klarna`, `riverty` and `voucher`.
    """

    billing_address: Annotated[
        Optional[PaymentAddress], pydantic.Field(alias="billingAddress")
    ] = None

    shipping_address: Annotated[
        Optional[PaymentAddress], pydantic.Field(alias="shippingAddress")
    ] = None

    testmode: Optional[bool] = None
    r"""Whether the entity was created in test mode or live mode. This field does not update the mode of the entity.

    Most API credentials are specifically created for either live mode or test mode, in which case this parameter must
    not be sent. For organization-level credentials such as OAuth access tokens, you can enable test mode by setting
    `testmode` to `true`.
    """

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(
            [
                "description",
                "minimumAmount",
                "archived",
                "allowedMethods",
                "lines",
                "billingAddress",
                "shippingAddress",
                "testmode",
            ]
        )
        nullable_fields = set(["allowedMethods", "lines"])
        serialized = handler(self)
        m = {}

        for n, f in type(self).model_fields.items():
            k = f.alias or n
            val = serialized.get(k, serialized.get(n))
            is_nullable_and_explicitly_set = (
                k in nullable_fields
                and (self.__pydantic_fields_set__.intersection({n}))  # pylint: disable=no-member
            )

            if val != UNSET_SENTINEL:
                if (
                    val is not None
                    or k not in optional_fields
                    or is_nullable_and_explicitly_set
                ):
                    m[k] = val

        return m


class UpdatePaymentLinkRequestTypedDict(TypedDict):
    payment_link_id: str
    r"""Provide the ID of the related payment link."""
    idempotency_key: NotRequired[str]
    r"""A unique key to ensure idempotent requests. This key should be a UUID v4 string."""
    request_body: NotRequired[UpdatePaymentLinkRequestBodyTypedDict]


class UpdatePaymentLinkRequest(BaseModel):
    payment_link_id: Annotated[
        str,
        pydantic.Field(alias="paymentLinkId"),
        FieldMetadata(path=PathParamMetadata(style="simple", explode=False)),
    ]
    r"""Provide the ID of the related payment link."""

    idempotency_key: Annotated[
        Optional[str],
        pydantic.Field(alias="idempotency-key"),
        FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
    ] = None
    r"""A unique key to ensure idempotent requests. This key should be a UUID v4 string."""

    request_body: Annotated[
        Optional[UpdatePaymentLinkRequestBody],
        FieldMetadata(request=RequestMetadata(media_type="application/json")),
    ] = None

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(["idempotency-key", "RequestBody"])
        serialized = handler(self)
        m = {}

        for n, f in type(self).model_fields.items():
            k = f.alias or n
            val = serialized.get(k, serialized.get(n))

            if val != UNSET_SENTINEL:
                if val is not None or k not in optional_fields:
                    m[k] = val

        return m


try:
    UpdatePaymentLinkRequestBody.model_rebuild()
except NameError:
    pass
