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

from __future__ import annotations
from .file import File, FileTypedDict
from .filepurpose import FilePurpose
from mistralai.client.types import (
    BaseModel,
    Nullable,
    OptionalNullable,
    UNSET,
    UNSET_SENTINEL,
)
from mistralai.client.utils import FieldMetadata, MultipartFormMetadata
from pydantic import model_serializer
from typing import Literal, Optional
from typing_extensions import Annotated, NotRequired, TypedDict


FilesAPIRoutesUploadFileFileVisibility = Literal[
    "workspace",
    "user",
]


class MultiPartBodyParamsTypedDict(TypedDict):
    file: FileTypedDict
    r"""The File object (not file name) to be uploaded.
    To upload a file and specify a custom file name you should format your request as such:
    ```bash
    file=@path/to/your/file.jsonl;filename=custom_name.jsonl
    ```
    Otherwise, you can just keep the original file name:
    ```bash
    file=@path/to/your/file.jsonl
    ```
    """
    expiry: NotRequired[Nullable[int]]
    visibility: NotRequired[FilesAPIRoutesUploadFileFileVisibility]
    purpose: NotRequired[FilePurpose]


class MultiPartBodyParams(BaseModel):
    file: Annotated[File, FieldMetadata(multipart=MultipartFormMetadata(file=True))]
    r"""The File object (not file name) to be uploaded.
    To upload a file and specify a custom file name you should format your request as such:
    ```bash
    file=@path/to/your/file.jsonl;filename=custom_name.jsonl
    ```
    Otherwise, you can just keep the original file name:
    ```bash
    file=@path/to/your/file.jsonl
    ```
    """

    expiry: Annotated[OptionalNullable[int], FieldMetadata(multipart=True)] = UNSET

    visibility: Annotated[
        Optional[FilesAPIRoutesUploadFileFileVisibility], FieldMetadata(multipart=True)
    ] = "workspace"

    purpose: Annotated[Optional[FilePurpose], FieldMetadata(multipart=True)] = None

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