# baselines
import importlib
from .model_utils import get_template, load_model_and_tokenizer, load_vllm_model, _init_ray

_method_mapping = {
    "DirectRequest": "baselines.direct_request",
    "GCG": "baselines.gcg",
    "EnsembleGCG": "baselines.gcg_ensemble",
    "HumanJailbreaks": "baselines.human_jailbreaks",
    "ZeroShot": "baselines.zeroshot",
    "FewShot": "baselines.fewshot",
    "PEZ": "baselines.pez",
    "GBDA": "baselines.gbda",
    "PAIR": "baselines.pair",
    "TAP": "baselines.tap",
    "AutoDAN": "baselines.autodan",
    "AutoPrompt": "baselines.autoprompt",
    "UAT": "baselines.uat",
    'PAP': "baselines.pap",
    "MultiModalPGD": "baselines.multimodalpgd",
    "MultiModalPGDBlankImage": "baselines.multimodalpgd",
    "MultiModalPGDPatch": "baselines.multimodalpgd",
    "MultiModalRenderText": "baselines.multimodalrendertext",
    "MultiModalDirectRequest": "baselines.multimodaldirectrequest",
    "GPTFuzz": "baselines.gptfuzz",
    "ArtPrompt": "baselines.artprompt",
}


def get_method_class(method):
    """
    Returns the method class given the method name. This is used to access static methods.
    """
    if method not in _method_mapping:
        raise ValueError(f"Can not find method {method}")
    module_path = _method_mapping[method]
    module = importlib.import_module(module_path)
    method_class = getattr(module, method)  # Class name assumed to be the same as method name
    return method_class


def init_method(method_class, method_config):
    if method_class.use_ray:
        _init_ray(num_cpus=8)
    output = method_class(**method_config)
    return output

