"""Lessons learned from comparing AI drafts to Dafna Tamir's final decisions.

Source: docs/legal-decision-lessons.md
Based on analysis of: Hecht 1180-1181 (rejection) and Beit HaKerem 1126/25+1141/25 (partial acceptance).
"""

from __future__ import annotations

# ── Valid outcome values ────────────────────────────────────────────
# GAP-51 / INV-TOOL2: canonical = 3 real outcomes. `betterment_levy` is a
# practice_area (not an outcome) — its writing-guidance lives in
# PRACTICE_AREA_OVERRIDES below and is applied on top of the chosen outcome.

VALID_OUTCOMES = ("rejection", "partial_acceptance", "full_acceptance")

# Hebrew display labels — SSoT (אנגלית ב-DB, עברית ב-UI). Replaces the inline
# maps that lived in block_writer.py and workflow.py.
OUTCOME_LABELS_HE = {
    "rejection": "דחייה",
    "partial_acceptance": "קבלה חלקית",
    "full_acceptance": "קבלה מלאה",
}

# Backward-compat: legacy set_outcome vocabulary → canonical. Used by callers
# that may still pass the old values (rejected/accepted/partial).
LEGACY_OUTCOME_MAP = {
    "rejected": "rejection",
    "accepted": "full_acceptance",
    "partial": "partial_acceptance",
}


def canonical_outcome(outcome: str) -> str:
    """Normalize any outcome string to the canonical vocabulary (GAP-51)."""
    return LEGACY_OUTCOME_MAP.get(outcome, outcome)

# ── Golden Ratios (section % of total) ─────────────────────────────

GOLDEN_RATIOS: dict[str, dict[str, tuple[int, int]]] = {
    "rejection":          {"background": (15, 25), "claims": (30, 40), "discussion": (37, 50), "summary": (2, 9)},
    "full_acceptance":    {"background": (30, 40), "claims": (20, 30), "discussion": (35, 45), "summary": (3, 5)},
    "partial_acceptance": {"background": (25, 35), "claims": (25, 30), "discussion": (40, 47), "summary": (2, 3)},
}

# ── Anti-patterns (what Dafna avoids) — detectable signals for style-distance (T7) ──
# Derived from daphna-voice-fingerprint.md §3 (corrected 2026-06-06). NOTE: a leading
# "N." per paragraph is NOT an anti-pattern — it is the REQUIRED signal the DOCX
# exporter converts to real Word auto-numbering (docx_exporter._ensure_decision_numbering).
# The real anti-patterns are mid-paragraph mini-lists, markdown, and bullets.
ANTI_PATTERNS: list[dict] = [
    {"name": "inline_numbered_fragments",
     "regex": r"\([0-9]\)[^\n]{0,200}\([0-9]\)",
     "note": "פיצול טיעון לרשימת-מיני (1)...(2) בתוך פסקת-אנליזה"},
    {"name": "markdown_headers",
     "regex": r"(?m)^#{1,6}\s",
     "note": "כותרות markdown — אינן בהחלטה הסופית"},
    {"name": "bullet_lists",
     "regex": r"(?m)^\s*[-*•]\s",
     "note": "רשימות תבליטים באנליזה — דפנה כותבת נרטיב רציף"},
]


def anti_pattern_directive() -> str:
    """The closing style directive, rendered from ANTI_PATTERNS (the same list
    style_distance scores against — one source, two renderings, not two rules).

    WHY THIS EXISTS SEPARATELY FROM the style-context rendering: the rule was
    already reaching the writer, buried ~47K chars deep inside style_context,
    and drafts kept emitting the very patterns it forbids. A measured A/B over
    the signed finals (9 cases, 60 generations, 2026-07-28) showed that the SAME
    rule restated at the END of the assembled prompt cuts anti-pattern hits by
    72–93% on both blocks and both models:

        block-vav  opus-4-8 1.75 → 0.12 | opus-5 2.25 → 0.62
        block-zayin opus-4-8 4.57 → 0.43 | opus-5 4.43 → 0.43

    So this is a POSITION fix, not a new instruction. Keep it last in the prompt.
    """
    lines = ["## כלל-סגנון מחייב (גובר על כל דוגמה בהקשר שלמעלה)",
             "כתוב נרטיב משפטי רציף בלבד — פסקאות שלמות. אסור:"]
    lines += [f"- {ap['note']}" for ap in ANTI_PATTERNS]
    return "\n".join(lines)

# ── Paragraph length guidance (word counts) ────────────────────────

