//! Управление подписками (webhook).

use crate::client::MaxClient;
use crate::error::Result;
use crate::types::Subscription;

impl MaxClient {
    /// Возвращает список всех активных подписок бота.
    pub async fn get_subscriptions(&self) -> Result<Vec<Subscription>> {
        self.request_with_rate_limit(reqwest::Method::GET, "/subscriptions", &[], None)
            .await
    }

    /// Создаёт новую подписку (устанавливает webhook).
    ///
    /// После вызова MAX начнёт отправлять HTTP POST-запросы с обновлениями
    /// на указанный URL.
    ///
    /// # Аргументы
    ///
    /// * `url` - HTTPS URL, на который будут приходить обновления.
    /// * `update_types` - список типов обновлений, например `["message_created", "message_callback"]`.
    /// * `secret` - необязательный секретный ключ. Если задан, MAX будет добавлять
    ///   заголовок `X-Max-Bot-Api-Secret` с этим значением в каждый запрос.
    ///   Используйте для проверки подлинности входящих обновлений.
    pub async fn create_subscription(
        &self,
        url: &str,
        update_types: Vec<String>,
        secret: Option<&str>,
    ) -> Result<()> {
        let mut body = serde_json::json!({
            "url": url,
            "update_types": update_types,
        });
        if let Some(s) = secret {
            body["secret"] = s.into();
        }
        let resp: serde_json::Value = self
            .request_with_rate_limit(reqwest::Method::POST, "/subscriptions", &[], Some(body))
            .await?;
        if !resp["success"].as_bool().unwrap_or(false) {
            let msg = resp["message"].as_str().unwrap_or("unknown error");
            return Err(crate::error::Error::Api {
                code: 400,
                message: msg.to_string(),
            });
        }
        Ok(())
    }

    /// Удаляет подписку (отключает webhook).
    ///
    /// # Аргументы
    ///
    /// * `url` - URL подписки, которую необходимо удалить.
    pub async fn delete_subscription(&self, url: &str) -> Result<()> {
        let resp: serde_json::Value = self
            .request_with_rate_limit(
                reqwest::Method::DELETE,
                "/subscriptions",
                &[("url", url.to_string())],
                None,
            )
            .await?;
        if !resp["success"].as_bool().unwrap_or(false) {
            let msg = resp["message"].as_str().unwrap_or("unknown error");
            return Err(crate::error::Error::Api {
                code: 400,
                message: msg.to_string(),
            });
        }
        Ok(())
    }
}
