use thiserror::Error;

/// Тип ошибки, используемый во всей библиотеке.
///
/// Может возникать при сетевых запросах, ошибках API, работе с файлами,
/// превышении ограничений и т.д.
#[derive(Error, Debug)]
pub enum Error {
    /// Ошибка выполнения HTTP‑запроса.
    #[error("HTTP request failed: {0}")]
    Http(#[from] reqwest::Error),

    /// Ошибка, возвращённая API MAX.
    #[error("API error: {code} - {message}")]
    Api {
        /// HTTP‑код ответа.
        code: u16,
        /// Сообщение об ошибке от API.
        message: String,
    },

    /// Некорректные входные данные, переданные в функцию.
    #[error("Invalid input: {0}")]
    InvalidInput(String),

    /// Ошибка ввода‑вывода при работе с файлом.
    #[error("File error: {0}")]
    File(#[from] std::io::Error),

    /// Превышено ограничение частоты запросов (rate limit).
    #[error("Rate limit exceeded")]
    RateLimit,

    /// Вложение ещё не готово к отправке (например, файл не загружен).
    #[error("Attachment not ready")]
    AttachmentNotReady,

    /// Ошибка сериализации или десериализации JSON.
    #[error("JSON error: {0}")]
    Json(#[from] serde_json::Error),
}

/// Сокращение для `Result<T, Error>`.
pub type Result<T> = std::result::Result<T, Error>;