PARAGRAPH_LENGTHS = {
    "claims": (40, 60),
    "discussion_regular": (40, 80),
    "discussion_with_citation": (200, 600),
    "discussion_average": (80, 120),
}

# ── Transition phrases ─────────────────────────────────────────────

TRANSITION_PHRASES = [
    # From Hecht (rejection)
    {"phrase": "ועל מנת לא לצאת בחסר", "context": "פתיחת obiter dicta", "outcome": None},
    {"phrase": "נציין כי טענות אלו נטענו בלשון רפה", "context": "הכרה בטענות חלשות", "outcome": None},
    {"phrase": "עינינו הרואות", "context": "סיכום אחרי ציטוט ארוך", "outcome": None},
    {"phrase": "נוסיף.", "context": "מעבר חד (מילה אחת)", "outcome": None},
    {"phrase": "אם כך, לעת הזו", "context": "מסקנה מציטוטים", "outcome": None},
    {"phrase": "למיטב הבנתנו", "context": "עמדה זהירה", "outcome": None},
    {"phrase": "נשלים ונציין", "context": "נקודה אחרונה לפני סיכום", "outcome": None},
    # From Beit HaKerem (partial acceptance)
    {"phrase": "הדברים משליכים על שיקול הדעת ב...", "context": "קישור ממצא למסקנה", "outcome": "partial_acceptance"},
    {"phrase": "רוצה לומר כי", "context": "הסבר חלופי", "outcome": None},
    {"phrase": "נוצר מצב בו", "context": "הצגת בעיה", "outcome": None},
    {"phrase": "לכך נוסיף כי", "context": "הוספת נדבך", "outcome": None},
    {"phrase": "יש אולי להצר על כך ש...", "context": "ביקורת עדינה", "outcome": None},
    {"phrase": "עם ההבנה לטענה זו של העוררים, אין בידנו לקבלה", "context": "acknowledge-reject מרוכך", "outcome": None},
]

# ── Opening strategies by outcome ──────────────────────────────────

OPENING_STRATEGIES = {
    "rejection": {
        "style": "broad_contextual",
        "paragraphs": (5, 8),
        "description": "פתיחה רחבה — הקשר תכנוני כללי, רקע לפני צלילה לטענות",
    },
    "full_acceptance": {
        "style": "direct_conclusion",
        "paragraphs": (1, 2),
        "description": "פתיחה ישירה — ישר למסקנה, תמציתית",
    },
    "partial_acceptance": {
        "style": "tension_mapping",
        "paragraphs": (3, 6),
        "description": (
            "מיפוי מתחים — 1-2 פסקאות על ערך התכנון, "
            "אחר כך 'בערר דנן עולות שאלות כיצד והאם...' "
            "עם רשימת 4-6 נקודות מתח בבולטים, "
            "ואז 'כל הנקודות לעיל עומדות לפנינו...' → מעבר לניתוח"
        ),
    },
}

# ── Summary strategies by outcome ──────────────────────────────────

SUMMARY_STRATEGIES = {
    "rejection": {
        "heading": "סיכום",
        "format": "numbered_hebrew_with_warm_closing",
        "description": "אותיות עבריות (א-ו) עם פירוט נימוקים + פסקת סיום חמה",
    },
    "full_acceptance": {
        "heading": "סוף דבר",
        "format": "prose_paragraphs",
        "description": "פרוזה (3-5 פסקאות), ללא פסקה חמה",
    },
    "partial_acceptance": {
        "heading": "סוף דבר",
        "format": "ultra_minimal_operative",
        "description": (
            "אולטרה-מינימלי: 2-3 הוראות אופרטיביות בלבד. "
            "אפס חזרה על נימוקים. אפס הוצאות. אפס סיום חם. "
            "כל ההנמקה כבר בדיון — הסיכום = רק מה מתקבל, מה נדחה, ותנאים"
        ),
    },
}

# ── Discussion structure rules ─────────────────────────────────────

