from typing import Any

from app.schemas import ModelType

from .base import InferenceModel
from .clip import MCLIPEncoder, OpenCLIPEncoder
from .constants import is_insightface, is_mclip, is_openclip
from .facial_recognition import FaceRecognizer


def from_model_type(model_type: ModelType, model_name: str, **model_kwargs: Any) -> InferenceModel:
    match model_type:
        case ModelType.CLIP:
            if is_openclip(model_name):
                return OpenCLIPEncoder(model_name, **model_kwargs)
            elif is_mclip(model_name):
                return MCLIPEncoder(model_name, **model_kwargs)
        case ModelType.FACIAL_RECOGNITION:
            if is_insightface(model_name):
                return FaceRecognizer(model_name, **model_kwargs)
        case _:
            raise ValueError(f"Unknown model type {model_type}")

    raise ValueError(f"Unknown {model_type} model {model_name}")