"""MCP Governance Tools — 승인 요청/상태 조회 (2개).

approval 관리를 MCP surface에서도 가능하게 합니다.
"""

import json
import logging

from fastmcp import FastMCP

from sentinel.schema import AuditEvent, ActionType, Surface

logger = logging.getLogger("sentinel.mcp.governance")


def register_governance_tools(mcp: FastMCP):
    """Governance MCP tool 2개를 등록합니다."""

    @mcp.tool()
    def request_approval(
        request_type: str,
        action_summary: str,
        params: dict | None = None,
        evidence_refs: list[str] | None = None,
    ) -> str:
        """승인 요청을 생성합니다.

        생성된 승인 요청은 Web UI /approvals에서 확인하고 승인/거절할 수 있습니다.

        Args:
            request_type: 요청 유형 (예: "prompt_change", "dataset_publish")
            action_summary: 요청 요약 설명
            params: 추가 파라미터
            evidence_refs: 증거 참조 목록

        Returns:
            JSON 형식의 승인 요청 결과 (approval_id 포함)
        """
        from sentinel.schema import ApprovalRequest
        from sentinel.services.governance import governance

        req = ApprovalRequest(
            request_type=request_type,
            action_summary=action_summary,
            params=params or {},
            evidence_refs=evidence_refs or [],
            actor="mcp_client",
            surface=Surface.MCP,
        )

        approval_id = governance.require_approval(req)

        return json.dumps({
            "approval_id": approval_id,
            "status": "pending",
            "request_type": request_type,
            "action_summary": action_summary,
            "message": "승인 요청이 생성되었습니다. Web UI에서 확인하세요.",
        }, ensure_ascii=False, indent=2)

    @mcp.tool()
    def get_approval_status(approval_id: str) -> str:
        """승인 요청의 현재 상태를 조회합니다.

        Args:
            approval_id: 조회할 승인 ID

        Returns:
            JSON 형식의 승인 상태 (status, approved_by 등)
        """
        from sentinel.approval import approval_manager
        from sentinel.services.governance import governance

        record = approval_manager.get(approval_id)

        governance.record_action(AuditEvent(
            action=f"mcp:get_approval_status:{approval_id}",
            action_type=ActionType.READ,
            actor="mcp_client",
            surface=Surface.MCP,
            target_refs=[approval_id],
            is_mutation=False,
        ))

        if not record:
            return json.dumps({
                "error": f"승인 요청을 찾을 수 없습니다: {approval_id}"
            })

        return json.dumps(record, ensure_ascii=False, indent=2, default=str)