DISCUSSION_RULES: dict[str, list[str]] = {
    "universal": [
        "פרק הדיון = מאסה רציפה. אין כותרות משנה (H2/H3). מעברים רק עם ביטויי מעבר טקסטואליים.",
        "חריג יחיד לכותרות משנה: נושאים נפרדים לחלוטין (למשל: הקלה בגובה + התייחסות לטענות נוספות).",
        "טווח אורך סעיפים: 20 עד 600+ מילים. סעיף עם ציטוט מקיף = בלוק אחד שלם, לא שבירה לסעיפים קצרים.",
    ],
    "rejection": [
        "מבנה עיגולים קונצנטריים: שכבות הגנה — סף (ס' 152) → מריט → obiter dicta.",
        "שאלת הסף (ס' 152) = כלי אסטרטגי, לא חובה. משתמשים בה כשהיא חזקה.",
    ],
    "partial_acceptance": [
        "מבנה: מיפוי מתחים → ניתוח נושא-נושא → הוראות אופרטיביות.",
        "שאלת הסף (ס' 152) — בדרך כלל מדלגים. כשיש שאלות מהותיות חזקות (חניה, שימור, קווי בניין), דפנה מעדיפה דיון בגוף העניין.",
        "דפוס 'בית בודד': כשתמ\"א 38 חלה על בית בודד, אינטרס החיזוק מוחלש → שיקול דעת זהיר יותר.",
        "דפוס 'תכנית אב כמגן': כשקיימת תכנית אב → לצטט אותה → ההיתר 'משתלב עם ראיה כללית'.",
    ],
    "full_acceptance": [
        "מבנה ישיר: נקודות עיקריות → ניתוח → מסקנה.",
    ],
}

# ── Citation technique ─────────────────────────────────────────────

CITATION_GUIDANCE = (
    "העדפה לציטוט דרך 'החלטה מרכזת' — החלטה אחת שכבר ריכזה את הפסיקה הרלוונטית. "
    "דפוס: 'נפנה לניתוח המקיף שערכה ועדת הערר במסגרת ערר [שם]...' → בלוק ציטוט 200-500 מילים → 'אם כך, לעת הזו...'. "
    "גמישות: כשיש שאלות משפטיות מרובות או חדשניות, כל נושא עשוי לדרוש תקדים נפרד. "
    "בנושאי חניה/תשתיות — צלילה לעומק: ציטוט ישיר של הוראות תכנית (400+ מילים עם ניתוח שזור)."
)

# ── Decision templates by outcome ──────────────────────────────────

_HEADER = """# החלטה

## בפני: דפנה תמיר, יו"ר ועדת הערר מחוז ירושלים

**ערר מספר:** {case_number}
**נושא:** {subject}
**העוררים:** {appellants}
**המשיבים:** {respondents}
**כתובת הנכס:** {property_address}

---
"""

DECISION_TEMPLATES: dict[str, str] = {
    "rejection": _HEADER + """## א. רקע עובדתי
<!-- {ratios_background} -->

[תיאור הרקע העובדתי של הערר]

## ב. טענות העוררים
<!-- {ratios_claims} -->

[סיכום טענות העוררים]

## ג. טענות המשיבים

[סיכום טענות המשיבים]

## ד. דיון
<!-- אסה רציפה, ללא כותרות משנה. מבנה עיגולים קונצנטריים: סף → מריט → obiter -->
<!-- פתיחה רחבה: 5-8 פסקאות הקשר תכנוני -->
<!-- {ratios_discussion} -->

[ניתוח משפטי — אסה רציפה]

## ה. סיכום
<!-- אותיות עבריות (א-ו) + פסקת סיום חמה -->
<!-- {ratios_summary} -->

[סיכום בפורמט רשימה ממוספרת + סיום חם]

---
ניתנה היום, {date}
דפנה תמיר, יו"ר ועדת הערר
""",

    "partial_acceptance": _HEADER + """## א. רקע עובדתי
<!-- {ratios_background} -->

[תיאור הרקע העובדתי של הערר]

## ב. טענות העוררים
<!-- {ratios_claims} -->

[סיכום טענות העוררים]

## ג. טענות המשיבים

[סיכום טענות המשיבים]

## ד. דיון
<!-- אסה רציפה, ללא כותרות משנה. מבנה: מיפוי מתחים → ניתוח נושא-נושא -->
<!-- פתיחת מיפוי מתחים: 1-2 פסקאות על ערך התכנון, רשימת מתחים, מעבר לניתוח -->
<!-- {ratios_discussion} -->

[ניתוח משפטי — אסה רציפה]

## ה. סוף דבר
<!-- אולטרה-מינימלי: 2-3 הוראות אופרטיביות בלבד. אפס נימוקים. אפס הוצאות. -->
<!-- {ratios_summary} -->

[הוראות אופרטיביות בלבד: מה מתקבל, מה נדחה, תנאים]

---
ניתנה היום, {date}
דפנה תמיר, יו"ר ועדת הערר
""",

    "full_acceptance": _HEADER + """## א. רקע עובדתי
<!-- {ratios_background} -->

[תיאור הרקע העובדתי של הערר]

## ב. טענות העוררים
<!-- {ratios_claims} -->

[סיכום טענות העוררים]

## ג. טענות המשיבים

[סיכום טענות המשיבים]

## ד. דיון
<!-- אסה רציפה, ללא כותרות משנה. מבנה ישיר -->
<!-- פתיחה ישירה: 1-2 פסקאות, ישר למסקנה -->
<!-- {ratios_discussion} -->

[ניתוח משפטי — אסה רציפה]

## ה. סוף דבר
<!-- פרוזה: 3-5 פסקאות, ללא פסקה חמה -->
<!-- {ratios_summary} -->

[סוף דבר בפרוזה]

---
ניתנה היום, {date}
דפנה תמיר, יו"ר ועדת הערר
""",
}


