from types import ModuleType
from typing import Any

from pydantic import BaseModel, Field

from .typing import ASYNC_FUNCTION_CALL_FUNC, FUNCTION_CALL_FUNC


class PluginMetadata(BaseModel):
    """
    Marsho 插件 对象元数据
    Attributes:
    ----------

    name: str
        友好名称: 例如Marsho Test
    description: str
        插件描述
    usage: str
        插件使用方法
    type: str
        插件类型
    author: str
        插件作者
    homepage: str
        插件主页
    extra: dict[str, Any]
        额外信息,自定义键值对
    """

    name: str
    description: str = ""
    usage: str = ""
    author: str = ""
    homepage: str = ""
    extra: dict[str, Any] = {}


class Plugin(BaseModel):
    """
    存储插件信息

    Attributes:
    ----------
    name: str
        包名称 例如marsho_test
    module: ModuleType
        插件模块对象
    module_name: str
        点分割模块路径 例如a.b.c
    metadata: "PluginMeta" | None
        元
    """

    name: str
    """包名称 例如marsho_test"""
    module: ModuleType
    """插件模块对象"""
    module_name: str
    """点分割模块路径 例如a.b.c"""
    metadata: PluginMetadata | None = None
    """元"""

    class Config:
        arbitrary_types_allowed = True

    def __hash__(self) -> int:
        return hash(self.name)

    def __eq__(self, other: Any) -> bool:
        return self.name == other.name