use std::io;

use thiserror::Error;

/// 运行时操作中可能发生的错误。
#[derive(Error, Debug)]
pub enum RuntimeError {
    /// 指定的插件文件路径不存在。
    #[error("plugin file not found: {0}")]
    PluginFileNotFound(String),

    /// 插件文件扩展名无效（必须是 `.pgp`）。
    #[error("invalid plugin file extension: {0}")]
    InvalidPluginExtension(String),

    /// 无法将插件压缩包解析为有效的 zip 文件。
    #[error("invalid plugin archive: {0}")]
    InvalidPluginArchive(String),

    /// 插件压缩包中缺少 `penguin-plugin.json` 清单文件。
    #[error("missing penguin-plugin.json in plugin archive")]
    MissingPluginManifest,

    /// 插件清单格式错误或包含无效数据。
    #[error("invalid plugin manifest: {0}")]
    InvalidPluginManifest(String),

    /// 插件要求的 API 版本高于当前运行时支持的版本。
    #[error("plugin API version too high: {api} > {current}")]
    ApiVersionTooHigh { api: i64, current: i64 },

    /// 插件的依赖项未满足。
    #[error("unsatisfied plugin dependency: {id} requires version-code >= {version_code}")]
    UnsatisfiedDependency { id: String, version_code: i64 },

    /// 相同 ID 的插件已被加载。
    #[error("plugin already loaded: {0}")]
    PluginAlreadyLoaded(String),

    /// 加载插件动态库失败。
    #[error("plugin library error: {0}")]
    LibraryError(String),

    /// 读取插件资源时发生错误。
    #[error("plugin resource error: {0}")]
    ResourceError(String),

    /// 底层 I/O 错误。
    #[error("IO error: {0}")]
    Io(#[from] io::Error),

    /// JSON 序列化或反序列化错误。
    #[error("JSON error: {0}")]
    Json(#[from] serde_json::Error),

    /// 读取 zip 压缩包时发生错误。
    #[error("zip error: {0}")]
    Zip(#[from] zip::result::ZipError),

    /// 自定义错误消息。
    #[error("{0}")]
    Custom(String),
}

impl From<&str> for RuntimeError {
    fn from(s: &str) -> Self {
        RuntimeError::Custom(s.to_string())
    }
}

impl From<String> for RuntimeError {
    fn from(s: String) -> Self {
        RuntimeError::Custom(s)
    }
}
