from contextlib import contextmanager
from contextvars import ContextVar, Token
from typing import Generator, Literal, overload

from . import constants as constants
from .errors import ERROR_CTX_USER_ID_NOT_SET as ERROR_CTX_USER_ID_NOT_SET

ctx_user_id: ContextVar[str | None]

@overload
def get_user_id(strict: Literal[True]) -> str: ...
@overload
def get_user_id(strict: Literal[False] | None = None) -> str | None: ...
@contextmanager
def set_user_context(user_id: str | None) -> Generator[None, None, None]:
    """Context manager to temporarily set user ID.

    Usage:
    ```python
    with set_user_context('user_123'):
        model.soft_delete()  # Automatically tracked to user_123
    ```
    """

def set_user_id(user_id: str | None) -> Token[str | None]:
    """Set the context user ID."""
