# coding: utf-8

"""
Immich

Immich API

The version of the OpenAPI document: 2.4.1
Generated by OpenAPI Generator (https://openapi-generator.tech)

Do not edit the class manually.
"""  # noqa: E501

from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt
from typing import Any, Dict, List, Optional, Tuple, Union
from typing_extensions import Annotated

from pydantic import StrictBool
from uuid import UUID
from immich.client.models.asset_order import AssetOrder
from immich.client.models.asset_visibility import AssetVisibility
from immich.client.models.time_bucket_asset_response_dto import (
    TimeBucketAssetResponseDto,
)
from immich.client.models.time_buckets_response_dto import TimeBucketsResponseDto

from immich.client.api_client import ApiClient, RequestSerialized
from immich.client.api_response import ApiResponse
from immich.client.rest import RESTResponseType


class TimelineApi:
    """NOTE: This class is auto generated by OpenAPI Generator
    Ref: https://openapi-generator.tech

    Do not edit the class manually.
    """

    def __init__(self, api_client=None) -> None:
        if api_client is None:
            api_client = ApiClient.get_default()
        self.api_client = api_client

    @validate_call
    async def get_time_bucket(
        self,
        time_bucket: Annotated[
            StrictStr,
            Field(
                description='Time bucket identifier in YYYY-MM-DD format (e.g., "2024-01-01" for January 2024)'
            ),
        ],
        album_id: Annotated[
            Optional[UUID],
            Field(description="Filter assets belonging to a specific album"),
        ] = None,
        is_favorite: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by favorite status (true for favorites only, false for non-favorites only)"
            ),
        ] = None,
        is_trashed: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by trash status (true for trashed assets only, false for non-trashed only)"
            ),
        ] = None,
        key: Optional[StrictStr] = None,
        order: Annotated[
            Optional[AssetOrder],
            Field(
                description="Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)"
            ),
        ] = None,
        person_id: Annotated[
            Optional[UUID],
            Field(
                description="Filter assets containing a specific person (face recognition)"
            ),
        ] = None,
        slug: Optional[StrictStr] = None,
        tag_id: Annotated[
            Optional[UUID], Field(description="Filter assets with a specific tag")
        ] = None,
        user_id: Annotated[
            Optional[UUID], Field(description="Filter assets by specific user ID")
        ] = None,
        visibility: Annotated[
            Optional[AssetVisibility],
            Field(
                description="Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)"
            ),
        ] = None,
        with_coordinates: Annotated[
            Optional[StrictBool],
            Field(description="Include location data in the response"),
        ] = None,
        with_partners: Annotated[
            Optional[StrictBool], Field(description="Include assets shared by partners")
        ] = None,
        with_stacked: Annotated[
            Optional[StrictBool],
            Field(
                description="Include stacked assets in the response. When true, only primary assets from stacks are returned."
            ),
        ] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]
            ],
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> TimeBucketAssetResponseDto:
        """Get time bucket

        Retrieve a string of all asset ids in a given time bucket.

        :param time_bucket: Time bucket identifier in YYYY-MM-DD format (e.g., \"2024-01-01\" for January 2024) (required)
        :type time_bucket: str
        :param album_id: Filter assets belonging to a specific album
        :type album_id: UUID
        :param is_favorite: Filter by favorite status (true for favorites only, false for non-favorites only)
        :type is_favorite: bool
        :param is_trashed: Filter by trash status (true for trashed assets only, false for non-trashed only)
        :type is_trashed: bool
        :param key:
        :type key: str
        :param order: Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)
        :type order: AssetOrder
        :param person_id: Filter assets containing a specific person (face recognition)
        :type person_id: UUID
        :param slug:
        :type slug: str
        :param tag_id: Filter assets with a specific tag
        :type tag_id: UUID
        :param user_id: Filter assets by specific user ID
        :type user_id: UUID
        :param visibility: Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)
        :type visibility: AssetVisibility
        :param with_coordinates: Include location data in the response
        :type with_coordinates: bool
        :param with_partners: Include assets shared by partners
        :type with_partners: bool
        :param with_stacked: Include stacked assets in the response. When true, only primary assets from stacks are returned.
        :type with_stacked: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """  # noqa: E501

        _param = self._get_time_bucket_serialize(
            time_bucket=time_bucket,
            album_id=album_id,
            is_favorite=is_favorite,
            is_trashed=is_trashed,
            key=key,
            order=order,
            person_id=person_id,
            slug=slug,
            tag_id=tag_id,
            user_id=user_id,
            visibility=visibility,
            with_coordinates=with_coordinates,
            with_partners=with_partners,
            with_stacked=with_stacked,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index,
        )

        _response_types_map: Dict[str, Optional[str]] = {
            "200": "TimeBucketAssetResponseDto",
        }
        response_data = await self.api_client.call_api(
            *_param, _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    async def get_time_bucket_with_http_info(
        self,
        time_bucket: Annotated[
            StrictStr,
            Field(
                description='Time bucket identifier in YYYY-MM-DD format (e.g., "2024-01-01" for January 2024)'
            ),
        ],
        album_id: Annotated[
            Optional[UUID],
            Field(description="Filter assets belonging to a specific album"),
        ] = None,
        is_favorite: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by favorite status (true for favorites only, false for non-favorites only)"
            ),
        ] = None,
        is_trashed: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by trash status (true for trashed assets only, false for non-trashed only)"
            ),
        ] = None,
        key: Optional[StrictStr] = None,
        order: Annotated[
            Optional[AssetOrder],
            Field(
                description="Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)"
            ),
        ] = None,
        person_id: Annotated[
            Optional[UUID],
            Field(
                description="Filter assets containing a specific person (face recognition)"
            ),
        ] = None,
        slug: Optional[StrictStr] = None,
        tag_id: Annotated[
            Optional[UUID], Field(description="Filter assets with a specific tag")
        ] = None,
        user_id: Annotated[
            Optional[UUID], Field(description="Filter assets by specific user ID")
        ] = None,
        visibility: Annotated[
            Optional[AssetVisibility],
            Field(
                description="Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)"
            ),
        ] = None,
        with_coordinates: Annotated[
            Optional[StrictBool],
            Field(description="Include location data in the response"),
        ] = None,
        with_partners: Annotated[
            Optional[StrictBool], Field(description="Include assets shared by partners")
        ] = None,
        with_stacked: Annotated[
            Optional[StrictBool],
            Field(
                description="Include stacked assets in the response. When true, only primary assets from stacks are returned."
            ),
        ] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]
            ],
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[TimeBucketAssetResponseDto]:
        """Get time bucket

        Retrieve a string of all asset ids in a given time bucket.

        :param time_bucket: Time bucket identifier in YYYY-MM-DD format (e.g., \"2024-01-01\" for January 2024) (required)
        :type time_bucket: str
        :param album_id: Filter assets belonging to a specific album
        :type album_id: UUID
        :param is_favorite: Filter by favorite status (true for favorites only, false for non-favorites only)
        :type is_favorite: bool
        :param is_trashed: Filter by trash status (true for trashed assets only, false for non-trashed only)
        :type is_trashed: bool
        :param key:
        :type key: str
        :param order: Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)
        :type order: AssetOrder
        :param person_id: Filter assets containing a specific person (face recognition)
        :type person_id: UUID
        :param slug:
        :type slug: str
        :param tag_id: Filter assets with a specific tag
        :type tag_id: UUID
        :param user_id: Filter assets by specific user ID
        :type user_id: UUID
        :param visibility: Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)
        :type visibility: AssetVisibility
        :param with_coordinates: Include location data in the response
        :type with_coordinates: bool
        :param with_partners: Include assets shared by partners
        :type with_partners: bool
        :param with_stacked: Include stacked assets in the response. When true, only primary assets from stacks are returned.
        :type with_stacked: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """  # noqa: E501

        _param = self._get_time_bucket_serialize(
            time_bucket=time_bucket,
            album_id=album_id,
            is_favorite=is_favorite,
            is_trashed=is_trashed,
            key=key,
            order=order,
            person_id=person_id,
            slug=slug,
            tag_id=tag_id,
            user_id=user_id,
            visibility=visibility,
            with_coordinates=with_coordinates,
            with_partners=with_partners,
            with_stacked=with_stacked,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index,
        )

        _response_types_map: Dict[str, Optional[str]] = {
            "200": "TimeBucketAssetResponseDto",
        }
        response_data = await self.api_client.call_api(
            *_param, _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    async def get_time_bucket_without_preload_content(
        self,
        time_bucket: Annotated[
            StrictStr,
            Field(
                description='Time bucket identifier in YYYY-MM-DD format (e.g., "2024-01-01" for January 2024)'
            ),
        ],
        album_id: Annotated[
            Optional[UUID],
            Field(description="Filter assets belonging to a specific album"),
        ] = None,
        is_favorite: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by favorite status (true for favorites only, false for non-favorites only)"
            ),
        ] = None,
        is_trashed: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by trash status (true for trashed assets only, false for non-trashed only)"
            ),
        ] = None,
        key: Optional[StrictStr] = None,
        order: Annotated[
            Optional[AssetOrder],
            Field(
                description="Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)"
            ),
        ] = None,
        person_id: Annotated[
            Optional[UUID],
            Field(
                description="Filter assets containing a specific person (face recognition)"
            ),
        ] = None,
        slug: Optional[StrictStr] = None,
        tag_id: Annotated[
            Optional[UUID], Field(description="Filter assets with a specific tag")
        ] = None,
        user_id: Annotated[
            Optional[UUID], Field(description="Filter assets by specific user ID")
        ] = None,
        visibility: Annotated[
            Optional[AssetVisibility],
            Field(
                description="Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)"
            ),
        ] = None,
        with_coordinates: Annotated[
            Optional[StrictBool],
            Field(description="Include location data in the response"),
        ] = None,
        with_partners: Annotated[
            Optional[StrictBool], Field(description="Include assets shared by partners")
        ] = None,
        with_stacked: Annotated[
            Optional[StrictBool],
            Field(
                description="Include stacked assets in the response. When true, only primary assets from stacks are returned."
            ),
        ] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]
            ],
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Get time bucket

        Retrieve a string of all asset ids in a given time bucket.

        :param time_bucket: Time bucket identifier in YYYY-MM-DD format (e.g., \"2024-01-01\" for January 2024) (required)
        :type time_bucket: str
        :param album_id: Filter assets belonging to a specific album
        :type album_id: UUID
        :param is_favorite: Filter by favorite status (true for favorites only, false for non-favorites only)
        :type is_favorite: bool
        :param is_trashed: Filter by trash status (true for trashed assets only, false for non-trashed only)
        :type is_trashed: bool
        :param key:
        :type key: str
        :param order: Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)
        :type order: AssetOrder
        :param person_id: Filter assets containing a specific person (face recognition)
        :type person_id: UUID
        :param slug:
        :type slug: str
        :param tag_id: Filter assets with a specific tag
        :type tag_id: UUID
        :param user_id: Filter assets by specific user ID
        :type user_id: UUID
        :param visibility: Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)
        :type visibility: AssetVisibility
        :param with_coordinates: Include location data in the response
        :type with_coordinates: bool
        :param with_partners: Include assets shared by partners
        :type with_partners: bool
        :param with_stacked: Include stacked assets in the response. When true, only primary assets from stacks are returned.
        :type with_stacked: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """  # noqa: E501

        _param = self._get_time_bucket_serialize(
            time_bucket=time_bucket,
            album_id=album_id,
            is_favorite=is_favorite,
            is_trashed=is_trashed,
            key=key,
            order=order,
            person_id=person_id,
            slug=slug,
            tag_id=tag_id,
            user_id=user_id,
            visibility=visibility,
            with_coordinates=with_coordinates,
            with_partners=with_partners,
            with_stacked=with_stacked,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index,
        )

        _response_types_map: Dict[str, Optional[str]] = {
            "200": "TimeBucketAssetResponseDto",
        }
        response_data = await self.api_client.call_api(
            *_param, _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_time_bucket_serialize(
        self,
        time_bucket,
        album_id,
        is_favorite,
        is_trashed,
        key,
        order,
        person_id,
        slug,
        tag_id,
        user_id,
        visibility,
        with_coordinates,
        with_partners,
        with_stacked,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:
        _host = None

        _collection_formats: Dict[str, str] = {}

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if album_id is not None:
            _query_params.append(("albumId", album_id))

        if is_favorite is not None:
            _query_params.append(("isFavorite", is_favorite))

        if is_trashed is not None:
            _query_params.append(("isTrashed", is_trashed))

        if key is not None:
            _query_params.append(("key", key))

        if order is not None:
            _query_params.append(("order", order.value))

        if person_id is not None:
            _query_params.append(("personId", person_id))

        if slug is not None:
            _query_params.append(("slug", slug))

        if tag_id is not None:
            _query_params.append(("tagId", tag_id))

        if time_bucket is not None:
            _query_params.append(("timeBucket", time_bucket))

        if user_id is not None:
            _query_params.append(("userId", user_id))

        if visibility is not None:
            _query_params.append(("visibility", visibility.value))

        if with_coordinates is not None:
            _query_params.append(("withCoordinates", with_coordinates))

        if with_partners is not None:
            _query_params.append(("withPartners", with_partners))

        if with_stacked is not None:
            _query_params.append(("withStacked", with_stacked))

        # process the header parameters
        # process the form parameters
        # process the body parameter

        # set the HTTP header `Accept`
        if "Accept" not in _header_params:
            _header_params["Accept"] = self.api_client.select_header_accept(
                ["application/json"]
            )

        # authentication setting
        _auth_settings: List[str] = ["cookie", "api_key", "bearer"]

        return self.api_client.param_serialize(
            method="GET",
            resource_path="/timeline/bucket",
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth,
        )

    @validate_call
    async def get_time_buckets(
        self,
        album_id: Annotated[
            Optional[UUID],
            Field(description="Filter assets belonging to a specific album"),
        ] = None,
        is_favorite: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by favorite status (true for favorites only, false for non-favorites only)"
            ),
        ] = None,
        is_trashed: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by trash status (true for trashed assets only, false for non-trashed only)"
            ),
        ] = None,
        key: Optional[StrictStr] = None,
        order: Annotated[
            Optional[AssetOrder],
            Field(
                description="Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)"
            ),
        ] = None,
        person_id: Annotated[
            Optional[UUID],
            Field(
                description="Filter assets containing a specific person (face recognition)"
            ),
        ] = None,
        slug: Optional[StrictStr] = None,
        tag_id: Annotated[
            Optional[UUID], Field(description="Filter assets with a specific tag")
        ] = None,
        user_id: Annotated[
            Optional[UUID], Field(description="Filter assets by specific user ID")
        ] = None,
        visibility: Annotated[
            Optional[AssetVisibility],
            Field(
                description="Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)"
            ),
        ] = None,
        with_coordinates: Annotated[
            Optional[StrictBool],
            Field(description="Include location data in the response"),
        ] = None,
        with_partners: Annotated[
            Optional[StrictBool], Field(description="Include assets shared by partners")
        ] = None,
        with_stacked: Annotated[
            Optional[StrictBool],
            Field(
                description="Include stacked assets in the response. When true, only primary assets from stacks are returned."
            ),
        ] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]
            ],
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> List[TimeBucketsResponseDto]:
        """Get time buckets

        Retrieve a list of all minimal time buckets.

        :param album_id: Filter assets belonging to a specific album
        :type album_id: UUID
        :param is_favorite: Filter by favorite status (true for favorites only, false for non-favorites only)
        :type is_favorite: bool
        :param is_trashed: Filter by trash status (true for trashed assets only, false for non-trashed only)
        :type is_trashed: bool
        :param key:
        :type key: str
        :param order: Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)
        :type order: AssetOrder
        :param person_id: Filter assets containing a specific person (face recognition)
        :type person_id: UUID
        :param slug:
        :type slug: str
        :param tag_id: Filter assets with a specific tag
        :type tag_id: UUID
        :param user_id: Filter assets by specific user ID
        :type user_id: UUID
        :param visibility: Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)
        :type visibility: AssetVisibility
        :param with_coordinates: Include location data in the response
        :type with_coordinates: bool
        :param with_partners: Include assets shared by partners
        :type with_partners: bool
        :param with_stacked: Include stacked assets in the response. When true, only primary assets from stacks are returned.
        :type with_stacked: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """  # noqa: E501

        _param = self._get_time_buckets_serialize(
            album_id=album_id,
            is_favorite=is_favorite,
            is_trashed=is_trashed,
            key=key,
            order=order,
            person_id=person_id,
            slug=slug,
            tag_id=tag_id,
            user_id=user_id,
            visibility=visibility,
            with_coordinates=with_coordinates,
            with_partners=with_partners,
            with_stacked=with_stacked,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index,
        )

        _response_types_map: Dict[str, Optional[str]] = {
            "200": "List[TimeBucketsResponseDto]",
        }
        response_data = await self.api_client.call_api(
            *_param, _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    async def get_time_buckets_with_http_info(
        self,
        album_id: Annotated[
            Optional[UUID],
            Field(description="Filter assets belonging to a specific album"),
        ] = None,
        is_favorite: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by favorite status (true for favorites only, false for non-favorites only)"
            ),
        ] = None,
        is_trashed: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by trash status (true for trashed assets only, false for non-trashed only)"
            ),
        ] = None,
        key: Optional[StrictStr] = None,
        order: Annotated[
            Optional[AssetOrder],
            Field(
                description="Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)"
            ),
        ] = None,
        person_id: Annotated[
            Optional[UUID],
            Field(
                description="Filter assets containing a specific person (face recognition)"
            ),
        ] = None,
        slug: Optional[StrictStr] = None,
        tag_id: Annotated[
            Optional[UUID], Field(description="Filter assets with a specific tag")
        ] = None,
        user_id: Annotated[
            Optional[UUID], Field(description="Filter assets by specific user ID")
        ] = None,
        visibility: Annotated[
            Optional[AssetVisibility],
            Field(
                description="Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)"
            ),
        ] = None,
        with_coordinates: Annotated[
            Optional[StrictBool],
            Field(description="Include location data in the response"),
        ] = None,
        with_partners: Annotated[
            Optional[StrictBool], Field(description="Include assets shared by partners")
        ] = None,
        with_stacked: Annotated[
            Optional[StrictBool],
            Field(
                description="Include stacked assets in the response. When true, only primary assets from stacks are returned."
            ),
        ] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]
            ],
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[List[TimeBucketsResponseDto]]:
        """Get time buckets

        Retrieve a list of all minimal time buckets.

        :param album_id: Filter assets belonging to a specific album
        :type album_id: UUID
        :param is_favorite: Filter by favorite status (true for favorites only, false for non-favorites only)
        :type is_favorite: bool
        :param is_trashed: Filter by trash status (true for trashed assets only, false for non-trashed only)
        :type is_trashed: bool
        :param key:
        :type key: str
        :param order: Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)
        :type order: AssetOrder
        :param person_id: Filter assets containing a specific person (face recognition)
        :type person_id: UUID
        :param slug:
        :type slug: str
        :param tag_id: Filter assets with a specific tag
        :type tag_id: UUID
        :param user_id: Filter assets by specific user ID
        :type user_id: UUID
        :param visibility: Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)
        :type visibility: AssetVisibility
        :param with_coordinates: Include location data in the response
        :type with_coordinates: bool
        :param with_partners: Include assets shared by partners
        :type with_partners: bool
        :param with_stacked: Include stacked assets in the response. When true, only primary assets from stacks are returned.
        :type with_stacked: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """  # noqa: E501

        _param = self._get_time_buckets_serialize(
            album_id=album_id,
            is_favorite=is_favorite,
            is_trashed=is_trashed,
            key=key,
            order=order,
            person_id=person_id,
            slug=slug,
            tag_id=tag_id,
            user_id=user_id,
            visibility=visibility,
            with_coordinates=with_coordinates,
            with_partners=with_partners,
            with_stacked=with_stacked,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index,
        )

        _response_types_map: Dict[str, Optional[str]] = {
            "200": "List[TimeBucketsResponseDto]",
        }
        response_data = await self.api_client.call_api(
            *_param, _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    async def get_time_buckets_without_preload_content(
        self,
        album_id: Annotated[
            Optional[UUID],
            Field(description="Filter assets belonging to a specific album"),
        ] = None,
        is_favorite: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by favorite status (true for favorites only, false for non-favorites only)"
            ),
        ] = None,
        is_trashed: Annotated[
            Optional[StrictBool],
            Field(
                description="Filter by trash status (true for trashed assets only, false for non-trashed only)"
            ),
        ] = None,
        key: Optional[StrictStr] = None,
        order: Annotated[
            Optional[AssetOrder],
            Field(
                description="Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)"
            ),
        ] = None,
        person_id: Annotated[
            Optional[UUID],
            Field(
                description="Filter assets containing a specific person (face recognition)"
            ),
        ] = None,
        slug: Optional[StrictStr] = None,
        tag_id: Annotated[
            Optional[UUID], Field(description="Filter assets with a specific tag")
        ] = None,
        user_id: Annotated[
            Optional[UUID], Field(description="Filter assets by specific user ID")
        ] = None,
        visibility: Annotated[
            Optional[AssetVisibility],
            Field(
                description="Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)"
            ),
        ] = None,
        with_coordinates: Annotated[
            Optional[StrictBool],
            Field(description="Include location data in the response"),
        ] = None,
        with_partners: Annotated[
            Optional[StrictBool], Field(description="Include assets shared by partners")
        ] = None,
        with_stacked: Annotated[
            Optional[StrictBool],
            Field(
                description="Include stacked assets in the response. When true, only primary assets from stacks are returned."
            ),
        ] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]
            ],
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Get time buckets

        Retrieve a list of all minimal time buckets.

        :param album_id: Filter assets belonging to a specific album
        :type album_id: UUID
        :param is_favorite: Filter by favorite status (true for favorites only, false for non-favorites only)
        :type is_favorite: bool
        :param is_trashed: Filter by trash status (true for trashed assets only, false for non-trashed only)
        :type is_trashed: bool
        :param key:
        :type key: str
        :param order: Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)
        :type order: AssetOrder
        :param person_id: Filter assets containing a specific person (face recognition)
        :type person_id: UUID
        :param slug:
        :type slug: str
        :param tag_id: Filter assets with a specific tag
        :type tag_id: UUID
        :param user_id: Filter assets by specific user ID
        :type user_id: UUID
        :param visibility: Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)
        :type visibility: AssetVisibility
        :param with_coordinates: Include location data in the response
        :type with_coordinates: bool
        :param with_partners: Include assets shared by partners
        :type with_partners: bool
        :param with_stacked: Include stacked assets in the response. When true, only primary assets from stacks are returned.
        :type with_stacked: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """  # noqa: E501

        _param = self._get_time_buckets_serialize(
            album_id=album_id,
            is_favorite=is_favorite,
            is_trashed=is_trashed,
            key=key,
            order=order,
            person_id=person_id,
            slug=slug,
            tag_id=tag_id,
            user_id=user_id,
            visibility=visibility,
            with_coordinates=with_coordinates,
            with_partners=with_partners,
            with_stacked=with_stacked,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index,
        )

        _response_types_map: Dict[str, Optional[str]] = {
            "200": "List[TimeBucketsResponseDto]",
        }
        response_data = await self.api_client.call_api(
            *_param, _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_time_buckets_serialize(
        self,
        album_id,
        is_favorite,
        is_trashed,
        key,
        order,
        person_id,
        slug,
        tag_id,
        user_id,
        visibility,
        with_coordinates,
        with_partners,
        with_stacked,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:
        _host = None

        _collection_formats: Dict[str, str] = {}

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if album_id is not None:
            _query_params.append(("albumId", album_id))

        if is_favorite is not None:
            _query_params.append(("isFavorite", is_favorite))

        if is_trashed is not None:
            _query_params.append(("isTrashed", is_trashed))

        if key is not None:
            _query_params.append(("key", key))

        if order is not None:
            _query_params.append(("order", order.value))

        if person_id is not None:
            _query_params.append(("personId", person_id))

        if slug is not None:
            _query_params.append(("slug", slug))

        if tag_id is not None:
            _query_params.append(("tagId", tag_id))

        if user_id is not None:
            _query_params.append(("userId", user_id))

        if visibility is not None:
            _query_params.append(("visibility", visibility.value))

        if with_coordinates is not None:
            _query_params.append(("withCoordinates", with_coordinates))

        if with_partners is not None:
            _query_params.append(("withPartners", with_partners))

        if with_stacked is not None:
            _query_params.append(("withStacked", with_stacked))

        # process the header parameters
        # process the form parameters
        # process the body parameter

        # set the HTTP header `Accept`
        if "Accept" not in _header_params:
            _header_params["Accept"] = self.api_client.select_header_accept(
                ["application/json"]
            )

        # authentication setting
        _auth_settings: List[str] = ["cookie", "api_key", "bearer"]

        return self.api_client.param_serialize(
            method="GET",
            resource_path="/timeline/buckets",
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth,
        )