# ── Practice-area writing overrides (GAP-51) ───────────────────────
# `betterment_levy` is a practice_area, NOT an outcome. A betterment-levy case
# still has a real outcome (rejection / partial / full), but its writing style
# is distinct (dry, factual, no warm closing). These overrides are layered on
# top of the chosen outcome's guidance by the accessors below.

PRACTICE_AREA_OVERRIDES: dict[str, dict] = {
    "betterment_levy": {
        "golden_ratios": {"background": (6, 18), "claims": (13, 25), "discussion": (32, 48), "summary": (3, 4)},
        "opening_strategy": {
            "style": "direct_factual",
            "paragraphs": (1, 3),
            "description": (
                "פתיחה ישירה ועובדתית: 'בפנינו ערר על דרישת תשלום היטל השבחה מיום [תאריך] "
                "בסך של [סכום] ₪' → רקע קצר (נכס, תכנית משביחה, מימוש) → "
                "תמצית טענות הצדדים (עוררים + משיבה בנפרד). "
                "אין הקשר תכנוני רחב. הפתיחה = עובדות בלבד."
            ),
        },
        "summary_strategy": {
            "heading": "various",
            "format": "dry_operative",
            "description": (
                "סיום יבש ואופרטיבי. כותרת משתנה: 'סוף דבר' / 'לאור כל האמור לעיל' / ללא כותרת. "
                "תוכן: 'הערר נדחה/מתקבל' + הוצאות ('כל צד ישא בהוצאותיו' / חיוב בסכום). "
                "אם מתקבל: הוראות אופרטיביות (החזר, שומה מתוקנת, תנאים). "
                "חתימה: 'ניתנה פה אחד היום, [תאריך עברי], [תאריך לועזי].' "
                "לעיתים: 'התיק ייסגר.' / 'עומדת זכות ערר כדין.' "
                "אין פסקה חמה. אין חזרה על נימוקים."
            ),
        },
        "discussion_rules": [
            "פתיחת דיון: מסקנה מוקדמת ('לאחר שבחנו... מצאנו כי דין הערר להידחות/להתקבל').",
            "תקן ביקורת: ציון רף ההתערבות בשומה מכרעת (בר\"ם 3644/13 גלר) — אבחנה בין שמאי למשפטי.",
            "הצגת הלכה פסוקה: ציטוט ארוך מפס\"ד מרכזי → 'ברוח הדברים לעיל נבחן את טענות הצדדים'.",
            "טיפול שיטתי: כל טענה/סוגיה בנפרד → ניתוח → מסקנת ביניים.",
            "ביטויים: 'אין בידינו לקבל', 'לא מצאנו מקום להתערב', 'קביעה נכונה שאין מקום להתערב בה'.",
            "'על מנת לא לצאת בחסר' — לנקודות obiter dicta בסוף הדיון.",
        ],
        "decision_template": _HEADER + """## א. רקע עובדתי
<!-- {ratios_background} -->

[תיאור הרקע העובדתי של הערר]

## ב. טענות העוררים
<!-- {ratios_claims} -->

[סיכום טענות העוררים]

## ג. טענות המשיבים

[סיכום טענות המשיבים]

## ד. דיון
<!-- אסה רציפה, ללא כותרות משנה. מבנה ישיר עם מסקנה מוקדמת -->
<!-- {ratios_discussion} -->

[ניתוח משפטי — אסה רציפה]

## ה. סיכום
<!-- אותיות עבריות, סיום יבש -->
<!-- {ratios_summary} -->

[סיכום בפורמט רשימה ממוספרת, סיום יבש]

---
ניתנה היום, {date}
דפנה תמיר, יו"ר ועדת הערר
""",
    },
}


