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

from __future__ import annotations
from .endpointsmetadata import EndpointsMetadata, EndpointsMetadataTypedDict
from .pipelinestage import PipelineStage, PipelineStageTypedDict
from .routerattempt import RouterAttempt, RouterAttemptTypedDict
from .routerparams import RouterParams, RouterParamsTypedDict
from .routingstrategy import RoutingStrategy
from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL
from openrouter.utils import validate_open_enum
from pydantic import model_serializer
from pydantic.functional_validators import PlainValidator
from typing import List, Optional
from typing_extensions import Annotated, NotRequired, TypedDict


class OpenRouterMetadataTypedDict(TypedDict):
    attempt: int
    endpoints: EndpointsMetadataTypedDict
    is_byok: bool
    region: Nullable[str]
    requested: str
    strategy: RoutingStrategy
    summary: str
    attempts: NotRequired[List[RouterAttemptTypedDict]]
    params: NotRequired[RouterParamsTypedDict]
    pipeline: NotRequired[List[PipelineStageTypedDict]]


class OpenRouterMetadata(BaseModel):
    attempt: int

    endpoints: EndpointsMetadata

    is_byok: bool

    region: Nullable[str]

    requested: str

    strategy: Annotated[RoutingStrategy, PlainValidator(validate_open_enum(False))]

    summary: str

    attempts: Optional[List[RouterAttempt]] = None

    params: Optional[RouterParams] = None

    pipeline: Optional[List[PipelineStage]] = None

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = ["attempts", "params", "pipeline"]
        nullable_fields = ["region"]
        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
