from dataclasses import dataclass, field
from typing import Optional


@dataclass
class RAGArguments:
    """Argomenti CLI per il sottosistema RAG server-side."""

    rag_enabled: bool = field(
        default=False,
        metadata={
            "help": (
                "Abilita il retrieval RAG server-side: ogni turno utente viene usato come query "
                "per la knowledge base locale, e i top-k chunk vengono iniettati nel prompt "
                "prima dell'LLM. Default: False."
            )
        },
    )
    rag_kb_path: str = field(
        default="./kb",
        metadata={
            "help": (
                "Percorso cartella knowledge base. Contiene file .md/.txt (auto-chunkizzati), "
                "file .jsonl pre-chunkizzati, l'indice _index.npz e _chunks.jsonl. Default: ./kb"
            )
        },
    )
    rag_embedding_model: str = field(
        default="paraphrase-multilingual-MiniLM-L12-v2",
        metadata={
            "help": (
                "Modello sentence-transformers per l'embedding. "
                "'paraphrase-multilingual-MiniLM-L12-v2' supporta spagnolo e 50+ lingue, "
                "veloce e leggero. Per spagnolo puro puoi usare 'hiiamsid/sentence_similarity_spanish_es'."
            )
        },
    )
    rag_device: str = field(
        default="auto",
        metadata={
            "help": "Device per embedding: 'auto' (usa CUDA se disponibile), 'cuda', 'cpu', 'mps'. Default: auto"
        },
    )
    rag_top_k: int = field(
        default=3,
        metadata={"help": "Numero massimo di chunk da recuperare per query. Default: 3"},
    )
    rag_threshold: float = field(
        default=0.25,
        metadata={
            "help": (
                "Soglia minima coseno-similarità per considerare un chunk rilevante. "
                "Range [0,1]; valori più alti = meno falsi positivi. Default: 0.25"
            )
        },
    )
    rag_chunk_size: int = field(
        default=512,
        metadata={"help": "Dimensione massima in caratteri per ogni chunk (solo file md/txt). Default: 512"},
    )
    rag_chunk_overlap: int = field(
        default=64,
        metadata={"help": "Overlap in caratteri tra chunk consecutivi. Default: 64"},
    )
    rag_force_rebuild: bool = field(
        default=False,
        metadata={
            "help": "Se True, ricostruisce sempre l'indice da zero anche se esiste _index.npz. Default: False"
        },
    )
    rag_language: str = field(
        default="es",
        metadata={
            "help": (
                "Lingua per il prompt injection header (intestazione blocchi RAG). "
                "Valori: 'es' (spagnolo), 'it' (italiano), 'en' (inglese). Default: es"
            )
        },
    )
    rag_embedding_batch_size: int = field(
        default=32,
        metadata={"help": "Batch size per l'embedding durante l'indicizzazione. Default: 32"},
    )
    rag_inject_as: str = field(
        default="system",
        metadata={
            "help": (
                "Dove iniettare i risultati retrieval: 'system' (system message, consigliato) "
                "oppure 'user' (accodato all'ultimo messaggio utente). Default: system"
            )
        },
    )