# ── Helper function ────────────────────────────────────────────────

def get_lessons_for_outcome(outcome: str, practice_area: str = "") -> dict:
    """Assemble all relevant lessons for an outcome, with practice_area overrides.

    GAP-51: ``betterment_levy`` is a practice_area — when given, its writing
    overrides (golden ratios, opening/summary strategy, discussion rules) are
    layered on top of the chosen outcome.
    """
    outcome = canonical_outcome(outcome)
    if outcome not in VALID_OUTCOMES:
        return {"error": f"outcome must be one of: {', '.join(VALID_OUTCOMES)}"}

    override = PRACTICE_AREA_OVERRIDES.get(practice_area, {})
    ratios = override.get("golden_ratios") or GOLDEN_RATIOS[outcome]
    opening = override.get("opening_strategy") or OPENING_STRATEGIES[outcome]
    summary = override.get("summary_strategy") or SUMMARY_STRATEGIES[outcome]
    rules = (
        DISCUSSION_RULES.get("universal", [])
        + (override.get("discussion_rules") or DISCUSSION_RULES.get(outcome, []))
    )

    # Filter transition phrases: universal + outcome-specific
    phrases = [
        p for p in TRANSITION_PHRASES
        if p["outcome"] is None or p["outcome"] == outcome
    ]

    return {
        "outcome": outcome,
        "practice_area": practice_area,
        "golden_ratios": {
            k: f"{v[0]}-{v[1]}%" for k, v in ratios.items()
        },
        "opening_strategy": opening,
        "summary_strategy": summary,
        "discussion_rules": rules,
        "citation_guidance": CITATION_GUIDANCE,
        "transition_phrases": [
            {"phrase": p["phrase"], "context": p["context"]}
            for p in phrases
        ],
        "paragraph_lengths": {
            k: f"{v[0]}-{v[1]} מילים" for k, v in PARAGRAPH_LENGTHS.items()
        },
    }


def format_ratios_comment(outcome: str, section: str, practice_area: str = "") -> str:
    """Format golden ratio as an HTML comment for templates (practice_area-aware)."""
    outcome = canonical_outcome(outcome)
    override = PRACTICE_AREA_OVERRIDES.get(practice_area, {})
    ratios = override.get("golden_ratios") or GOLDEN_RATIOS.get(outcome, {})
    if section in ratios:
        lo, hi = ratios[section]
        return f"יעד: {lo}-{hi}% מסך ההחלטה"
    return ""


# ── Content checklists by appeal subtype ──────────────────────────
# Based on systematic analysis of 24 decisions from Dafna's corpus.
# See: docs/corpus-analysis.md

