"""
Type stubs for primp - HTTP client that can impersonate web browsers.

This module provides both synchronous and asynchronous HTTP clients with
browser impersonation capabilities.
"""

from typing import (
    Any,
    Dict,
    Iterator,
    Mapping,
    Optional,
    Tuple,
    Union,
    AsyncIterator,
)

# =============================================================================
# Type Aliases
# =============================================================================

HeadersType = Optional[Mapping[str, str]]
ParamsType = Optional[Mapping[str, str]]
CookiesType = Optional[Mapping[str, str]]
FilesType = Optional[Mapping[str, str]]
AuthType = Optional[Tuple[str, Optional[str]]]

# =============================================================================
# Exception Classes
# =============================================================================

class PrimpError(Exception):
    """Base exception for all primp errors."""
    ...

class BuilderError(PrimpError):
    """Error during client builder configuration."""
    ...

class RequestError(PrimpError):
    """Error during request execution."""
    ...

class ConnectError(RequestError):
    """Error connecting to the server."""
    ...

class TimeoutError(RequestError):
    """Request timed out."""
    ...

class StatusError(PrimpError):
    """HTTP status error (4xx/5xx)."""
    ...

class RedirectError(PrimpError):
    """Error during redirect handling."""
    ...

class BodyError(PrimpError):
    """Error with request/response body."""
    ...

class DecodeError(PrimpError):
    """Error decoding response content."""
    ...

class UpgradeError(PrimpError):
    """Error during protocol upgrade."""
    ...

# =============================================================================
# Response Classes (Synchronous)
# =============================================================================

class Response:
    """
    HTTP response object.
    
    Provides access to response status, headers, cookies, and body content.
    """
    
    # Properties (read-only)
    url: str
    status_code: int
    
    @property
    def content(self) -> bytes: ...
    @property
    def encoding(self) -> str: ...
    @encoding.setter
    def encoding(self, value: Optional[str]) -> None: ...
    @property
    def headers(self) -> Dict[str, str]: ...
    @property
    def cookies(self) -> Dict[str, str]: ...
    @property
    def text(self) -> str: ...
    @property
    def text_markdown(self) -> str: ...
    @property
    def text_plain(self) -> str: ...
    @property
    def text_rich(self) -> str: ...
    
    # Methods
    def json(self) -> Any: ...
    def raise_for_status(self) -> None: ...


class StreamResponse:
    """
    Streaming HTTP response object.
    
    Supports iteration over response chunks and context manager protocol.
    """
    
    # Properties (read-only)
    url: str
    status_code: int
    
    @property
    def headers(self) -> Dict[str, str]: ...
    @property
    def cookies(self) -> Dict[str, str]: ...
    @property
    def encoding(self) -> str: ...
    @encoding.setter
    def encoding(self, value: str) -> None: ...
    @property
    def content(self) -> bytes: ...
    @property
    def text(self) -> str: ...
    
    # Methods
    def read(self) -> bytes: ...
    def iter_bytes(self, chunk_size: Optional[int] = None) -> BytesIterator: ...
    def iter_text(self, chunk_size: Optional[int] = None) -> TextIterator: ...
    def iter_lines(self) -> LinesIterator: ...
    def next(self) -> Optional[bytes]: ...
    def close(self) -> None: ...
    def raise_for_status(self) -> None: ...
    
    # Context manager
    def __enter__(self) -> StreamResponse: ...
    def __exit__(
        self,
        exc_type: Optional[Any],
        exc_value: Optional[Any],
        traceback: Optional[Any],
    ) -> bool: ...


class BytesIterator:
    """Iterator over byte chunks from a streaming response."""
    
    def __iter__(self) -> BytesIterator: ...
    def __next__(self) -> bytes: ...


class TextIterator:
    """Iterator over text chunks from a streaming response."""
    
    def __iter__(self) -> TextIterator: ...
    def __next__(self) -> str: ...


class LinesIterator:
    """Iterator over lines from a streaming response."""
    
    def __iter__(self) -> LinesIterator: ...
    def __next__(self) -> str: ...


# =============================================================================
# Response Classes (Asynchronous)
# =============================================================================

