from __future__ import annotations

from mcp.server.fastmcp import FastMCP

from .backend_client import BackendClient
from .session_store import SessionStore
from .tools.app_tools import AppTools
from .tools.auth_tools import AuthTools
from .tools.file_tools import FileTools
from .tools.package_tools import PackageTools
from .tools.navigation_tools import NavigationTools
from .tools.approval_tools import ApprovalTools
from .tools.directory_tools import DirectoryTools
from .tools.portal_tools import PortalTools
from .tools.qingbi_report_tools import QingbiReportTools
from .tools.record_tools import RecordTools
from .tools.role_tools import RoleTools
from .tools.solution_tools import SolutionTools
from .tools.task_tools import TaskTools
from .tools.view_tools import ViewTools
from .tools.workflow_tools import WorkflowTools
from .tools.workspace_tools import WorkspaceTools


def build_server() -> FastMCP:
    server = FastMCP(
        "Qingflow MCP",
        instructions=(
            "Use auth_login first, then workspace_list and workspace_select. "
            "All resource tools operate with the logged-in user's Qingflow permissions.\n\n"
            "Task Center (待办/已办) handling:\n"
            "- Use task_statistics to get counts of pending tasks (todo_count), timeouts, urged, etc.\n"
            "- Use task_list to query tasks. Type values: 1=todo (待办), 2=initiated (我发起的), 3=cc (抄送), 5=done (已办).\n"
            "- Use task_list_grouped to get tasks grouped by form/worksheet.\n"
            "- Use task_mark_read to mark a specific task as read.\n"
            "- Use task_urge to send an urgent reminder for a pending task.\n"
            "- Process status values: 1=all, 2=processing, 3=passed, 4=refused, 5=need_supply, 6=urged, 7=timeout, 8=pre_timeout, 9=unread.\n"
            "- After identifying the exact task node and record, use record_approve, record_reject, record_rollback, record_transfer, record_reassign, or record_countersign as needed."
        ),
    )
    sessions = SessionStore()
    backend = BackendClient()
    AuthTools(sessions, backend).register(server)
    WorkspaceTools(sessions, backend).register(server)
    FileTools(sessions, backend).register(server)
    RecordTools(sessions, backend).register(server)
    RoleTools(sessions, backend).register(server)
    AppTools(sessions, backend).register(server)
    QingbiReportTools(sessions, backend).register(server)
    PackageTools(sessions, backend).register(server)
    NavigationTools(sessions, backend).register(server)
    ApprovalTools(sessions, backend).register(server)
    PortalTools(sessions, backend).register(server)
    DirectoryTools(sessions, backend).register(server)
    WorkflowTools(sessions, backend).register(server)
    ViewTools(sessions, backend).register(server)
    SolutionTools(sessions, backend).register(server)
    TaskTools(sessions, backend).register(server)
    return server


mcp = build_server()


def main() -> None:
    mcp.run()


if __name__ == "__main__":
    main()