CONTENT_CHECKLISTS: dict[str, str] = {
    "licensing_substantive": """## צ'קליסט תוכן — ערר רישוי מהותי (חובה)
הדיון חייב לכלול את הנושאים הרלוונטיים מהרשימה הבאה.
**אל תדלג על נושא שרלוונטי לתיק — בדוק כל סעיף.**

### א. הקשר תכנוני רחב (חובה בכל ערר מהותי)
- תכניות חלות — ציין את התכניות הרלוונטיות ברמה מקומית, מחוזית וארצית (לפי הצורך)
- ייעוד הקרקע — מה הייעוד בתכנית? מה השימושים המותרים?
- אופי הסביבה — מרקם בנוי, צפיפות, אופי שכונה/ישוב
- *דוגמה*: בערר פרומר — 12 סעיפים על MI/200, תמ"א 35, תמ"מ 30/1

### ב. ניתוח הוראות תכנית (כשיש שאלה של התאמה/סטייה)
- ציטוט ישיר מהוראות התכנית הרלוונטיות (200-600 מילים לכל ציטוט)
- פרשנות — מה תכלית ההוראה?
- יישום — האם הבקשה תואמת או סוטה?
- *דוגמה*: בערר לבנון — ניתוח חתכים של נספח בינוי מול הבקשה

### ג. חניה (כשרלוונטי — מופיע ב-8 מתוך 24 החלטות)
- הוראות תכנית + נספח תנועה (ציטוט ישיר)
- חישוב מקומות חניה נדרשים vs. מסופקים
- חלופות: קרן חניה, חפיפת שימושים, קרבה לתח"צ
- *דוגמה*: בערר בית הכרם — 8 סעיפים, 400+ מילים מהוראות תכנית 5166ב

### ד. קווי בניין ומרווחים (כשרלוונטי)
- הוראת תכנית על מרווחים
- סטייה ניכרת? — תקנה 2(19) / הלכת בן-יקר-גת
- הצדקה + מידתיות — פגיעה בשכנים?

### ה. גובה וקומות (כשרלוונטי)
- הוראת תכנית + נספח בינוי (חתכים)
- מטרת ההגבלה — למה יש הגבלת גובה כאן?
- סטייה ניכרת — תקנה 2(10) / 2(8)

### ו. פגיעה בשכנים (כשרלוונטי)
- ממצאי סיור באתר
- השפעה: צל, פרטיות, רעש, נוף
- מידתיות — האם הפגיעה סבירה?

### ז. שימוש חורג (כשרלוונטי)
- מה השימוש המותר בתכנית? מה השימוש המבוקש?
- "מבחן ההתאמה" — האם השימוש מתאים למיקום?
- תנאים ומגבלות
""",

    "licensing_threshold": """## צ'קליסט תוכן — ערר רישוי סף/סמכות
הערר עוסק בשאלות סף — אין צורך בדיון תכנוני מקיף.

### א. שאלת הסמכות
- סעיפי חוק רלוונטיים (ס' 12ב, 152, וכו')
- פסיקה על גבולות הסמכות

### ב. זכות ערר
- מי רשאי לערור? באיזה מסלול?
- הלכת שפר (עע"מ 317/10) — כשרלוונטית

### ג. שיהוי (אם רלוונטי)
""",

    "licensing_property": """## צ'קליסט תוכן — ערר רישוי קנייני
הערר עוסק בעיקר בשאלת תימוכין קנייניים — דיון משפטי.

### א. מסגרת נורמטיבית
- הלכת עייזן, בני אליעזר, רוזן — "היתכנות קניינית"
- ס' 71ב לחוק המקרקעין

### ב. בחינת הראיות
- הסכמות, רישום, היסטוריית בנייה
- חלוקה דה-פקטו ארוכת שנים

### ג. הפרדה בין קניין לתכנון
- גוף תכנוני אינו מכריע בסכסוכי קניין
- "היתכנות קניינית" ≠ הוכחת בעלות

### ד. שאלות תכנוניות (אם רלוונטיות)
- אם הערר עולה גם שאלות תכנוניות — דון בהן בנפרד
""",

    "tama38": """## צ'קליסט תוכן — ערר תמ"א 38
הדיון חייב לאזן בין אינטרס ציבורי לפגיעה בשכנים.

### א. אינטרס ציבורי — חיזוק/התחדשות
- עוצמת האינטרס — בניין גדול vs. בית בודד
- "בית בודד" מחליש את אינטרס החיזוק
- תרומה לרקמה העירונית

### ב. תכנית אב / מדיניות אזורית
- האם יש תכנית אב? מדיניות 16000?
- התאמה לראיה כללית vs. אד-הוק

### ג. ניתוח השוואתי
- זכויות לפי תכנית קיימת vs. מבוקש לפי תמ"א 38
- שטחים, קומות, קווי בניין — טבלת השוואה

### ד. שימור (כשרלוונטי)
- חוות דעת אגף שימור
- השפעה על מיקום/צורת הבניין

### ה. חניה (כמעט תמיד רלוונטי)
- הוראות תכנית + ס' 17 לתמ"א 38
- פטורים — קרבה לתח"צ, קרן חניה, תכנית אב
- ניתוח מפורט של חלופות

### ו. פגיעה בשכנים
- ממצאי סיור
- צל, פרטיות, קרבה
- מידתיות — מה הפגיעה ביחס לתועלת?

### ז. מטרדי בנייה
- "מטרד בנייה אינו עילה לסירוב" — אך תנאים נדרשים
- תכנית ארגון אתר
""",

    "betterment_levy": """## צ'קליסט תוכן — ערר היטל השבחה
מבוסס על ניתוח 26 החלטות של דפנה תמיר (קורפוס CMPA, אפריל 2026).

### א. תקן ביקורת (חובה בפתיחת הדיון)
- ציין את רף ההתערבות: "ועדת הערר תיטה לאמץ את חוות דעתו של השמאי..."
- אבחנה: התערבות מצומצמת בעניינים שמאיים-מקצועיים, התערבות רחבה בעניינים משפטיים
- הפניה ל-בר"ם 3644/13 גלר או פסיקה דומה

### ב. המסגרת הנורמטיבית
- התוספת השלישית לחוק התכנון והבנייה
- סעיפי הפטור הרלוונטיים (ס' 19(ג), ס' 19(ב) וכו')
- אירוע מס — מה יצר את ההשבחה? (תכנית, היתר, מכר)
- מועד המימוש ומועד הקובע

### ג. שומה ומתודולוגיה שמאית
- שיטת השומה (שומה מכרעת / שומה מוסכמת / שמאי מייעץ)
- מבחן השימוש הטוב והיעיל (highest and best use) — מצב קודם ומצב חדש
- זכויות בנייה — לפני ואחרי (אחוזי בנייה, שטחים עיקריים, תמהיל שימושים)
- שווי מקרקעין — מצב קודם ומצב חדש (שיטת השוואה / יחידות תועלת)
- עלויות עודפות (חניה, מטלות ציבוריות, תשתיות)
- מקדמי זמינות, שיעורי הפקעה
- הכרעה מפוצלת (bifurcation) — כשהוועדה מאשרת חבות אך ממנה שמאי מייעץ: ביטויי גישור ("ניתן יהיה לעלות בפני השמאי המייעץ"), נוסחת מינוי, הפניה לתקנות סדרי דין התשס"ט-2008, הוראות המשך (30 יום להשגות). ללא סיכום — ישירות לחתימה. ראה: 8070/25

### ד. שאלות משפטיות (לפי רלוונטיות)
- פטורים — דירת מגורים (ס' 19(ג)(1)), שטח עד 140 מ"ר, תא משפחתי
- מועד מימוש — זיכרון דברים vs הסכם מכר, העברת זכויות
- זהות החייב — בעלים, חוכר, יזם, חברה בבעלות יזם
- מקרקעי ישראל — הסדרים מיוחדים (ס' 21 לתוספת השלישית)
- שומות מוסכמות — תוקף, משמעות, "בלתי נצפה מראש"
- פרשנות תכניות — ייעוד, שימושים מותרים, מדיניות ועדה מקומית
- טענת "תכנית צל = זכות מוקנית" — ניתוח תלת-שכבתי: (1) נורמטיבית — תכנית צל = המחשה, לא מקור נורמטיבי; (2) פרוצדורלית — הקלה ניתנת פר-מבקש, לא זכות כללית; (3) שמאית — משקל הסתברותי בהערכת ההשבחה, לא במישור המשפטי. ראה: 8070/25

### ה. ניתוח שמאי (כשיש שומה מכרעת)
- האם השומה מבוססת על מסד עובדתי הולם?
- האם השיטה השמאית מקובלת?
- האם ההנחות סבירות והגיוניות?
- טעות מהותית / דופי חמור?
- פגם מינהלי (ניגוד עניינים, משוא פנים)?
""",
}


