from __future__ import annotations

from dataclasses import dataclass

from ..backend_client import BackendClient
from ..session_store import SessionStore
from ..tools.ai_builder_tools import AiBuilderTools
from ..tools.app_tools import AppTools
from ..tools.auth_tools import AuthTools
from ..tools.code_block_tools import CodeBlockTools
from ..tools.export_tools import ExportTools
from ..tools.feedback_tools import FeedbackTools
from ..tools.file_tools import FileTools
from ..tools.import_tools import ImportTools
from ..tools.record_tools import RecordTools
from ..tools.resource_read_tools import ResourceReadTools
from ..tools.task_context_tools import TaskContextTools
from ..tools.workspace_tools import WorkspaceTools


@dataclass(slots=True)
class CliContext:
    sessions: SessionStore
    backend: BackendClient
    auth: AuthTools
    workspace: WorkspaceTools
    app: AppTools
    resource: ResourceReadTools
    record: RecordTools
    code_block: CodeBlockTools
    imports: ImportTools
    exports: ExportTools
    task: TaskContextTools
    files: FileTools
    builder_feedback: FeedbackTools
    builder: AiBuilderTools

    def close(self) -> None:
        self.backend.close()


def build_cli_context() -> CliContext:
    sessions = SessionStore()
    backend = BackendClient()
    return CliContext(
        sessions=sessions,
        backend=backend,
        auth=AuthTools(sessions, backend),
        workspace=WorkspaceTools(sessions, backend),
        app=AppTools(sessions, backend),
        resource=ResourceReadTools(sessions, backend),
        record=RecordTools(sessions, backend),
        code_block=CodeBlockTools(sessions, backend),
        imports=ImportTools(sessions, backend),
        exports=ExportTools(sessions, backend),
        task=TaskContextTools(sessions, backend),
        files=FileTools(sessions, backend),
        builder_feedback=FeedbackTools(backend, mcp_side="App Builder MCP"),
        builder=AiBuilderTools(sessions, backend),
    )
