# coding: utf-8

"""
    One-API

    No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)

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

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

import warnings
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 Field, StrictInt, StrictStr, field_validator
from typing import Any, Dict, Optional
from typing_extensions import Annotated
from bsg_api.models.search_operator import SearchOperator
from bsg_api.models.sort_way import SortWay
from bsg_api.models.stoplist_add200_response import StoplistAdd200Response
from bsg_api.models.stoplist_add_request import StoplistAddRequest
from bsg_api.models.stoplist_items200_response import StoplistItems200Response
from bsg_api.models.stoplist_remove_request import StoplistRemoveRequest
from bsg_api.models.stoplist_search200_response import StoplistSearch200Response
from bsg_api.models.stoplist_search_field import StoplistSearchField

from bsg_api.api_client import ApiClient, RequestSerialized
from bsg_api.api_response import ApiResponse
from bsg_api.rest import RESTResponseType


class StopListApi:
    """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
    def stoplist_add(
        self,
        stoplist_add_request: StoplistAddRequest,
        _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,
    ) -> StoplistAdd200Response:
        """Add contacts to stop list

        Performs adding one or more contacts to the stop list

        :param stoplist_add_request: (required)
        :type stoplist_add_request: StoplistAddRequest
        :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._stoplist_add_serialize(
            stoplist_add_request=stoplist_add_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    @validate_call
    def stoplist_add_with_http_info(
        self,
        stoplist_add_request: StoplistAddRequest,
        _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[StoplistAdd200Response]:
        """Add contacts to stop list

        Performs adding one or more contacts to the stop list

        :param stoplist_add_request: (required)
        :type stoplist_add_request: StoplistAddRequest
        :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._stoplist_add_serialize(
            stoplist_add_request=stoplist_add_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    @validate_call
    def stoplist_add_without_preload_content(
        self,
        stoplist_add_request: StoplistAddRequest,
        _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:
        """Add contacts to stop list

        Performs adding one or more contacts to the stop list

        :param stoplist_add_request: (required)
        :type stoplist_add_request: StoplistAddRequest
        :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._stoplist_add_serialize(
            stoplist_add_request=stoplist_add_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    def _stoplist_add_serialize(
        self,
        stoplist_add_request,
        _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
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if stoplist_add_request is not None:
            _body_params = stoplist_add_request


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'ExternalAuth'
        ]

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/api/stoplist/attach',
            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
    def stoplist_items(
        self,
        page_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
        page_limit: Annotated[Optional[Annotated[int, Field(le=500, strict=True, ge=15)]], Field(description="The number of items in the response")] = None,
        type: Annotated[Optional[StrictStr], Field(description="Specify the type of the stop list for which we need to return the contact list. If the stop list type is not specified, the method will return data for all the stop list types")] = 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,
    ) -> StoplistItems200Response:
        """List the contacts of stop lists

        The method allows getting a list of contacts that were added to the SMS and/or Viber stop list

        :param page_offset:
        :type page_offset: int
        :param page_limit: The number of items in the response
        :type page_limit: int
        :param type: Specify the type of the stop list for which we need to return the contact list. If the stop list type is not specified, the method will return data for all the stop list types
        :type type: str
        :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._stoplist_items_serialize(
            page_offset=page_offset,
            page_limit=page_limit,
            type=type,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    @validate_call
    def stoplist_items_with_http_info(
        self,
        page_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
        page_limit: Annotated[Optional[Annotated[int, Field(le=500, strict=True, ge=15)]], Field(description="The number of items in the response")] = None,
        type: Annotated[Optional[StrictStr], Field(description="Specify the type of the stop list for which we need to return the contact list. If the stop list type is not specified, the method will return data for all the stop list types")] = 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[StoplistItems200Response]:
        """List the contacts of stop lists

        The method allows getting a list of contacts that were added to the SMS and/or Viber stop list

        :param page_offset:
        :type page_offset: int
        :param page_limit: The number of items in the response
        :type page_limit: int
        :param type: Specify the type of the stop list for which we need to return the contact list. If the stop list type is not specified, the method will return data for all the stop list types
        :type type: str
        :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._stoplist_items_serialize(
            page_offset=page_offset,
            page_limit=page_limit,
            type=type,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    @validate_call
    def stoplist_items_without_preload_content(
        self,
        page_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
        page_limit: Annotated[Optional[Annotated[int, Field(le=500, strict=True, ge=15)]], Field(description="The number of items in the response")] = None,
        type: Annotated[Optional[StrictStr], Field(description="Specify the type of the stop list for which we need to return the contact list. If the stop list type is not specified, the method will return data for all the stop list types")] = 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:
        """List the contacts of stop lists

        The method allows getting a list of contacts that were added to the SMS and/or Viber stop list

        :param page_offset:
        :type page_offset: int
        :param page_limit: The number of items in the response
        :type page_limit: int
        :param type: Specify the type of the stop list for which we need to return the contact list. If the stop list type is not specified, the method will return data for all the stop list types
        :type type: str
        :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._stoplist_items_serialize(
            page_offset=page_offset,
            page_limit=page_limit,
            type=type,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    def _stoplist_items_serialize(
        self,
        page_offset,
        page_limit,
        type,
        _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 page_offset is not None:
            
            _query_params.append(('page[offset]', page_offset))
            
        if page_limit is not None:
            
            _query_params.append(('page[limit]', page_limit))
            
        if type is not None:
            
            _query_params.append(('type', type))
            
        # 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] = [
            'ExternalAuth'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/api/stoplist',
            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
    def stoplist_remove(
        self,
        stoplist_remove_request: StoplistRemoveRequest,
        _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,
    ) -> object:
        """Remove contacts from stop list

        Performs the removal of one or more contacts from the stop list

        :param stoplist_remove_request: (required)
        :type stoplist_remove_request: StoplistRemoveRequest
        :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._stoplist_remove_serialize(
            stoplist_remove_request=stoplist_remove_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    @validate_call
    def stoplist_remove_with_http_info(
        self,
        stoplist_remove_request: StoplistRemoveRequest,
        _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[object]:
        """Remove contacts from stop list

        Performs the removal of one or more contacts from the stop list

        :param stoplist_remove_request: (required)
        :type stoplist_remove_request: StoplistRemoveRequest
        :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._stoplist_remove_serialize(
            stoplist_remove_request=stoplist_remove_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    @validate_call
    def stoplist_remove_without_preload_content(
        self,
        stoplist_remove_request: StoplistRemoveRequest,
        _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:
        """Remove contacts from stop list

        Performs the removal of one or more contacts from the stop list

        :param stoplist_remove_request: (required)
        :type stoplist_remove_request: StoplistRemoveRequest
        :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._stoplist_remove_serialize(
            stoplist_remove_request=stoplist_remove_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    def _stoplist_remove_serialize(
        self,
        stoplist_remove_request,
        _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
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if stoplist_remove_request is not None:
            _body_params = stoplist_remove_request


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'ExternalAuth'
        ]

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/api/stoplist/detach',
            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
    def stoplist_search(
        self,
        page_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
        page_limit: Annotated[Optional[Annotated[int, Field(le=500, strict=True, ge=15)]], Field(description="The number of items in the response")] = None,
        sort: Annotated[Optional[StrictStr], Field(description="Sort by conditions: id, phone")] = None,
        way: Optional[SortWay] = None,
        contact_group_id: Annotated[Optional[StrictInt], Field(description="Find only phone numbers in stop list that included into specified contact list")] = None,
        search_field: Optional[StoplistSearchField] = None,
        search_operator: Optional[SearchOperator] = None,
        search_value: Optional[StrictStr] = None,
        search_fields_0_field: Optional[StoplistSearchField] = None,
        search_fields_0_operator: Optional[SearchOperator] = None,
        search_fields_0_value: Optional[StrictStr] = 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,
    ) -> StoplistSearch200Response:
        """Search contacts in Stop lists

        Search contacts in stop lists by criteria

        :param page_offset:
        :type page_offset: int
        :param page_limit: The number of items in the response
        :type page_limit: int
        :param sort: Sort by conditions: id, phone
        :type sort: str
        :param way:
        :type way: SortWay
        :param contact_group_id: Find only phone numbers in stop list that included into specified contact list
        :type contact_group_id: int
        :param search_field:
        :type search_field: StoplistSearchField
        :param search_operator:
        :type search_operator: SearchOperator
        :param search_value:
        :type search_value: str
        :param search_fields_0_field:
        :type search_fields_0_field: StoplistSearchField
        :param search_fields_0_operator:
        :type search_fields_0_operator: SearchOperator
        :param search_fields_0_value:
        :type search_fields_0_value: str
        :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._stoplist_search_serialize(
            page_offset=page_offset,
            page_limit=page_limit,
            sort=sort,
            way=way,
            contact_group_id=contact_group_id,
            search_field=search_field,
            search_operator=search_operator,
            search_value=search_value,
            search_fields_0_field=search_fields_0_field,
            search_fields_0_operator=search_fields_0_operator,
            search_fields_0_value=search_fields_0_value,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    @validate_call
    def stoplist_search_with_http_info(
        self,
        page_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
        page_limit: Annotated[Optional[Annotated[int, Field(le=500, strict=True, ge=15)]], Field(description="The number of items in the response")] = None,
        sort: Annotated[Optional[StrictStr], Field(description="Sort by conditions: id, phone")] = None,
        way: Optional[SortWay] = None,
        contact_group_id: Annotated[Optional[StrictInt], Field(description="Find only phone numbers in stop list that included into specified contact list")] = None,
        search_field: Optional[StoplistSearchField] = None,
        search_operator: Optional[SearchOperator] = None,
        search_value: Optional[StrictStr] = None,
        search_fields_0_field: Optional[StoplistSearchField] = None,
        search_fields_0_operator: Optional[SearchOperator] = None,
        search_fields_0_value: Optional[StrictStr] = 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[StoplistSearch200Response]:
        """Search contacts in Stop lists

        Search contacts in stop lists by criteria

        :param page_offset:
        :type page_offset: int
        :param page_limit: The number of items in the response
        :type page_limit: int
        :param sort: Sort by conditions: id, phone
        :type sort: str
        :param way:
        :type way: SortWay
        :param contact_group_id: Find only phone numbers in stop list that included into specified contact list
        :type contact_group_id: int
        :param search_field:
        :type search_field: StoplistSearchField
        :param search_operator:
        :type search_operator: SearchOperator
        :param search_value:
        :type search_value: str
        :param search_fields_0_field:
        :type search_fields_0_field: StoplistSearchField
        :param search_fields_0_operator:
        :type search_fields_0_operator: SearchOperator
        :param search_fields_0_value:
        :type search_fields_0_value: str
        :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._stoplist_search_serialize(
            page_offset=page_offset,
            page_limit=page_limit,
            sort=sort,
            way=way,
            contact_group_id=contact_group_id,
            search_field=search_field,
            search_operator=search_operator,
            search_value=search_value,
            search_fields_0_field=search_fields_0_field,
            search_fields_0_operator=search_fields_0_operator,
            search_fields_0_value=search_fields_0_value,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    @validate_call
    def stoplist_search_without_preload_content(
        self,
        page_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
        page_limit: Annotated[Optional[Annotated[int, Field(le=500, strict=True, ge=15)]], Field(description="The number of items in the response")] = None,
        sort: Annotated[Optional[StrictStr], Field(description="Sort by conditions: id, phone")] = None,
        way: Optional[SortWay] = None,
        contact_group_id: Annotated[Optional[StrictInt], Field(description="Find only phone numbers in stop list that included into specified contact list")] = None,
        search_field: Optional[StoplistSearchField] = None,
        search_operator: Optional[SearchOperator] = None,
        search_value: Optional[StrictStr] = None,
        search_fields_0_field: Optional[StoplistSearchField] = None,
        search_fields_0_operator: Optional[SearchOperator] = None,
        search_fields_0_value: Optional[StrictStr] = 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:
        """Search contacts in Stop lists

        Search contacts in stop lists by criteria

        :param page_offset:
        :type page_offset: int
        :param page_limit: The number of items in the response
        :type page_limit: int
        :param sort: Sort by conditions: id, phone
        :type sort: str
        :param way:
        :type way: SortWay
        :param contact_group_id: Find only phone numbers in stop list that included into specified contact list
        :type contact_group_id: int
        :param search_field:
        :type search_field: StoplistSearchField
        :param search_operator:
        :type search_operator: SearchOperator
        :param search_value:
        :type search_value: str
        :param search_fields_0_field:
        :type search_fields_0_field: StoplistSearchField
        :param search_fields_0_operator:
        :type search_fields_0_operator: SearchOperator
        :param search_fields_0_value:
        :type search_fields_0_value: str
        :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._stoplist_search_serialize(
            page_offset=page_offset,
            page_limit=page_limit,
            sort=sort,
            way=way,
            contact_group_id=contact_group_id,
            search_field=search_field,
            search_operator=search_operator,
            search_value=search_value,
            search_fields_0_field=search_fields_0_field,
            search_fields_0_operator=search_fields_0_operator,
            search_fields_0_value=search_fields_0_value,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

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


    def _stoplist_search_serialize(
        self,
        page_offset,
        page_limit,
        sort,
        way,
        contact_group_id,
        search_field,
        search_operator,
        search_value,
        search_fields_0_field,
        search_fields_0_operator,
        search_fields_0_value,
        _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 page_offset is not None:
            
            _query_params.append(('page[offset]', page_offset))
            
        if page_limit is not None:
            
            _query_params.append(('page[limit]', page_limit))
            
        if sort is not None:
            
            _query_params.append(('sort', sort))
            
        if way is not None:
            
            _query_params.append(('way', way.value))
            
        if contact_group_id is not None:
            
            _query_params.append(('contact_group_id', contact_group_id))
            
        if search_field is not None:
            
            _query_params.append(('search[field]', search_field.value))
            
        if search_operator is not None:
            
            _query_params.append(('search[operator]', search_operator.value))
            
        if search_value is not None:
            
            _query_params.append(('search[value]', search_value))
            
        if search_fields_0_field is not None:
            
            _query_params.append(('search_fields[0][field]', search_fields_0_field.value))
            
        if search_fields_0_operator is not None:
            
            _query_params.append(('search_fields[0][operator]', search_fields_0_operator.value))
            
        if search_fields_0_value is not None:
            
            _query_params.append(('search_fields[0][value]', search_fields_0_value))
            
        # 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] = [
            'ExternalAuth'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/api/stoplist/search',
            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
        )