def get_content_checklist(
    appeal_type: str = "",
    subject: str = "",
    subject_categories: list[str] | None = None,
) -> str:
    """Return the appropriate content checklist based on case characteristics.

    Determines the subtype from case metadata:
    - TAMA 38 cases → tama38 checklist
    - Betterment levy (8xxx) → betterment_levy checklist
    - Property-only cases → licensing_property checklist
    - Threshold/jurisdiction cases → licensing_threshold checklist
    - All other licensing → licensing_substantive checklist
    """
    cats = subject_categories or []
    subject_lower = subject.lower() if subject else ""
    appeal_lower = appeal_type.lower() if appeal_type else ""

    # TAMA 38
    if any(
        kw in subject_lower
        for kw in ["תמ\"א 38", "תמא 38", "תמ\"א38", "חיזוק", "tama"]
    ) or "תמ\"א 38" in cats:
        return CONTENT_CHECKLISTS["tama38"]

    # Betterment levy
    if "היטל השבחה" in appeal_lower or "betterment" in appeal_lower or any(
        "היטל" in c for c in cats
    ):
        return CONTENT_CHECKLISTS["betterment_levy"]

    # Property-focused (תימוכין קנייניים)
    if any(
        kw in subject_lower
        for kw in ["תימוכין", "קנייני", "בעלות", "הסכמת דיירים"]
    ):
        return CONTENT_CHECKLISTS["licensing_property"]

    # Threshold/jurisdiction
    if any(
        kw in subject_lower
        for kw in ["סמכות", "סף", "סילוק על הסף", "זכות ערר"]
    ):
        return CONTENT_CHECKLISTS["licensing_threshold"]

    # Default: substantive licensing
    return CONTENT_CHECKLISTS["licensing_substantive"]


