"""OpenInference <-> OpenLLMetry semantic translation.

Mirrors frameworks-py/src/runner/llm_semconv.py exactly.
"""
from __future__ import annotations

from typing import Literal


OI_LLM_KINDS: tuple[str, ...] = (
    "LLM",
    "CHAIN",
    "AGENT",
    "TOOL",
    "EMBEDDING",
    "RETRIEVER",
    "RERANKER",
)
OI_LLM_KIND_SET: frozenset[str] = frozenset(OI_LLM_KINDS)

OI_LLM_LEAF_KIND_SET: frozenset[str] = frozenset({"LLM"})


def oi_kind_to_operation(kind: str) -> Literal["chat", "embedding", "rerank"]:
    if kind == "EMBEDDING":
        return "embedding"
    if kind == "RERANKER":
        return "rerank"
    return "chat"


def oi_kind_to_genai_span_kind(kind: str) -> str:
    return "generation" if kind == "LLM" else kind.lower()


# Attribute mirror: (dest_key, src_key, coerce)
OI_TO_GENAI_MIRROR: tuple[tuple[str, str, str | None], ...] = (
    ("gen_ai.usage.prompt_tokens", "llm.token_count.prompt", "number"),
    ("gen_ai.usage.completion_tokens", "llm.token_count.completion", "number"),
    ("llm.usage.total_tokens", "llm.token_count.total", "number"),
    ("gen_ai.usage.input_tokens", "llm.token_count.prompt", "number"),
    ("gen_ai.usage.output_tokens", "llm.token_count.completion", "number"),
    ("gen_ai.usage.total_tokens", "llm.token_count.total", "number"),
    (
        "gen_ai.usage.cache_read.input_tokens",
        "llm.token_count.prompt_details.cache_read",
        "number",
    ),
    ("gen_ai.request.model", "llm.model_name", None),
    ("gen_ai.response.model", "llm.model_name", None),
    ("gen_ai.system", "llm.provider", None),
    ("gen_ai.provider.name", "llm.provider", None),
)
