"""Prior-art benzerlik analizi — Claude Haiku 4.5 ile.

Her hit için:
- similarity_score (0-100): buluşun özüyle çakışma miktarı
- rationale: 2-3 cümlelik vekil-odaklı gerekçe (TR)
- risk_level: 'düşük' | 'orta' | 'yüksek'

Kullanım:
- Haiku çünkü görev "özet + başlık karşılaştırma" — basit, ucuz.
- Structured output (messages.parse) ile JSON şemasına zorlanır.
"""

from __future__ import annotations

from anthropic import APIError
from pydantic import BaseModel, Field

from app.services.llm import get_anthropic_client, load_turkpatent_system_prompt
from app.services.prior_art.models import PriorArtHit


class AnalysisItem(BaseModel):
    """Tek bir hit için analiz çıktısı."""

    patent_no: str
    similarity_score: int = Field(..., ge=0, le=100)
    risk_level: str = Field(..., pattern=r"^(düşük|orta|yüksek)$")
    rationale: str = Field(..., min_length=20, max_length=1000)


class AnalysisList(BaseModel):
    analyses: list[AnalysisItem] = Field(..., min_length=0, max_length=50)


class AnalysisError(RuntimeError):
    """Claude analizi başarısız (API veya şema hatası)."""


def _build_analysis_prompt(
    invention_summary: str,
    hits: list[PriorArtHit],
) -> str:
    """Her hit için rank yapılacak kullanıcı mesajı."""
    lines = [
        "## Analiz edilecek buluş",
        "",
        invention_summary.strip(),
        "",
        "---",
        "",
        "## Aday prior-art patent listesi",
        "",
    ]
    for i, hit in enumerate(hits, start=1):
        lines.append(f"### {i}. {hit.patent_no}")
        lines.append(f"- **Kaynak:** {hit.source}")
        if hit.title:
            lines.append(f"- **Başlık:** {hit.title}")
        if hit.applicant:
            lines.append(f"- **Başvuru sahibi:** {hit.applicant}")
        if hit.filing_date:
            lines.append(f"- **Başvuru tarihi:** {hit.filing_date}")
        if hit.cpc_classes:
            lines.append(f"- **CPC:** {', '.join(hit.cpc_classes)}")
        if hit.abstract:
            lines.append(f"- **Özet:** {hit.abstract[:600]}")
        lines.append("")

    lines.append("---")
    lines.append("")
    lines.append(
        "Her patent için aşağıdaki JSON şemasına uygun analiz üret:\n"
        "- `similarity_score`: 0-100 arası tam sayı\n"
        "  - 0-30: konu yakın ama teknik çözüm farklı (düşük risk)\n"
        "  - 31-60: benzer yaklaşım, önemli farklar var (orta risk)\n"
        "  - 61-85: çok yakın çözüm, bağımsız istem daraltılmalı (yüksek risk)\n"
        "  - 86-100: muhtemel tam çakışma, patentlenebilirlik tartışılmalı\n"
        "- `risk_level`: 'düşük' / 'orta' / 'yüksek' (score'a göre)\n"
        "- `rationale`: 2-3 cümlelik Türkçe gerekçe (vekile hitap eder; "
        "teknik farkları ve nerede çakışma/boşluk olduğunu belirtir)\n\n"
        "Yalnızca listedeki patentleri analiz et. Uydurma veri ekleme. "
        "Sırayı koruyarak `analyses` array'i döndür."
    )
    return "\n".join(lines)


async def analyze_prior_art(
    invention_summary: str,
    hits: list[PriorArtHit],
    *,
    model: str = "claude-haiku-4-5",
) -> list[AnalysisItem]:
    """Hit listesini Claude Haiku ile analiz et.

    Empty hits → empty list (API çağrısı yapmaz).
    """
    if not hits:
        return []

    client = get_anthropic_client()
    system_prompt = load_turkpatent_system_prompt()
    user_message = _build_analysis_prompt(invention_summary, hits)

    try:
        response = await client.messages.parse(
            model=model,
            max_tokens=4000,
            system=[
                {
                    "type": "text",
                    "text": system_prompt,
                    "cache_control": {"type": "ephemeral"},
                }
            ],
            messages=[{"role": "user", "content": user_message}],
            output_format=AnalysisList,
        )
    except APIError as exc:
        raise AnalysisError(f"Anthropic API: {exc.message}") from exc

    parsed: AnalysisList | None = response.parsed_output
    if parsed is None:
        raise AnalysisError("Claude yapılandırılmış çıktı üretemedi.")

    return parsed.analyses
