import uuid
from contextvars import ContextVar
from dataclasses import dataclass


@dataclass(frozen=True)
class IntegrationContext:
    correlation_id: str
    causation_id: str | None = None
    request_id: str | None = None
    actor_id: int | None = None
    origin: str = "timetabler"


_context: ContextVar[IntegrationContext | None] = ContextVar(
    "timetabler_integration_context",
    default=None,
)


def current_context() -> IntegrationContext:
    context = _context.get()
    if context is not None:
        return context
    return IntegrationContext(correlation_id=str(uuid.uuid4()))


def set_context(context: IntegrationContext):
    return _context.set(context)


def reset_context(token):
    _context.reset(token)
