from __future__ import annotations

from contextvars import ContextVar
from dataclasses import dataclass, field
from typing import Callable

from .backend_client import BackendRequestContext
from .session_store import BackendSession, SessionProfile


CLOUD_PROFILE_NAME = "__cloud_mcp__"


@dataclass(slots=True)
class CloudMcpContext:
    credential_hash: str
    credential: str
    token: str
    uid: int
    ws_id: int
    base_url: str
    qf_version: str | None = None
    qf_version_source: str | None = None
    credential_id: int | None = None
    email: str | None = None
    nick_name: str | None = None
    ws_name: str | None = None
    refresh_context: Callable[[], "CloudMcpContext"] | None = field(default=None, repr=False, compare=False)

    def as_tool_context(self, profile: str) -> tuple[SessionProfile, BackendSession, BackendRequestContext]:
        session_profile = SessionProfile(
            profile=profile or CLOUD_PROFILE_NAME,
            base_url=self.base_url,
            qf_version=self.qf_version,
            qf_version_source=self.qf_version_source,
            token=self.token,
            login_token=None,
            credential=self.credential,
            uid=self.uid,
            email=self.email,
            nick_name=self.nick_name,
            selected_ws_id=self.ws_id,
            selected_ws_name=self.ws_name,
            persisted=False,
            created_at="cloud-request",
            updated_at="cloud-request",
        )
        backend_session = BackendSession(
            token=self.token,
            login_token=None,
            credential=self.credential,
            profile=session_profile.profile,
            base_url=self.base_url,
            qf_version=self.qf_version,
            qf_version_source=self.qf_version_source,
        )
        request_context = BackendRequestContext(
            base_url=self.base_url,
            token=self.token,
            ws_id=self.ws_id,
            qf_version=self.qf_version,
            qf_version_source=self.qf_version_source,
        )
        return session_profile, backend_session, request_context


current_cloud_context: ContextVar[CloudMcpContext | None] = ContextVar(
    "qingflow_mcp_current_cloud_context",
    default=None,
)
