import importlib
import inspect
from typing import Any, Callable, Optional


def has_func(module_path:str, func_name:str) -> bool:
    """判断函数是否存在"""
    try:
        module = importlib.import_module(module_path)
        return hasattr(module, func_name)
    except Exception:
        return False

def import_func_by_module(module_path, func_name) -> Optional[Callable]:
    """动态导入函数: 根据路径导入任务函数（如 "jobs.business_tasks， test_task"）"""
    module = importlib.import_module(module_path)
    return getattr(module, func_name)

def import_func(func_path: str) -> Optional[Callable]:
    """动态导入函数: 根据路径导入任务函数（如 "jobs.business_tasks.test_task"）"""
    module_path, func_name = func_path.rsplit(".", 1)
    module = importlib.import_module(module_path)
    return getattr(module, func_name)

def run_func(func_path: str, *args, **kwargs) -> Any:
    """
    运行函数
    :param func_path: 函数路径
    :param args: 运行参数
    :param kwargs: 运行参数
    :return: 运行结果
    """
    func = import_func(func_path)
    if not func or  not callable(func):
        raise ValueError(f"{func_path} 不是一个可调用对象")
    return func(*args, **kwargs)


def run_module(module_path:str, func_name:str, *args, **kwargs):
    """
    运行模块中的某个函数
    :param module_path: 模块路径
    :param func_name: 方法名称
    :param args: 运行参数
    :param kwargs 运行参数
    :return: 运行结果
    """
    # 导入模块
    func = import_func_by_module(module_path, func_name)
    if not func or not callable(func):
        raise ValueError(f"{module_path}.{func_name} 不是一个可调用对象")
    return func(*args, **kwargs)

def import_module_class(module_path:str, super_class:type[Callable[[Any], Any]]):
    """
    导入模块中的某个类
    :param module_path: 模块路径
    :param super_class: 父类
    :return: 模块中的方法
    """
    # 导入模块
    module = importlib.import_module(module_path)
    if not inspect.isclass(super_class):
        raise ValueError(f"{super_class} 不是一个类")
    import_class = None
    for attr_name in dir(module):
        attr = getattr(module, attr_name)
        if (inspect.isclass(attr) and
                issubclass(attr, super_class) and
                attr != super_class):
            import_class = attr
            break

    if import_class is None:
        raise AttributeError(f"在模块 {module_path} 中未找到继承自{super_class}的类")
    return import_class

def import_module_class_instance(module_path:str, super_class:type[Callable[[Any], Any]], init_params:dict[str, Any]=None):
    """
    导入模块中的某个类的实例
    :param module_path: 模块路径
    :param super_class: 父类
    :param init_params: 初始化参数
    :return: 模块中的方法
    """
    import_class = import_module_class(module_path, super_class)
    # 创建实例
    init_params = init_params or {}
    return import_class(**init_params)

def import_module_class_func(module_path:str, super_class:type[Callable[[Any], Any]], class_method_name:str, init_params:dict[str, Any]=None):
    """
    导入模块中的某个类
    :param module_path: 模块路径
    :param super_class: 父类
    :param class_method_name: 类中的方法名称
    :param init_params: 初始化参数
    :return: 模块中的方法
    """
    run_instance = import_module_class_instance(module_path, super_class, init_params)
    return getattr(run_instance, class_method_name)

def run_module_class(module_path:str, super_class:type[Callable[[Any], Any]], class_method_name:str, init_params:dict[str, Any]=None, *args, **kwargs):
    """
    运行模块中的某个类
    :param module_path: 模块路径
    :param super_class: 父类
    :param class_method_name: 类中的方法名称
    :param init_params: 初始化参数
    :param args: 运行参数
    :param kwargs: 运行参数
    :return: 运行结果
    """
    tmp_run_func = import_module_class_func(module_path, super_class, class_method_name, init_params)
    return tmp_run_func(*args, **kwargs)