class AsyncResponse:
    """
    Asynchronous HTTP response object.
    
    Provides access to response status, headers, cookies, and body content.
    All property access is synchronous but may block.
    """
    
    # Properties (read-only)
    url: str
    status_code: int
    
    @property
    def content(self) -> bytes: ...
    @property
    def encoding(self) -> str: ...
    @encoding.setter
    def encoding(self, value: Optional[str]) -> None: ...
    @property
    def headers(self) -> Dict[str, str]: ...
    @property
    def cookies(self) -> Dict[str, str]: ...
    @property
    def text(self) -> str: ...
    @property
    def text_markdown(self) -> str: ...
    @property
    def text_plain(self) -> str: ...
    @property
    def text_rich(self) -> str: ...
    
    # Methods
    def json(self) -> Any: ...
    def raise_for_status(self) -> None: ...


class AsyncStreamResponse:
    """
    Asynchronous streaming HTTP response object.
    
    Supports async iteration over response chunks and async context manager protocol.
    """
    
    # Properties (read-only)
    url: str
    status_code: int
    
    @property
    def headers(self) -> Dict[str, str]: ...
    @property
    def cookies(self) -> Dict[str, str]: ...
    @property
    def encoding(self) -> str: ...
    @encoding.setter
    def encoding(self, value: str) -> None: ...
    @property
    def content(self) -> bytes: ...
    @property
    def text(self) -> str: ...
    
    # Async methods
    async def aread(self) -> bytes: ...
    def aiter_bytes(self, chunk_size: Optional[int] = None) -> AsyncBytesIterator: ...
    def aiter_text(self, chunk_size: Optional[int] = None) -> AsyncTextIterator: ...
    def aiter_lines(self) -> AsyncLinesIterator: ...
    async def anext(self) -> Optional[bytes]: ...
    async def aclose(self) -> None: ...
    def raise_for_status(self) -> None: ...
    
    # Async context manager
    async def __aenter__(self) -> AsyncStreamResponse: ...
    async def __aexit__(
        self,
        exc_type: Optional[Any],
        exc_value: Optional[Any],
        traceback: Optional[Any],
    ) -> bool: ...


class AsyncBytesIterator:
    """Async iterator over byte chunks from a streaming response."""
    
    def __aiter__(self) -> AsyncBytesIterator: ...
    async def __anext__(self) -> bytes: ...


class AsyncTextIterator:
    """Async iterator over text chunks from a streaming response."""
    
    def __aiter__(self) -> AsyncTextIterator: ...
    async def __anext__(self) -> str: ...


class AsyncLinesIterator:
    """Async iterator over lines from a streaming response."""
    
    def __aiter__(self) -> AsyncLinesIterator: ...
    async def __anext__(self) -> str: ...


# =============================================================================
# Client Classes
# =============================================================================

