use crate::api::AcknowledgeRequest;
use crate::client::Client;
use crate::Error;
use std::collections::HashMap;

#[derive(Clone)]
pub struct Message {
    pub(crate) client: Client,
    pub(crate) data: Vec<u8>,
    pub(crate) attributes: HashMap<String, String>,
    pub(crate) ack_id: String,
    pub(crate) message_id: String,
    pub(crate) publish_time: chrono::NaiveDateTime,
    pub(crate) subscription_name: String,
}

impl Message {
    pub async fn ack(&mut self) -> Result<(), Error> {
        let req = AcknowledgeRequest {
            subscription: self.subscription_name.clone(),
            ack_ids: vec![self.ack_id.clone()],
        };
        let req = self.client.insert_authz_token(req).await?;
        self.client.subscriber.acknowledge(req).await?;
        Ok(())
    }
    pub fn data(&self) -> &[u8] {
        self.data.as_slice()
    }
    pub fn id(&self) -> &str {
        self.message_id.as_str()
    }
    pub fn attributes(&self) -> &HashMap<String, String> {
        &self.attributes
    }
}