# 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.lse_organization_member_list import LseOrganizationMemberList
from ...types.organization_member import OrganizationMember
from ...types.paginated_lse_organization_member_list_list import PaginatedLseOrganizationMemberListList
from ...types.role9e7enum import Role9E7Enum
from .raw_client import AsyncRawMembersClient, RawMembersClient

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


class MembersClient:
    def __init__(self, *, client_wrapper: SyncClientWrapper):
        self._raw_client = RawMembersClient(client_wrapper=client_wrapper)

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

        Returns
        -------
        RawMembersClient
        """
        return self._raw_client

    def list(
        self,
        id: int,
        *,
        contributed_to_projects: typing.Optional[bool] = None,
        exclude_project_id: typing.Optional[int] = None,
        exclude_workspace_id: typing.Optional[int] = None,
        ordering: typing.Optional[str] = None,
        page: typing.Optional[int] = None,
        page_size: typing.Optional[int] = None,
        role: typing.Optional[str] = None,
        search: typing.Optional[str] = None,
        tags: typing.Optional[str] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> PaginatedLseOrganizationMemberListList:
        """
        <Card href="https://humansignal.com/goenterprise">
                <img style="pointer-events: none; margin-left: 0px; margin-right: 0px;" src="https://docs.humansignal.com/images/badge.svg" alt="Label Studio Enterprise badge"/>
                <p style="margin-top: 10px; font-size: 14px;">
                    This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
                </p>
            </Card>
        Retrieve a list of all users and roles in a specific organization.

        Parameters
        ----------
        id : int
            A unique integer value identifying this organization.

        contributed_to_projects : typing.Optional[bool]
            Whether to include projects created and contributed to by the members.

        exclude_project_id : typing.Optional[int]
            Project ID to exclude users who are already associated with this project (direct members, workspace members, or implicit admin/owner access).

        exclude_workspace_id : typing.Optional[int]
            Workspace ID to exclude users who are already associated with this workspace (direct workspace members or implicit admin/owner access).

        ordering : typing.Optional[str]
            Which field to use when ordering the results.

        page : typing.Optional[int]
            A page number within the paginated result set.

        page_size : typing.Optional[int]
            Number of results to return per page.

        role : typing.Optional[str]
            Filter members by organization role. Accepts single role or comma-separated list of roles.

            **Format:**
            - Single role: `?role=RE`
            - Multiple roles: `?role=AN,RE` (users with ANY of these roles)

            **Role Codes:**
            - `OW` = Owner
            - `AD` = Administrator
            - `MA` = Manager
            - `RE` = Reviewer
            - `AN` = Annotator
            - `NO` = Not Activated
            - `DI` = Disabled

        search : typing.Optional[str]
            A search term.

        tags : typing.Optional[str]
            Filter members by tags. Use a comma-separated list of tag IDs.

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

        Returns
        -------
        PaginatedLseOrganizationMemberListList


        Examples
        --------
        from label_studio_sdk import LabelStudio

        client = LabelStudio(
            api_key="YOUR_API_KEY",
        )
        client.organizations.members.list(
            id=1,
        )
        """
        _response = self._raw_client.list(
            id,
            contributed_to_projects=contributed_to_projects,
            exclude_project_id=exclude_project_id,
            exclude_workspace_id=exclude_workspace_id,
            ordering=ordering,
            page=page,
            page_size=page_size,
            role=role,
            search=search,
            tags=tags,
            request_options=request_options,
        )
        return _response.data

    def update(
        self,
        id: int,
        *,
        role: typing.Optional[Role9E7Enum] = OMIT,
        user_id: typing.Optional[int] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> LseOrganizationMemberList:
        """
        <Card href="https://humansignal.com/goenterprise">
                <img style="pointer-events: none; margin-left: 0px; margin-right: 0px;" src="https://docs.humansignal.com/images/badge.svg" alt="Label Studio Enterprise badge"/>
                <p style="margin-top: 10px; font-size: 14px;">
                    This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
                </p>
            </Card>
        Update organization membership or role for a specific user ID.

        **User Rotation Best Practices for API Usage**

        To maintain compliance with our licensing terms and ensure optimal performance of HumanSignal's APIs, please consider the following guidelines when managing user assignments:

        * **Maintain a 7-Day Minimum Assignment**: Once a licensed seat is assigned to a user, maintain that assignment for at least seven consecutive days before rotating it to another user.

        * **Automate, Monitor, and Log Rotations**: Implement automated scheduling and logging mechanisms to track the timing of user rotations. This helps ensure that rotations adhere to the seven-day minimum period.

        * **Adhere to API Update Frequency and Wait Periods**: When updating user assignments via our APIs, follow the recommended frequency and wait period guidelines provided in the HumanSignal API documentation. Avoid sending rapid, successive requests that might overload the endpoint. Instead, incorporate appropriate delays between calls as specified in the documentation.

        * **Avoid Overloading the API Endpoint**: Design your integration to batch or schedule updates where possible, and implement backoff strategies if the API indicates rate limiting. This helps prevent service disruptions and ensures a smooth operation.

        Parameters
        ----------
        id : int
            A unique integer value identifying this organization.

        role : typing.Optional[Role9E7Enum]
            Organization role

            * `OW` - Owner
            * `AD` - Administrator
            * `MA` - Manager
            * `RE` - Reviewer
            * `AN` - Annotator
            * `DI` - Deactivated
            * `NO` - Not Activated

        user_id : typing.Optional[int]
            Member

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

        Returns
        -------
        LseOrganizationMemberList


        Examples
        --------
        from label_studio_sdk import LabelStudio

        client = LabelStudio(
            api_key="YOUR_API_KEY",
        )
        client.organizations.members.update(
            id=1,
        )
        """
        _response = self._raw_client.update(id, role=role, user_id=user_id, request_options=request_options)
        return _response.data

    def get(
        self,
        id: int,
        user_pk: int,
        *,
        contributed_to_projects: typing.Optional[bool] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> OrganizationMember:
        """
        Get organization member details by user ID.

        Parameters
        ----------
        id : int

        user_pk : int
            A unique integer value identifying the user to get organization details for.

        contributed_to_projects : typing.Optional[bool]
            Whether to include projects created and contributed to by the member.

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

        Returns
        -------
        OrganizationMember


        Examples
        --------
        from label_studio_sdk import LabelStudio

        client = LabelStudio(
            api_key="YOUR_API_KEY",
        )
        client.organizations.members.get(
            id=1,
            user_pk=1,
        )
        """
        _response = self._raw_client.get(
            id, user_pk, contributed_to_projects=contributed_to_projects, request_options=request_options
        )
        return _response.data

    def delete(self, id: int, user_pk: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
        """
        Soft delete a member from the organization.

        Parameters
        ----------
        id : int

        user_pk : int
            A unique integer value identifying the user to be deleted from the organization.

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

        Returns
        -------
        None

        Examples
        --------
        from label_studio_sdk import LabelStudio

        client = LabelStudio(
            api_key="YOUR_API_KEY",
        )
        client.organizations.members.delete(
            id=1,
            user_pk=1,
        )
        """
        _response = self._raw_client.delete(id, user_pk, request_options=request_options)
        return _response.data


class AsyncMembersClient:
    def __init__(self, *, client_wrapper: AsyncClientWrapper):
        self._raw_client = AsyncRawMembersClient(client_wrapper=client_wrapper)

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

        Returns
        -------
        AsyncRawMembersClient
        """
        return self._raw_client

    async def list(
        self,
        id: int,
        *,
        contributed_to_projects: typing.Optional[bool] = None,
        exclude_project_id: typing.Optional[int] = None,
        exclude_workspace_id: typing.Optional[int] = None,
        ordering: typing.Optional[str] = None,
        page: typing.Optional[int] = None,
        page_size: typing.Optional[int] = None,
        role: typing.Optional[str] = None,
        search: typing.Optional[str] = None,
        tags: typing.Optional[str] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> PaginatedLseOrganizationMemberListList:
        """
        <Card href="https://humansignal.com/goenterprise">
                <img style="pointer-events: none; margin-left: 0px; margin-right: 0px;" src="https://docs.humansignal.com/images/badge.svg" alt="Label Studio Enterprise badge"/>
                <p style="margin-top: 10px; font-size: 14px;">
                    This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
                </p>
            </Card>
        Retrieve a list of all users and roles in a specific organization.

        Parameters
        ----------
        id : int
            A unique integer value identifying this organization.

        contributed_to_projects : typing.Optional[bool]
            Whether to include projects created and contributed to by the members.

        exclude_project_id : typing.Optional[int]
            Project ID to exclude users who are already associated with this project (direct members, workspace members, or implicit admin/owner access).

        exclude_workspace_id : typing.Optional[int]
            Workspace ID to exclude users who are already associated with this workspace (direct workspace members or implicit admin/owner access).

        ordering : typing.Optional[str]
            Which field to use when ordering the results.

        page : typing.Optional[int]
            A page number within the paginated result set.

        page_size : typing.Optional[int]
            Number of results to return per page.

        role : typing.Optional[str]
            Filter members by organization role. Accepts single role or comma-separated list of roles.

            **Format:**
            - Single role: `?role=RE`
            - Multiple roles: `?role=AN,RE` (users with ANY of these roles)

            **Role Codes:**
            - `OW` = Owner
            - `AD` = Administrator
            - `MA` = Manager
            - `RE` = Reviewer
            - `AN` = Annotator
            - `NO` = Not Activated
            - `DI` = Disabled

        search : typing.Optional[str]
            A search term.

        tags : typing.Optional[str]
            Filter members by tags. Use a comma-separated list of tag IDs.

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

        Returns
        -------
        PaginatedLseOrganizationMemberListList


        Examples
        --------
        import asyncio

        from label_studio_sdk import AsyncLabelStudio

        client = AsyncLabelStudio(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.organizations.members.list(
                id=1,
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.list(
            id,
            contributed_to_projects=contributed_to_projects,
            exclude_project_id=exclude_project_id,
            exclude_workspace_id=exclude_workspace_id,
            ordering=ordering,
            page=page,
            page_size=page_size,
            role=role,
            search=search,
            tags=tags,
            request_options=request_options,
        )
        return _response.data

    async def update(
        self,
        id: int,
        *,
        role: typing.Optional[Role9E7Enum] = OMIT,
        user_id: typing.Optional[int] = OMIT,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> LseOrganizationMemberList:
        """
        <Card href="https://humansignal.com/goenterprise">
                <img style="pointer-events: none; margin-left: 0px; margin-right: 0px;" src="https://docs.humansignal.com/images/badge.svg" alt="Label Studio Enterprise badge"/>
                <p style="margin-top: 10px; font-size: 14px;">
                    This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)
                </p>
            </Card>
        Update organization membership or role for a specific user ID.

        **User Rotation Best Practices for API Usage**

        To maintain compliance with our licensing terms and ensure optimal performance of HumanSignal's APIs, please consider the following guidelines when managing user assignments:

        * **Maintain a 7-Day Minimum Assignment**: Once a licensed seat is assigned to a user, maintain that assignment for at least seven consecutive days before rotating it to another user.

        * **Automate, Monitor, and Log Rotations**: Implement automated scheduling and logging mechanisms to track the timing of user rotations. This helps ensure that rotations adhere to the seven-day minimum period.

        * **Adhere to API Update Frequency and Wait Periods**: When updating user assignments via our APIs, follow the recommended frequency and wait period guidelines provided in the HumanSignal API documentation. Avoid sending rapid, successive requests that might overload the endpoint. Instead, incorporate appropriate delays between calls as specified in the documentation.

        * **Avoid Overloading the API Endpoint**: Design your integration to batch or schedule updates where possible, and implement backoff strategies if the API indicates rate limiting. This helps prevent service disruptions and ensures a smooth operation.

        Parameters
        ----------
        id : int
            A unique integer value identifying this organization.

        role : typing.Optional[Role9E7Enum]
            Organization role

            * `OW` - Owner
            * `AD` - Administrator
            * `MA` - Manager
            * `RE` - Reviewer
            * `AN` - Annotator
            * `DI` - Deactivated
            * `NO` - Not Activated

        user_id : typing.Optional[int]
            Member

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

        Returns
        -------
        LseOrganizationMemberList


        Examples
        --------
        import asyncio

        from label_studio_sdk import AsyncLabelStudio

        client = AsyncLabelStudio(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.organizations.members.update(
                id=1,
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.update(id, role=role, user_id=user_id, request_options=request_options)
        return _response.data

    async def get(
        self,
        id: int,
        user_pk: int,
        *,
        contributed_to_projects: typing.Optional[bool] = None,
        request_options: typing.Optional[RequestOptions] = None,
    ) -> OrganizationMember:
        """
        Get organization member details by user ID.

        Parameters
        ----------
        id : int

        user_pk : int
            A unique integer value identifying the user to get organization details for.

        contributed_to_projects : typing.Optional[bool]
            Whether to include projects created and contributed to by the member.

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

        Returns
        -------
        OrganizationMember


        Examples
        --------
        import asyncio

        from label_studio_sdk import AsyncLabelStudio

        client = AsyncLabelStudio(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.organizations.members.get(
                id=1,
                user_pk=1,
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.get(
            id, user_pk, contributed_to_projects=contributed_to_projects, request_options=request_options
        )
        return _response.data

    async def delete(self, id: int, user_pk: int, *, request_options: typing.Optional[RequestOptions] = None) -> None:
        """
        Soft delete a member from the organization.

        Parameters
        ----------
        id : int

        user_pk : int
            A unique integer value identifying the user to be deleted from the organization.

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

        Returns
        -------
        None

        Examples
        --------
        import asyncio

        from label_studio_sdk import AsyncLabelStudio

        client = AsyncLabelStudio(
            api_key="YOUR_API_KEY",
        )


        async def main() -> None:
            await client.organizations.members.delete(
                id=1,
                user_pk=1,
            )


        asyncio.run(main())
        """
        _response = await self._raw_client.delete(id, user_pk, request_options=request_options)
        return _response.data