# ── Methodology guidance (condensed from decision-methodology.md) ──

_METHODOLOGY_CORE = """## מתודולוגיה אנליטית — עקרונות מנחים לכתיבת הדיון

### מבנה סילוגיסטי לכל סוגיה
כל סוגיה נבנית כסילוגיזם: (1) הנחה עליונה = הכלל (הוראת תכנית, חוק, הלכה); (2) הנחה תחתונה = העובדות הספציפיות; (3) מסקנה. אם לא ניתן לזהות את הכלל — ההנמקה אינה מספקת. אם לא ניתן לזהות כיצד העובדות מקיימות את הכלל — ההנמקה קריפטית.

### התחל מלשון הטקסט
כשהמקרה נשלט על ידי הוראת תכנית או סעיף חוק — פתח בציטוט ההוראה. פרש מילים במשמעותן הרגילה. תן תוקף לכל מילה. אם יש עמימות — השתמש בכלי פרשנות.

### הפרד ממצא עובדתי ממסקנה משפטית
"הבניה במרחק 1.5 מטרים מגבול המגרש" = ממצא עובדתי. "חריגה זו עולה כדי סטייה ניכרת" = מסקנה משפטית. אל תערבב.

### CREAC לכל סוגיה
1. מסקנה — פתח בתשובה ("הבקשה אינה תואמת...")
2. כלל — ציטוט ההוראה
3. הרחבה — תקדים רלוונטי אחד (אם נדרש)
4. יישום — החלת הכלל על העובדות (לב ההנמקה)
5. מסקנה חוזרת — סגירה תמציתית

### Steel-Man — הצג טענה בחוזקתה לפני דחייה
לפני שדוחים טענה — הצג אותה בגרסה החזקה ביותר: "אמנם צודק העורר כי [נקודה לטובתו], אולם [הנימוק לדחייה]." טענת קש קלה להפריך אך לא משכנעת.

### טכניקת סנדוויץ' לציטוטים
כל ציטוט עטוף: משפט הקדמה (מודיע על התוכן) → ציטוט → ניתוח (מסביר כיצד רלוונטי למקרה). אל תניח שהקורא יקרא ציטוט ארוך ויפיק ממנו מסקנות בעצמו.

### נתונים, לא תיאורים
"הבקשה חורגת ב-1.5 מטרים מקו הבניין" — לא "הבקשה חורגת באופן משמעותי." מספרים, מידות, אחוזים.

### כנות לגבי קושי
כשהמקרה קשה — אמור זאת: "הדבר אינו נקי מספקות, אולם..." אל תעמיד פנים שמקרה קשה הוא קל.

### כל מילה עובדת
"לאחר ששקלנו את כלל השיקולים" — ריק, מחק. מבחן: אם מוחקים את המשפט וההחלטה לא מאבדת מידע — המשפט מיותר.

### איזון ומידתיות (כשהכלל לא נותן תשובה חד-משמעית)
כשנדרש איזון:
1. זהה אינטרסים קונקרטיים (לא "אינטרס הציבור" אלא "שמירה על אופי מגורים צמודי קרקע")
2. בחן השלכות לכל כיוון: מה קורה אם מקבלים? אם דוחים?
3. שקול השלכות מערכתיות: מה הסיגנל שנשלח למערכת?
4. ציין מה מכריע את הכף ולמה
כשמטילים מגבלה/תנאי — מבחן מידתיות: (1) תכלית ראויה?; (2) אמצעי פוגע פחות?; (3) פגיעה מידתית ביחס לתועלת?

### טיפול בטענות
- ההחלטה מנתחת שאלות — לא מתווכחת עם עו"ד. מבנה: שאלה→כלל→עובדות→מסקנה
- טענות שסומנו [bundle] ב-chair_directions: קבץ ודון יחד
- טענות שסומנו [skip] ב-chair_directions: ציון קצר בלבד
- טענות ללא סימון: ענה בנפרד עם מענה מנומק
- טענה מרכזית של הצד המפסיד חייבת מענה Steel-Man
- מיקום ההתמודדות עם טענות נגדיות: באמצע הדיון בסוגיה (לא בהתחלה ולא בסוף)
"""

def get_methodology_summary() -> str:
    """Return the condensed methodology guidance — always the same, always complete.

    The methodology is universal: it teaches HOW to think, not WHAT to discuss.
    Case-specific content (parking, building lines, significant deviation) belongs
    in the content checklists, not here.
    """
    return _METHODOLOGY_CORE
