# This file was auto-generated by Fern from our API Definition.

import typing

from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ...core.request_options import RequestOptions
from ...types.column_filter import ColumnFilter
from ...types.workspace_analytics_query_response_model import WorkspaceAnalyticsQueryResponseModel
from .raw_client import AsyncRawUsageClient, RawUsageClient
from .types.body_get_workspace_usage_v_1_workspace_analytics_query_usage_by_product_over_time_post_group_by_item import (
    BodyGetWorkspaceUsageV1WorkspaceAnalyticsQueryUsageByProductOverTimePostGroupByItem,
)

# this is used as the default value for optional parameters
OMIT = typing.cast(typing.Any, ...)


class UsageClient:
    def __init__(self, *, client_wrapper: SyncClientWrapper):
        self._raw_client = RawUsageClient(client_wrapper=client_wrapper)

    @property
    def with_raw_response(self) -> RawUsageClient:
        """
        Retrieves a raw implementation of this client that returns raw responses.

        Returns
        -------
        RawUsageClient
        """
        return self._raw_client

    def get_usage_by_product_over_time(
        self,
        *,
        start_time: int,
        end_time: int,
        interval_seconds: typing.Optional[int] = OMIT,
        group_by: typing.Optional[
            typing.Sequence[BodyGetWorkspaceUsageV1WorkspaceAnalyticsQueryUsageByProductOverTimePostGroupByItem]
        ] = OMIT,
        filters: typing.Optional[typing.Sequence[ColumnFilter]] = OMIT,
        time_zone: typing.Optional[str] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> WorkspaceAnalyticsQueryResponseModel:
        """
        Returns credit usage broken down by product type over time. The response is a tabular structure with columns, column_types, column_units, and rows.

        Parameters
        ----------
        start_time : int
            Start of the time range as a Unix timestamp in milliseconds. Must be at least 2020-01-01.

        end_time : int
            End of the time range as a Unix timestamp in milliseconds. Must be at least 2020-01-01.

        interval_seconds : typing.Optional[int]
            Bucket size in seconds. Each row in the response covers this many seconds of the selected time range. For example, pass 3600 for hourly buckets or 86400 for daily buckets. Whether `time_zone` shifts bucket boundaries depends on this value: whole-day multiples (e.g. 86400) align to local midnight; whole-hour multiples up to 24 hours (e.g. 3600, 14400) align to local hour boundaries from midnight; sub-hour values and other sizes remain UTC-anchored regardless of `time_zone`.

        group_by : typing.Optional[typing.Sequence[BodyGetWorkspaceUsageV1WorkspaceAnalyticsQueryUsageByProductOverTimePostGroupByItem]]

        filters : typing.Optional[typing.Sequence[ColumnFilter]]

        time_zone : typing.Optional[str]
            IANA time zone identifier (e.g. 'America/New_York', 'Europe/London', 'UTC') used to align bucket boundaries for eligible `interval_seconds` values. Whole-day multiples start at local midnight; whole-hour multiples up to 24 hours align to local hour boundaries from midnight. Sub-hour intervals and other bucket sizes remain UTC-anchored regardless of this setting. Defaults to UTC.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        WorkspaceAnalyticsQueryResponseModel
            Successful Response

        Examples
        --------
        from elevenlabs import ElevenLabs

        client = ElevenLabs(
            api_key="YOUR_API_KEY",
        )
        client.workspace.usage.get_usage_by_product_over_time(
            start_time=1,
            end_time=1,
        )
        """
        _response = self._raw_client.get_usage_by_product_over_time(
            start_time=start_time,
            end_time=end_time,
            interval_seconds=interval_seconds,
            group_by=group_by,
            filters=filters,
            time_zone=time_zone,
            request_options=request_options,
        )
        return _response.data


class AsyncUsageClient:
    def __init__(self, *, client_wrapper: AsyncClientWrapper):
        self._raw_client = AsyncRawUsageClient(client_wrapper=client_wrapper)

    @property
    def with_raw_response(self) -> AsyncRawUsageClient:
        """
        Retrieves a raw implementation of this client that returns raw responses.

        Returns
        -------
        AsyncRawUsageClient
        """
        return self._raw_client

    async def get_usage_by_product_over_time(
        self,
        *,
        start_time: int,
        end_time: int,
        interval_seconds: typing.Optional[int] = OMIT,
        group_by: typing.Optional[
            typing.Sequence[BodyGetWorkspaceUsageV1WorkspaceAnalyticsQueryUsageByProductOverTimePostGroupByItem]
        ] = OMIT,
        filters: typing.Optional[typing.Sequence[ColumnFilter]] = OMIT,
        time_zone: typing.Optional[str] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> WorkspaceAnalyticsQueryResponseModel:
        """
        Returns credit usage broken down by product type over time. The response is a tabular structure with columns, column_types, column_units, and rows.

        Parameters
        ----------
        start_time : int
            Start of the time range as a Unix timestamp in milliseconds. Must be at least 2020-01-01.

        end_time : int
            End of the time range as a Unix timestamp in milliseconds. Must be at least 2020-01-01.

        interval_seconds : typing.Optional[int]
            Bucket size in seconds. Each row in the response covers this many seconds of the selected time range. For example, pass 3600 for hourly buckets or 86400 for daily buckets. Whether `time_zone` shifts bucket boundaries depends on this value: whole-day multiples (e.g. 86400) align to local midnight; whole-hour multiples up to 24 hours (e.g. 3600, 14400) align to local hour boundaries from midnight; sub-hour values and other sizes remain UTC-anchored regardless of `time_zone`.

        group_by : typing.Optional[typing.Sequence[BodyGetWorkspaceUsageV1WorkspaceAnalyticsQueryUsageByProductOverTimePostGroupByItem]]

        filters : typing.Optional[typing.Sequence[ColumnFilter]]

        time_zone : typing.Optional[str]
            IANA time zone identifier (e.g. 'America/New_York', 'Europe/London', 'UTC') used to align bucket boundaries for eligible `interval_seconds` values. Whole-day multiples start at local midnight; whole-hour multiples up to 24 hours align to local hour boundaries from midnight. Sub-hour intervals and other bucket sizes remain UTC-anchored regardless of this setting. Defaults to UTC.

        request_options : typing.Optional[RequestOptions]
            Request-specific configuration.

        Returns
        -------
        WorkspaceAnalyticsQueryResponseModel
            Successful Response

        Examples
        --------
        import asyncio

        from elevenlabs import AsyncElevenLabs

        client = AsyncElevenLabs(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.workspace.usage.get_usage_by_product_over_time(
                start_time=1,
                end_time=1,
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.get_usage_by_product_over_time(
            start_time=start_time,
            end_time=end_time,
            interval_seconds=interval_seconds,
            group_by=group_by,
            filters=filters,
            time_zone=time_zone,
            request_options=request_options,
        )
        return _response.data
