# app/ai/triager.py

import json
from openai import OpenAI

from app.config.secrets import OPENAI_API_KEY
from app.ai.triage_prompts import (
    TRIAGE_VERSION,
    SYSTEM_PROMPT_TRIAGE,
    USER_PROMPT_TRIAGE_TEMPLATE,
)

client = OpenAI(api_key=OPENAI_API_KEY)


def triage_article(title: str, excerpt: str, model: str = "gpt-4o-mini"):
    user_prompt = USER_PROMPT_TRIAGE_TEMPLATE.format(
        title=(title or "").strip(),
        excerpt=(excerpt or "").strip(),
    )

    resp = client.chat.completions.create(
        model=model,
        temperature=0.0,  # triage = deterministe autant que possible
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT_TRIAGE.strip()},
            {"role": "user", "content": user_prompt.strip()},
        ],
        response_format={"type": "json_object"},
    )

    content = resp.choices[0].message.content.strip()

    usage = getattr(resp, "usage", None)
    tokens_in = getattr(usage, "prompt_tokens", None) if usage else None
    tokens_out = getattr(usage, "completion_tokens", None) if usage else None

    data = json.loads(content)

    score = int(data.get("triage_score", 0))
    score = max(0, min(100, score))

    # Label derive/normalise
    label = (data.get("triage_label") or "").strip().lower()
    if score >= 80:
        label = "hot"
    elif score >= 55:
        label = "maybe"
    else:
        label = "skip"

    reason = (data.get("triage_reason") or "").strip() or None
    source_lang = (data.get("source_lang") or "unknown").strip()

    return {
        "triage_version": TRIAGE_VERSION,
        "triage_score": score,
        "triage_label": label,
        "triage_reason": reason,
        "source_lang": source_lang,
        "model": model,
        "tokens_in": tokens_in,
        "tokens_out": tokens_out,
    }
