"""插件清单定义 - Phase 8.1"""

from dataclasses import dataclass, field
from typing import Any


@dataclass
class PluginManifest:
    """插件清单

    定义插件的元数据和接口。
    """

    id: str  # 唯一标识
    name: str  # 显示名称
    version: str  # 版本号
    description: str  # 描述
    author: str = ""  # 作者
    homepage: str = ""  # 主页
    license: str = "MIT"  # 许可证

    # 插件类型
    plugin_type: str = "tool"  # tool, hook, skill, all

    # 入口点
    main: str = "index.py"  # 主入口文件
    hooks: list[str] = field(default_factory=list)  # 提供的 Hook 列表
    tools: list[str] = field(default_factory=list)  # 提供的工具列表
    skills: list[str] = field(default_factory=list)  # 提供的 Skills 列表

    # 依赖
    dependencies: dict[str, str] = field(default_factory=dict)  # pip 依赖
    peer_dependencies: dict[str, str] = field(default_factory=dict)  # 对等依赖

    # 权限要求
    permissions: list[str] = field(default_factory=list)  # 需要的权限
    allowed_paths: list[str] = field(default_factory=list)  # 允许访问的路径
    denied_paths: list[str] = field(default_factory=list)  # 禁止访问的路径

    # 网络权限
    network_allowed: bool = False  # 是否允许网络访问
    allowed_hosts: list[str] = field(default_factory=list)  # 允许访问的 host

    # 配置
    config_schema: dict[str, Any] = field(default_factory=dict)  # 配置 schema

    def to_dict(self) -> dict[str, Any]:
        return {
            "id": self.id,
            "name": self.name,
            "version": self.version,
            "description": self.description,
            "author": self.author,
            "homepage": self.homepage,
            "license": self.license,
            "plugin_type": self.plugin_type,
            "main": self.main,
            "hooks": self.hooks,
            "tools": self.tools,
            "skills": self.skills,
            "dependencies": self.dependencies,
            "peer_dependencies": self.peer_dependencies,
            "permissions": self.permissions,
            "allowed_paths": self.allowed_paths,
            "denied_paths": self.denied_paths,
            "network_allowed": self.network_allowed,
            "allowed_hosts": self.allowed_hosts,
            "config_schema": self.config_schema,
        }

    @classmethod
    def from_dict(cls, data: dict[str, Any]) -> "PluginManifest":
        return cls(**data)
