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

import datetime as dt
import typing

from ..commons.types.dataset_run_item import DatasetRunItem
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.request_options import RequestOptions
from .raw_client import AsyncRawDatasetRunItemsClient, RawDatasetRunItemsClient
from .types.paginated_dataset_run_items import PaginatedDatasetRunItems

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


class DatasetRunItemsClient:
    def __init__(self, *, client_wrapper: SyncClientWrapper):
        self._raw_client = RawDatasetRunItemsClient(client_wrapper=client_wrapper)

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

        Returns
        -------
        RawDatasetRunItemsClient
        """
        return self._raw_client

    def create(
        self,
        *,
        run_name: str,
        dataset_item_id: str,
        run_description: typing.Optional[str] = OMIT,
        metadata: typing.Optional[typing.Any] = OMIT,
        observation_id: typing.Optional[str] = OMIT,
        trace_id: typing.Optional[str] = OMIT,
        dataset_version: typing.Optional[dt.datetime] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> DatasetRunItem:
        """
        Create a dataset run item

        Parameters
        ----------
        run_name : str

        dataset_item_id : str

        run_description : typing.Optional[str]
            Description of the run. If run exists, description will be updated.

        metadata : typing.Optional[typing.Any]
            Metadata of the dataset run, updates run if run already exists

        observation_id : typing.Optional[str]

        trace_id : typing.Optional[str]
            traceId should always be provided. For compatibility with older SDK versions it can also be inferred from the provided observationId.

        dataset_version : typing.Optional[dt.datetime]
            ISO 8601 timestamp (RFC 3339, Section 5.6) in UTC (e.g., "2026-01-21T14:35:42Z").
            Specifies the dataset version to use for this experiment run.
            If provided, the experiment will use dataset items as they existed at or before this timestamp.
            If not provided, uses the latest version of dataset items.

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

        Returns
        -------
        DatasetRunItem

        Examples
        --------
        from langfuse import LangfuseAPI

        client = LangfuseAPI(
            x_langfuse_sdk_name="YOUR_X_LANGFUSE_SDK_NAME",
            x_langfuse_sdk_version="YOUR_X_LANGFUSE_SDK_VERSION",
            x_langfuse_public_key="YOUR_X_LANGFUSE_PUBLIC_KEY",
            username="YOUR_USERNAME",
            password="YOUR_PASSWORD",
            base_url="https://yourhost.com/path/to/api",
        )
        client.dataset_run_items.create(
            run_name="runName",
            dataset_item_id="datasetItemId",
        )
        """
        _response = self._raw_client.create(
            run_name=run_name,
            dataset_item_id=dataset_item_id,
            run_description=run_description,
            metadata=metadata,
            observation_id=observation_id,
            trace_id=trace_id,
            dataset_version=dataset_version,
            request_options=request_options,
        )
        return _response.data

    def list(
        self,
        *,
        dataset_id: str,
        run_name: str,
        page: typing.Optional[int] = None,
        limit: typing.Optional[int] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> PaginatedDatasetRunItems:
        """
        List dataset run items

        Parameters
        ----------
        dataset_id : str

        run_name : str

        page : typing.Optional[int]
            page number, starts at 1

        limit : typing.Optional[int]
            limit of items per page

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

        Returns
        -------
        PaginatedDatasetRunItems

        Examples
        --------
        from langfuse import LangfuseAPI

        client = LangfuseAPI(
            x_langfuse_sdk_name="YOUR_X_LANGFUSE_SDK_NAME",
            x_langfuse_sdk_version="YOUR_X_LANGFUSE_SDK_VERSION",
            x_langfuse_public_key="YOUR_X_LANGFUSE_PUBLIC_KEY",
            username="YOUR_USERNAME",
            password="YOUR_PASSWORD",
            base_url="https://yourhost.com/path/to/api",
        )
        client.dataset_run_items.list(
            dataset_id="datasetId",
            run_name="runName",
        )
        """
        _response = self._raw_client.list(
            dataset_id=dataset_id,
            run_name=run_name,
            page=page,
            limit=limit,
            request_options=request_options,
        )
        return _response.data


class AsyncDatasetRunItemsClient:
    def __init__(self, *, client_wrapper: AsyncClientWrapper):
        self._raw_client = AsyncRawDatasetRunItemsClient(client_wrapper=client_wrapper)

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

        Returns
        -------
        AsyncRawDatasetRunItemsClient
        """
        return self._raw_client

    async def create(
        self,
        *,
        run_name: str,
        dataset_item_id: str,
        run_description: typing.Optional[str] = OMIT,
        metadata: typing.Optional[typing.Any] = OMIT,
        observation_id: typing.Optional[str] = OMIT,
        trace_id: typing.Optional[str] = OMIT,
        dataset_version: typing.Optional[dt.datetime] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> DatasetRunItem:
        """
        Create a dataset run item

        Parameters
        ----------
        run_name : str

        dataset_item_id : str

        run_description : typing.Optional[str]
            Description of the run. If run exists, description will be updated.

        metadata : typing.Optional[typing.Any]
            Metadata of the dataset run, updates run if run already exists

        observation_id : typing.Optional[str]

        trace_id : typing.Optional[str]
            traceId should always be provided. For compatibility with older SDK versions it can also be inferred from the provided observationId.

        dataset_version : typing.Optional[dt.datetime]
            ISO 8601 timestamp (RFC 3339, Section 5.6) in UTC (e.g., "2026-01-21T14:35:42Z").
            Specifies the dataset version to use for this experiment run.
            If provided, the experiment will use dataset items as they existed at or before this timestamp.
            If not provided, uses the latest version of dataset items.

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

        Returns
        -------
        DatasetRunItem

        Examples
        --------
        import asyncio

        from langfuse import AsyncLangfuseAPI

        client = AsyncLangfuseAPI(
            x_langfuse_sdk_name="YOUR_X_LANGFUSE_SDK_NAME",
            x_langfuse_sdk_version="YOUR_X_LANGFUSE_SDK_VERSION",
            x_langfuse_public_key="YOUR_X_LANGFUSE_PUBLIC_KEY",
            username="YOUR_USERNAME",
            password="YOUR_PASSWORD",
            base_url="https://yourhost.com/path/to/api",
        )


        async def main() -> None:
            await client.dataset_run_items.create(
                run_name="runName",
                dataset_item_id="datasetItemId",
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.create(
            run_name=run_name,
            dataset_item_id=dataset_item_id,
            run_description=run_description,
            metadata=metadata,
            observation_id=observation_id,
            trace_id=trace_id,
            dataset_version=dataset_version,
            request_options=request_options,
        )
        return _response.data

    async def list(
        self,
        *,
        dataset_id: str,
        run_name: str,
        page: typing.Optional[int] = None,
        limit: typing.Optional[int] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> PaginatedDatasetRunItems:
        """
        List dataset run items

        Parameters
        ----------
        dataset_id : str

        run_name : str

        page : typing.Optional[int]
            page number, starts at 1

        limit : typing.Optional[int]
            limit of items per page

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

        Returns
        -------
        PaginatedDatasetRunItems

        Examples
        --------
        import asyncio

        from langfuse import AsyncLangfuseAPI

        client = AsyncLangfuseAPI(
            x_langfuse_sdk_name="YOUR_X_LANGFUSE_SDK_NAME",
            x_langfuse_sdk_version="YOUR_X_LANGFUSE_SDK_VERSION",
            x_langfuse_public_key="YOUR_X_LANGFUSE_PUBLIC_KEY",
            username="YOUR_USERNAME",
            password="YOUR_PASSWORD",
            base_url="https://yourhost.com/path/to/api",
        )


        async def main() -> None:
            await client.dataset_run_items.list(
                dataset_id="datasetId",
                run_name="runName",
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.list(
            dataset_id=dataset_id,
            run_name=run_name,
            page=page,
            limit=limit,
            request_options=request_options,
        )
        return _response.data
