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

from __future__ import annotations
from .capability_requirement_status import CapabilityRequirementStatus
from .url import URL, URLTypedDict
from mollie import models
from mollie.types import BaseModel, Nullable, UNSET_SENTINEL
import pydantic
from pydantic import field_serializer, model_serializer
from typing import Optional
from typing_extensions import Annotated, NotRequired, TypedDict


class EntityCapabilityRequirementLinksTypedDict(TypedDict):
    dashboard: NotRequired[URLTypedDict]
    r"""In v2 endpoints, URLs are commonly represented as objects with an `href` and `type` field."""


class EntityCapabilityRequirementLinks(BaseModel):
    dashboard: Optional[URL] = None
    r"""In v2 endpoints, URLs are commonly represented as objects with an `href` and `type` field."""

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(["dashboard"])
        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


class EntityCapabilityRequirementTypedDict(TypedDict):
    id: str
    r"""The name of this requirement, referring to the task to be fulfilled by the organization
    to enable or re-enable the capability. The name is unique among other requirements
    of the same capability. Requirements related to the onboarding process start with 'onboarding-', while
    requirements related to information requests start with 'information-request-'.
    """
    status: CapabilityRequirementStatus
    r"""The status of the requirement depends on its due date.
    If no due date is given, the status will be `requested`.
    """
    due_date: Nullable[str]
    r"""Due date until the requirement must be fulfilled, if any. The date is shown in ISO-8601 format."""
    links: EntityCapabilityRequirementLinksTypedDict


class EntityCapabilityRequirement(BaseModel):
    id: str
    r"""The name of this requirement, referring to the task to be fulfilled by the organization
    to enable or re-enable the capability. The name is unique among other requirements
    of the same capability. Requirements related to the onboarding process start with 'onboarding-', while
    requirements related to information requests start with 'information-request-'.
    """

    status: CapabilityRequirementStatus
    r"""The status of the requirement depends on its due date.
    If no due date is given, the status will be `requested`.
    """

    due_date: Annotated[Nullable[str], pydantic.Field(alias="dueDate")]
    r"""Due date until the requirement must be fulfilled, if any. The date is shown in ISO-8601 format."""

    links: Annotated[EntityCapabilityRequirementLinks, pydantic.Field(alias="_links")]

    @field_serializer("status")
    def serialize_status(self, value):
        if isinstance(value, str):
            try:
                return models.CapabilityRequirementStatus(value)
            except ValueError:
                return value
        return value

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        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:
                m[k] = val

        return m


try:
    EntityCapabilityRequirement.model_rebuild()
except NameError:
    pass
