"""Tests for jurisdiction-aware system prompt loading.

Drafting endpoint'leri (draft-description/claims/abstract) jurisdiction'a
göre doğru sistem prompt'unu yükler. Bu testler LLM çağrısı yapmaz —
yalnızca prompt seçim mantığını ve prompt dosyalarının içeriğini doğrular.
"""

from __future__ import annotations

import pytest

from app.api.drafting import _prompt_jurisdiction
from app.services.llm import load_system_prompt, load_turkpatent_system_prompt

# --- Prompt yükleme ---------------------------------------------------------


def test_load_tr_prompt_is_turkish() -> None:
    prompt = load_system_prompt("TR")
    assert "TürkPatent" in prompt
    assert "6769" in prompt or "TPMK" in prompt


def test_load_epo_prompt_is_english_and_epc() -> None:
    prompt = load_system_prompt("EP")
    assert "EPO" in prompt
    assert "EPC" in prompt
    assert "characterized in that" in prompt  # Rule 43 two-part claim


def test_load_uspto_prompt_is_english_and_cfr() -> None:
    prompt = load_system_prompt("US")
    assert "USPTO" in prompt
    assert "37 CFR" in prompt
    assert "comprising" in prompt  # MPEP claim transitional phrase


def test_unknown_jurisdiction_falls_back_to_tr() -> None:
    """Bilinmeyen jurisdiction TR prompt'una düşmeli."""
    assert load_system_prompt("XX") == load_system_prompt("TR")


def test_legacy_loader_still_returns_tr() -> None:
    """Geriye uyum: load_turkpatent_system_prompt hâlâ TR döner."""
    assert load_turkpatent_system_prompt() == load_system_prompt("TR")


def test_all_prompts_share_output_format_contract() -> None:
    """Üç prompt da aynı çıktı sözleşmesini içermeli — drafting.py parse'ı
    JSON istem array'i ve markdown bekler; format bölümleri ortak olmalı."""
    for juris in ("TR", "EP", "US"):
        prompt = load_system_prompt(juris)
        # İstem çıktısı JSON array — number/type/parent/text alanları
        assert '"number"' in prompt, juris
        assert '"type"' in prompt, juris
        assert '"parent"' in prompt, juris
        assert '"text"' in prompt, juris


# --- _prompt_jurisdiction normalizasyonu ------------------------------------


@pytest.mark.parametrize(
    ("inp", "expected"),
    [
        ("TR", "TR"),
        ("EP", "EP"),
        ("US", "US"),
        ("PCT", "TR"),  # PCT için ayrı drafting prompt'u yok → TR
        ("", "TR"),
        ("bilinmeyen", "TR"),
    ],
)
def test_prompt_jurisdiction_normalization(inp: str, expected: str) -> None:
    assert _prompt_jurisdiction(inp) == expected
