use thiserror::Error;

#[derive(Debug, Error)]
pub enum ConfigError {
    #[error("failed to load configuration: {0}")]
    Load(Box<figment::Error>),

    #[error("failed to serialize configuration: {0}")]
    Serialize(#[from] toml::ser::Error),

    #[error("failed to write configuration to {path}: {source}")]
    Write {
        path: std::path::PathBuf,
        source: std::io::Error,
    },

    #[error("failed to read {path}: {source}")]
    Read {
        path: std::path::PathBuf,
        source: std::io::Error,
    },

    #[error("failed to parse MCP configuration: {0}")]
    McpParse(String),

    #[error("failed to create configuration directory {path}: {source}")]
    CreateDir {
        path: std::path::PathBuf,
        source: std::io::Error,
    },

    #[error("invalid language {language}: expected zh-CN or en-US")]
    InvalidLanguage { language: String },

    #[error(
        "invalid agent.compaction_threshold {threshold}: expected a value between 0.0 and 1.0"
    )]
    InvalidCompactionThreshold { threshold: f32 },

    #[error("missing API key: set {env} or configure providers.*.api_key")]
    MissingApiKey { env: String },

    #[error("plugin hook failed: `{command}` (exit {code:?})")]
    HookFailed { command: String, code: Option<i32> },
}
