import os
from typing import Optional
from murnitur.annotation.evaluation.singleton import Singleton
from murnitur.annotation.evaluation.progress_context import progress_context


class HallucinationModel(metaclass=Singleton):
    def __init__(self, model_name: Optional[str] = None):
        try:
            from sentence_transformers import CrossEncoder
        except ImportError:
            raise ImportError(
                "The 'sentence_transformers' library is required to use the HallucinationMetric."
            )
        # We use a smple cross encoder model
        model_name = (
            "vectara/hallucination_evaluation_model"
            if model_name is None
            else model_name
        )
        os.environ["TOKENIZERS_PARALLELISM"] = "false"

        # TODO: add this progress context in the correct place
        with progress_context(
            "Downloading HallucinationEvaluationModel (may take up to 2 minutes if running for the first time)..."
        ):
            self.model = CrossEncoder(model_name)
