"""MCP Draft Tools — Improvement Loop draft 생성 (4개).

Draft 생성은 mutation이므로 approval_required=True.
모든 draft는 DraftStore에 저장되고 governance audit을 기록합니다.
"""

import json
import logging

from fastmcp import FastMCP

from sentinel.schema import AuditEvent, ActionType, Surface

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


def _audit_draft(action: str, target_refs: list[str] | None = None):
    from sentinel.services.governance import governance

    governance.record_action(AuditEvent(
        action=action,
        action_type=ActionType.DRAFT,
        actor="mcp_client",
        surface=Surface.MCP,
        target_refs=target_refs or [],
        is_mutation=True,
    ))


def register_draft_tools(mcp: FastMCP):
    """Draft 생성 MCP tool 4개를 등록합니다."""

    @mcp.tool()
    def create_dataset_draft_from_traces(trace_ids: list[str]) -> str:
        """trace의 input/output을 기반으로 dataset draft를 생성합니다.

        생성된 draft는 DraftStore에 저장되며, Web UI에서 승인/거절할 수 있습니다.

        Args:
            trace_ids: dataset item으로 변환할 trace ID 목록

        Returns:
            JSON 형식의 생성된 draft (id, items 포함)
        """
        from sentinel.services.registry import ServiceRegistry
        from sentinel.services.draft_store import draft_store

        svc = ServiceRegistry.get().draft_service
        draft = svc.create_dataset_draft(trace_ids)
        draft_store.save(draft)

        _audit_draft("mcp:create_dataset_draft", trace_ids)
        return json.dumps(draft, ensure_ascii=False, indent=2, default=str)

    @mcp.tool()
    def create_eval_draft_from_cluster(trace_ids: list[str]) -> str:
        """trace 클러스터의 failure 패턴을 분석하여 evaluator criterion draft를 생성합니다.

        먼저 클러스터를 요약한 뒤, 그 결과로 evaluator 기준을 생성합니다.

        Args:
            trace_ids: 분석할 trace ID 목록

        Returns:
            JSON 형식의 evaluator draft (criteria, examples 포함)
        """
        from sentinel.services.registry import ServiceRegistry
        from sentinel.services.draft_store import draft_store

        reg = ServiceRegistry.get()
        cluster = reg.trace_analysis.summarize_cluster(trace_ids)
        draft = reg.draft_service.create_eval_draft(cluster)
        draft_store.save(draft)

        _audit_draft("mcp:create_eval_draft", trace_ids)
        return json.dumps(draft, ensure_ascii=False, indent=2, default=str)

    @mcp.tool()
    def create_prompt_change_draft(
        prompt_name: str,
        evidence: list[str] | None = None,
    ) -> str:
        """현재 프롬프트와 증거를 기반으로 프롬프트 개선 draft를 생성합니다.

        LLM이 현재 프롬프트를 분석하고 개선안을 제안합니다.

        Args:
            prompt_name: 개선할 프롬프트 이름
            evidence: 개선 근거가 되는 참조 목록 (trace ID, 점수 등)

        Returns:
            JSON 형식의 prompt change draft (before/after, rationale 포함)
        """
        from sentinel.services.registry import ServiceRegistry
        from sentinel.services.draft_store import draft_store

        svc = ServiceRegistry.get().draft_service
        draft = svc.create_prompt_change_draft(prompt_name, evidence=evidence)
        draft_store.save(draft)

        _audit_draft("mcp:create_prompt_change_draft", [prompt_name])
        return json.dumps(draft, ensure_ascii=False, indent=2, default=str)

    @mcp.tool()
    def create_report_followup_draft(
        filename: str,
        action_items: list[str] | None = None,
    ) -> str:
        """보고서의 권장 조치를 기반으로 후속 작업 draft를 생성합니다.

        Args:
            filename: 보고서 파일명
            action_items: 후속 조치 항목 (없으면 보고서에서 자동 추출)

        Returns:
            JSON 형식의 후속 작업 draft
        """
        import os
        import uuid
        from datetime import datetime, timezone
        from sentinel.services.draft_store import draft_store
        from sentinel.settings import REPORTS_DIR

        # 보고서에서 action items 추출
        if not action_items:
            path = os.path.join(REPORTS_DIR, filename)
            if os.path.exists(path):
                content = open(path, encoding="utf-8").read()
                action_items = []
                in_actions = False
                for line in content.split("\n"):
                    if "권장 조치" in line or "Recommended" in line.lower():
                        in_actions = True
                        continue
                    if in_actions:
                        if line.startswith("## ") or line.startswith("---"):
                            break
                        stripped = line.strip()
                        if stripped.startswith("- ") or stripped.startswith("* "):
                            action_items.append(stripped[2:].strip())

        if not action_items:
            return json.dumps({
                "error": "추출할 조치 항목이 없습니다.",
                "filename": filename,
            })

        draft = {
            "id": uuid.uuid4().hex[:12],
            "type": "report_followup",
            "source_report": filename,
            "action_items": action_items,
            "review_status": "pending",
            "created_at": datetime.now(timezone.utc).isoformat(),
        }
        draft_store.save(draft)

        _audit_draft("mcp:create_report_followup_draft", [filename])
        return json.dumps(draft, ensure_ascii=False, indent=2, default=str)
