"""MCP tools — aggregated legal arguments (claim de-duplication)."""

from __future__ import annotations

import json
from uuid import UUID

from legal_mcp.services import argument_aggregator, db


async def aggregate_claims_to_arguments(
    case_number: str,
    force: bool = False,
) -> str:
    """כינוס פרופוזיציות גולמיות לטיעונים משפטיים מובחנים.

    Args:
        case_number: מספר תיק הערר.
        force: True = למחוק טיעונים קיימים ולחשב מחדש.
    """
    case = await db.get_case_by_number(case_number)
    if not case:
        return json.dumps(
            {"status": "error", "message": f"תיק {case_number} לא נמצא."},
            ensure_ascii=False, indent=2,
        )

    case_id = UUID(case["id"])
    result = await argument_aggregator.aggregate_claims_to_arguments(
        case_id, force=force,
    )
    result["case_number"] = case_number
    return json.dumps(result, ensure_ascii=False, indent=2, default=str)


async def get_legal_arguments(
    case_number: str,
    party: str = "",
) -> str:
    """שליפת טיעונים משפטיים מאוגדים לתיק.

    Args:
        case_number: מספר תיק הערר.
        party: סינון לפי צד (appellant/respondent/committee/permit_applicant).
               ריק = כל הצדדים.
    """
    case = await db.get_case_by_number(case_number)
    if not case:
        return json.dumps(
            {"status": "error", "message": f"תיק {case_number} לא נמצא."},
            ensure_ascii=False, indent=2,
        )

    case_id = UUID(case["id"])
    args = await argument_aggregator.get_legal_arguments(case_id, party=party)

    if not args:
        return json.dumps({
            "status": "empty",
            "case_number": case_number,
            "message": "לא נמצאו טיעונים מאוגדים. הרץ aggregate_claims_to_arguments תחילה.",
            "arguments": [],
        }, ensure_ascii=False, indent=2)

    # Group by party for nicer display.
    party_he = {
        "appellant": "עוררים",
        "respondent": "משיבים",
        "committee": "ועדה מקומית",
        "permit_applicant": "מבקשי היתר",
        "unknown": "צד לא מזוהה",
    }
    by_party: dict[str, list[dict]] = {}
    for a in args:
        label = party_he.get(a["party"], a["party"])
        by_party.setdefault(label, []).append(a)

    return json.dumps({
        "status": "ok",
        "case_number": case_number,
        "total": len(args),
        "by_party": by_party,
    }, ensure_ascii=False, indent=2, default=str)