class Client:
    """
    Synchronous HTTP client that can impersonate web browsers.
    
    This client supports browser impersonation, proxy configuration,
    cookie management, and various authentication methods.
    
    Example:
        >>> client = Client(impersonate="chrome_144")
        >>> response = client.get("https://example.com")
        >>> print(response.text)
    """
    
    # Instance properties
    auth: Optional[Tuple[str, Optional[str]]]
    auth_bearer: Optional[str]
    params: Optional[Mapping[str, str]]
    proxy: Optional[str]
    timeout: Optional[float]
    
    @property
    def headers(self) -> Dict[str, str]: ...
    @headers.setter
    def headers(self, value: Optional[Mapping[str, str]]) -> None: ...
    @property
    def impersonate(self) -> Optional[str]: ...
    @property
    def impersonate_os(self) -> Optional[str]: ...
    
    def __init__(
        self,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookie_store: bool = True,
        referer: bool = True,
        proxy: Optional[str] = None,
        timeout: Optional[float] = None,
        impersonate: Optional[str] = None,
        impersonate_os: Optional[str] = None,
        follow_redirects: bool = True,
        max_redirects: int = 20,
        verify: bool = True,
        ca_cert_file: Optional[str] = None,
        https_only: bool = False,
        http2_only: bool = False,
    ) -> None: ...
    
    def headers_update(self, new_headers: Optional[Mapping[str, str]]) -> None: ...
    def get_cookies(self, url: str) -> Dict[str, str]: ...
    def set_cookies(self, url: str, cookies: Optional[Mapping[str, str]]) -> None: ...
    
    def request(
        self,
        method: str,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[Response, StreamResponse]: ...
    
    def get(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[Response, StreamResponse]: ...
    
    def head(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[Response, StreamResponse]: ...
    
    def options(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[Response, StreamResponse]: ...
    
    def delete(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[Response, StreamResponse]: ...
    
    def post(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[Response, StreamResponse]: ...
    
    def put(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[Response, StreamResponse]: ...
    
    def patch(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[Response, StreamResponse]: ...
    
    # Context manager
    def __enter__(self) -> Client: ...
    def __exit__(
        self,
        exc_type: Optional[Any],
        exc_value: Optional[Any],
        traceback: Optional[Any],
    ) -> None: ...


class AsyncClient:
    """
    Asynchronous HTTP client that can impersonate web browsers.
    
    This client supports browser impersonation, proxy configuration,
    cookie management, and various authentication methods.
    
    Example:
        >>> async with AsyncClient(impersonate="chrome_144") as client:
        ...     response = await client.get("https://example.com")
        ...     print(response.text)
    """
    
    # Instance properties
    auth: Optional[Tuple[str, Optional[str]]]
    auth_bearer: Optional[str]
    params: Optional[Mapping[str, str]]
    proxy: Optional[str]
    timeout: Optional[float]
    
    @property
    def headers(self) -> Dict[str, str]: ...
    @headers.setter
    def headers(self, value: Optional[Mapping[str, str]]) -> None: ...
    @property
    def impersonate(self) -> Optional[str]: ...
    @property
    def impersonate_os(self) -> Optional[str]: ...
    
    def __init__(
        self,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookie_store: bool = True,
        referer: bool = True,
        proxy: Optional[str] = None,
        timeout: Optional[float] = None,
        impersonate: Optional[str] = None,
        impersonate_os: Optional[str] = None,
        follow_redirects: bool = True,
        max_redirects: int = 20,
        verify: bool = True,
        ca_cert_file: Optional[str] = None,
        https_only: bool = False,
        http2_only: bool = False,
    ) -> None: ...
    
    def headers_update(self, new_headers: Optional[Mapping[str, str]]) -> None: ...
    def get_cookies(self, url: str) -> Dict[str, str]: ...
    def set_cookies(self, url: str, cookies: Optional[Mapping[str, str]]) -> None: ...
    
    async def request(
        self,
        method: str,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[AsyncResponse, AsyncStreamResponse]: ...
    
    async def get(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[AsyncResponse, AsyncStreamResponse]: ...
    
    async def head(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[AsyncResponse, AsyncStreamResponse]: ...
    
    async def options(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[AsyncResponse, AsyncStreamResponse]: ...
    
    async def delete(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[AsyncResponse, AsyncStreamResponse]: ...
    
    async def post(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[AsyncResponse, AsyncStreamResponse]: ...
    
    async def put(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[AsyncResponse, AsyncStreamResponse]: ...
    
    async def patch(
        self,
        url: str,
        params: Optional[Mapping[str, str]] = None,
        headers: Optional[Mapping[str, str]] = None,
        cookies: Optional[Mapping[str, str]] = None,
        content: Optional[bytes] = None,
        data: Optional[Any] = None,
        json: Optional[Any] = None,
        files: Optional[Mapping[str, str]] = None,
        auth: Optional[Tuple[str, Optional[str]]] = None,
        auth_bearer: Optional[str] = None,
        timeout: Optional[float] = None,
        stream: bool = False,
    ) -> Union[AsyncResponse, AsyncStreamResponse]: ...
    
    # Async context manager
    async def __aenter__(self) -> AsyncClient: ...
    async def __aexit__(
        self,
        exc_type: Optional[Any],
        exc_value: Optional[Any],
        traceback: Optional[Any],
    ) -> None: ...


# =============================================================================
# Module-level Functions
# =============================================================================

def get(
    url: str,
    params: Optional[Mapping[str, str]] = None,
    headers: Optional[Mapping[str, str]] = None,
    cookies: Optional[Mapping[str, str]] = None,
    content: Optional[bytes] = None,
    data: Optional[Any] = None,
    json: Optional[Any] = None,
    files: Optional[Mapping[str, str]] = None,
    auth: Optional[Tuple[str, Optional[str]]] = None,
    auth_bearer: Optional[str] = None,
    timeout: Optional[float] = None,
    impersonate: Optional[str] = None,
    impersonate_os: Optional[str] = None,
    verify: bool = True,
    ca_cert_file: Optional[str] = None,
    stream: bool = False,
) -> Union[Response, StreamResponse]:
    """
    Send a GET request with a temporary client.
    
    Args:
        url: The URL to request.
        params: Query parameters to append to the URL.
        headers: HTTP headers to send with the request.
        cookies: Cookies to send with the request.
        content: Raw bytes to send in the request body.
        data: Form data to send in the request body.
        json: JSON-serializable object to send in the request body.
        files: Mapping of field names to file paths for multipart upload.
        auth: Tuple of (username, password) for basic authentication.
        auth_bearer: Bearer token for authentication.
        timeout: Request timeout in seconds.
        impersonate: Browser to impersonate (e.g., "chrome_144").
        impersonate_os: OS to impersonate (e.g., "windows", "macos", "linux").
        verify: Whether to verify SSL certificates.
        ca_cert_file: Path to CA certificate file.
        stream: If True, returns a StreamResponse for streaming.
    
    Returns:
        Response or StreamResponse object.
    """
    ...


def head(
    url: str,
    params: Optional[Mapping[str, str]] = None,
    headers: Optional[Mapping[str, str]] = None,
    cookies: Optional[Mapping[str, str]] = None,
    content: Optional[bytes] = None,
    data: Optional[Any] = None,
    json: Optional[Any] = None,
    files: Optional[Mapping[str, str]] = None,
    auth: Optional[Tuple[str, Optional[str]]] = None,
    auth_bearer: Optional[str] = None,
    timeout: Optional[float] = None,
    impersonate: Optional[str] = None,
    impersonate_os: Optional[str] = None,
    verify: bool = True,
    ca_cert_file: Optional[str] = None,
    stream: bool = False,
) -> Union[Response, StreamResponse]:
    """
    Send a HEAD request with a temporary client.
    
    Args:
        url: The URL to request.
        params: Query parameters to append to the URL.
        headers: HTTP headers to send with the request.
        cookies: Cookies to send with the request.
        content: Raw bytes to send in the request body.
        data: Form data to send in the request body.
        json: JSON-serializable object to send in the request body.
        files: Mapping of field names to file paths for multipart upload.
        auth: Tuple of (username, password) for basic authentication.
        auth_bearer: Bearer token for authentication.
        timeout: Request timeout in seconds.
        impersonate: Browser to impersonate (e.g., "chrome_144").
        impersonate_os: OS to impersonate (e.g., "windows", "macos", "linux").
        verify: Whether to verify SSL certificates.
        ca_cert_file: Path to CA certificate file.
        stream: If True, returns a StreamResponse for streaming.
    
    Returns:
        Response or StreamResponse object.
    """
    ...


def options(
    url: str,
    params: Optional[Mapping[str, str]] = None,
    headers: Optional[Mapping[str, str]] = None,
    cookies: Optional[Mapping[str, str]] = None,
    content: Optional[bytes] = None,
    data: Optional[Any] = None,
    json: Optional[Any] = None,
    files: Optional[Mapping[str, str]] = None,
    auth: Optional[Tuple[str, Optional[str]]] = None,
    auth_bearer: Optional[str] = None,
    timeout: Optional[float] = None,
    impersonate: Optional[str] = None,
    impersonate_os: Optional[str] = None,
    verify: bool = True,
    ca_cert_file: Optional[str] = None,
    stream: bool = False,
) -> Union[Response, StreamResponse]:
    """
    Send an OPTIONS request with a temporary client.
    
    Args:
        url: The URL to request.
        params: Query parameters to append to the URL.
        headers: HTTP headers to send with the request.
        cookies: Cookies to send with the request.
        content: Raw bytes to send in the request body.
        data: Form data to send in the request body.
        json: JSON-serializable object to send in the request body.
        files: Mapping of field names to file paths for multipart upload.
        auth: Tuple of (username, password) for basic authentication.
        auth_bearer: Bearer token for authentication.
        timeout: Request timeout in seconds.
        impersonate: Browser to impersonate (e.g., "chrome_144").
        impersonate_os: OS to impersonate (e.g., "windows", "macos", "linux").
        verify: Whether to verify SSL certificates.
        ca_cert_file: Path to CA certificate file.
        stream: If True, returns a StreamResponse for streaming.
    
    Returns:
        Response or StreamResponse object.
    """
    ...


def delete(
    url: str,
    params: Optional[Mapping[str, str]] = None,
    headers: Optional[Mapping[str, str]] = None,
    cookies: Optional[Mapping[str, str]] = None,
    content: Optional[bytes] = None,
    data: Optional[Any] = None,
    json: Optional[Any] = None,
    files: Optional[Mapping[str, str]] = None,
    auth: Optional[Tuple[str, Optional[str]]] = None,
    auth_bearer: Optional[str] = None,
    timeout: Optional[float] = None,
    impersonate: Optional[str] = None,
    impersonate_os: Optional[str] = None,
    verify: bool = True,
    ca_cert_file: Optional[str] = None,
    stream: bool = False,
) -> Union[Response, StreamResponse]:
    """
    Send a DELETE request with a temporary client.
    
    Args:
        url: The URL to request.
        params: Query parameters to append to the URL.
        headers: HTTP headers to send with the request.
        cookies: Cookies to send with the request.
        content: Raw bytes to send in the request body.
        data: Form data to send in the request body.
        json: JSON-serializable object to send in the request body.
        files: Mapping of field names to file paths for multipart upload.
        auth: Tuple of (username, password) for basic authentication.
        auth_bearer: Bearer token for authentication.
        timeout: Request timeout in seconds.
        impersonate: Browser to impersonate (e.g., "chrome_144").
        impersonate_os: OS to impersonate (e.g., "windows", "macos", "linux").
        verify: Whether to verify SSL certificates.
        ca_cert_file: Path to CA certificate file.
        stream: If True, returns a StreamResponse for streaming.
    
    Returns:
        Response or StreamResponse object.
    """
    ...


def post(
    url: str,
    params: Optional[Mapping[str, str]] = None,
    headers: Optional[Mapping[str, str]] = None,
    cookies: Optional[Mapping[str, str]] = None,
    content: Optional[bytes] = None,
    data: Optional[Any] = None,
    json: Optional[Any] = None,
    files: Optional[Mapping[str, str]] = None,
    auth: Optional[Tuple[str, Optional[str]]] = None,
    auth_bearer: Optional[str] = None,
    timeout: Optional[float] = None,
    impersonate: Optional[str] = None,
    impersonate_os: Optional[str] = None,
    verify: bool = True,
    ca_cert_file: Optional[str] = None,
    stream: bool = False,
) -> Union[Response, StreamResponse]:
    """
    Send a POST request with a temporary client.
    
    Args:
        url: The URL to request.
        params: Query parameters to append to the URL.
        headers: HTTP headers to send with the request.
        cookies: Cookies to send with the request.
        content: Raw bytes to send in the request body.
        data: Form data to send in the request body.
        json: JSON-serializable object to send in the request body.
        files: Mapping of field names to file paths for multipart upload.
        auth: Tuple of (username, password) for basic authentication.
        auth_bearer: Bearer token for authentication.
        timeout: Request timeout in seconds.
        impersonate: Browser to impersonate (e.g., "chrome_144").
        impersonate_os: OS to impersonate (e.g., "windows", "macos", "linux").
        verify: Whether to verify SSL certificates.
        ca_cert_file: Path to CA certificate file.
        stream: If True, returns a StreamResponse for streaming.
    
    Returns:
        Response or StreamResponse object.
    """
    ...


def put(
    url: str,
    params: Optional[Mapping[str, str]] = None,
    headers: Optional[Mapping[str, str]] = None,
    cookies: Optional[Mapping[str, str]] = None,
    content: Optional[bytes] = None,
    data: Optional[Any] = None,
    json: Optional[Any] = None,
    files: Optional[Mapping[str, str]] = None,
    auth: Optional[Tuple[str, Optional[str]]] = None,
    auth_bearer: Optional[str] = None,
    timeout: Optional[float] = None,
    impersonate: Optional[str] = None,
    impersonate_os: Optional[str] = None,
    verify: bool = True,
    ca_cert_file: Optional[str] = None,
    stream: bool = False,
) -> Union[Response, StreamResponse]:
    """
    Send a PUT request with a temporary client.
    
    Args:
        url: The URL to request.
        params: Query parameters to append to the URL.
        headers: HTTP headers to send with the request.
        cookies: Cookies to send with the request.
        content: Raw bytes to send in the request body.
        data: Form data to send in the request body.
        json: JSON-serializable object to send in the request body.
        files: Mapping of field names to file paths for multipart upload.
        auth: Tuple of (username, password) for basic authentication.
        auth_bearer: Bearer token for authentication.
        timeout: Request timeout in seconds.
        impersonate: Browser to impersonate (e.g., "chrome_144").
        impersonate_os: OS to impersonate (e.g., "windows", "macos", "linux").
        verify: Whether to verify SSL certificates.
        ca_cert_file: Path to CA certificate file.
        stream: If True, returns a StreamResponse for streaming.
    
    Returns:
        Response or StreamResponse object.
    """
    ...


def patch(
    url: str,
    params: Optional[Mapping[str, str]] = None,
    headers: Optional[Mapping[str, str]] = None,
    cookies: Optional[Mapping[str, str]] = None,
    content: Optional[bytes] = None,
    data: Optional[Any] = None,
    json: Optional[Any] = None,
    files: Optional[Mapping[str, str]] = None,
    auth: Optional[Tuple[str, Optional[str]]] = None,
    auth_bearer: Optional[str] = None,
    timeout: Optional[float] = None,
    impersonate: Optional[str] = None,
    impersonate_os: Optional[str] = None,
    verify: bool = True,
    ca_cert_file: Optional[str] = None,
    stream: bool = False,
) -> Union[Response, StreamResponse]:
    """
    Send a PATCH request with a temporary client.
    
    Args:
        url: The URL to request.
        params: Query parameters to append to the URL.
        headers: HTTP headers to send with the request.
        cookies: Cookies to send with the request.
        content: Raw bytes to send in the request body.
        data: Form data to send in the request body.
        json: JSON-serializable object to send in the request body.
        files: Mapping of field names to file paths for multipart upload.
        auth: Tuple of (username, password) for basic authentication.
        auth_bearer: Bearer token for authentication.
        timeout: Request timeout in seconds.
        impersonate: Browser to impersonate (e.g., "chrome_144").
        impersonate_os: OS to impersonate (e.g., "windows", "macos", "linux").
        verify: Whether to verify SSL certificates.
        ca_cert_file: Path to CA certificate file.
        stream: If True, returns a StreamResponse for streaming.
    
    Returns:
        Response or StreamResponse object.
    """
    ...


def request(
    method: str,
    url: str,
    params: Optional[Mapping[str, str]] = None,
    headers: Optional[Mapping[str, str]] = None,
    cookies: Optional[Mapping[str, str]] = None,
    content: Optional[bytes] = None,
    data: Optional[Any] = None,
    json: Optional[Any] = None,
    files: Optional[Mapping[str, str]] = None,
    auth: Optional[Tuple[str, Optional[str]]] = None,
    auth_bearer: Optional[str] = None,
    timeout: Optional[float] = None,
    impersonate: Optional[str] = None,
    impersonate_os: Optional[str] = None,
    verify: bool = True,
    ca_cert_file: Optional[str] = None,
    stream: bool = False,
) -> Union[Response, StreamResponse]:
    """
    Send a request with a custom HTTP method using a temporary client.
    
    Args:
        method: The HTTP method to use (e.g., "GET", "POST", "CUSTOM").
        url: The URL to request.
        params: Query parameters to append to the URL.
        headers: HTTP headers to send with the request.
        cookies: Cookies to send with the request.
        content: Raw bytes to send in the request body.
        data: Form data to send in the request body.
        json: JSON-serializable object to send in the request body.
        files: Mapping of field names to file paths for multipart upload.
        auth: Tuple of (username, password) for basic authentication.
        auth_bearer: Bearer token for authentication.
        timeout: Request timeout in seconds.
        impersonate: Browser to impersonate (e.g., "chrome_144").
        impersonate_os: OS to impersonate (e.g., "windows", "macos", "linux").
        verify: Whether to verify SSL certificates.
        ca_cert_file: Path to CA certificate file.
        stream: If True, returns a StreamResponse for streaming.
    
    Returns:
        Response or StreamResponse object.
    """
    ...
