"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""

from __future__ import annotations
from .aggregation import Aggregation, AggregationTypedDict
from .atomiccondition import AtomicCondition, AtomicConditionTypedDict
from .logicalnode import LogicalNode, LogicalNodeTypedDict
from .searchoutputformat import SearchOutputFormat
from dg_mol_track_client.types import (
    BaseModel,
    Nullable,
    OptionalNullable,
    UNSET,
    UNSET_SENTINEL,
)
import pydantic
from pydantic import model_serializer
from typing import List, Optional, Union
from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict


BodySearchAssayResultsAdvancedV1SearchAssayResultsPostFilterTypedDict = TypeAliasType(
    "BodySearchAssayResultsAdvancedV1SearchAssayResultsPostFilterTypedDict",
    Union[LogicalNodeTypedDict, AtomicConditionTypedDict],
)


BodySearchAssayResultsAdvancedV1SearchAssayResultsPostFilter = TypeAliasType(
    "BodySearchAssayResultsAdvancedV1SearchAssayResultsPostFilter",
    Union[LogicalNode, AtomicCondition],
)


class BodySearchAssayResultsAdvancedV1SearchAssayResultsPostTypedDict(TypedDict):
    output: List[str]
    aggregations: NotRequired[Nullable[List[AggregationTypedDict]]]
    filter_: NotRequired[
        Nullable[BodySearchAssayResultsAdvancedV1SearchAssayResultsPostFilterTypedDict]
    ]
    output_format: NotRequired[SearchOutputFormat]
    limit: NotRequired[Nullable[int]]


class BodySearchAssayResultsAdvancedV1SearchAssayResultsPost(BaseModel):
    output: List[str]

    aggregations: OptionalNullable[List[Aggregation]] = UNSET

    filter_: Annotated[
        OptionalNullable[BodySearchAssayResultsAdvancedV1SearchAssayResultsPostFilter],
        pydantic.Field(alias="filter"),
    ] = UNSET

    output_format: Optional[SearchOutputFormat] = None

    limit: OptionalNullable[int] = UNSET

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = ["aggregations", "filter", "output_format", "limit"]
        nullable_fields = ["aggregations", "filter", "limit"]
        null_default_fields = []

        serialized = handler(self)

        m = {}

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

            optional_nullable = k in optional_fields and k in nullable_fields
            is_set = (
                self.__pydantic_fields_set__.intersection({n})
                or k in null_default_fields
            )  # pylint: disable=no-member

            if val is not None and val != UNSET_SENTINEL:
                m[k] = val
            elif val != UNSET_SENTINEL and (
                not k in optional_fields or (optional_nullable and is_set)
            ):
                m[k] = val

        return m
