# AUTO-GENERATED by mizan — do not edit

from __future__ import annotations

from collections.abc import Callable
from typing import Any

# Built from frontends/mizan-rust with `maturin develop --features pyo3`.
from mizan_rust import PyMizanClient, PyContextSubscription

from .types import *  # noqa: F401, F403
from .types import BaseModel  # re-import for the synthesized ContextData classes


class MizanClient:
    """Typed Python facade over the PyO3 mizan-rust kernel."""

    def __init__(self, base_url: str, *, session: bool = False,
                 csrf_cookie_name: str = "csrftoken",
                 csrf_header_name: str = "X-CSRFToken") -> None:
        self._inner = PyMizanClient(
            base_url,
            session=session,
            csrf_cookie_name=csrf_cookie_name,
            csrf_header_name=csrf_header_name,
        )

    def fetch_user_context(self, user_id: int) -> "UserContextData":
        raw = self._inner.fetch_context("user", {"user_id": user_id})
        return UserContextData(**raw)
    def subscribe_user_context(self, user_id: int,
                                       callback: Callable[[dict[str, Any]], None]) -> PyContextSubscription:
        return self._inner.subscribe_context("user", {"user_id": user_id}, callback)

    def call_echo(self, args: EchoInput) -> EchoOutput:
        raw = self._inner.call("echo", args.model_dump())
        return EchoOutput(**raw)

    def call_find_user(self, args: FindUserInput) -> FindUserOutput | None:
        raw = self._inner.call("find_user", args.model_dump())
        return FindUserOutput(**raw) if raw is not None else None

    def call_rename_user(self, args: RenameUserInput) -> RenameUserOutput:
        raw = self._inner.call("rename_user", args.model_dump())
        return RenameUserOutput(**raw)

    def call_update_profile(self, args: UpdateProfileInput) -> UpdateProfileOutput:
        raw = self._inner.call("update_profile", args.model_dump())
        return UpdateProfileOutput(**raw)

    def call_whoami(self) -> WhoamiOutput:
        raw = self._inner.call("whoami", {})
        return WhoamiOutput(**raw)

    def invalidate(self, context: str) -> None:
        self._inner.invalidate(context)

    def invalidate_scoped(self, context: str, params: dict[str, Any]) -> None:
        self._inner.invalidate_scoped(context, params)


# ── Context data shapes (per-context bundle) ──────────────────────────────

class UserContextData(BaseModel):
    """Bundled return of fetch_user_context."""
    user_orders: UserOrdersOutput
    user_profile: UserProfileOutput
