use std::time::{SystemTime, UNIX_EPOCH};
use chrono::{DateTime, Utc};
use lightning_invoice::Bolt11Invoice;
use crate::error::Error;
#[derive(Debug, Clone)]
pub struct ParsedInvoice {
pub payment_hash: String,
pub amount_msat: u64,
pub expiry_at: Option<DateTime<Utc>>,
}
pub fn parse_invoice(input: &str) -> Result<ParsedInvoice, Error> {
let inv: Bolt11Invoice = input.parse().map_err(|e| Error::Bolt11(format!("{e:?}")))?;
let payment_hash = hex::encode(inv.payment_hash());
let amount_msat = inv.amount_milli_satoshis().unwrap_or(0);
let expiry_at = inv.expires_at().and_then(|d| {
let secs = d.as_secs();
SystemTime::UNIX_EPOCH
.checked_add(std::time::Duration::from_secs(secs))
.and_then(|st| {
let dur = st.duration_since(UNIX_EPOCH).unwrap_or_default();
DateTime::<Utc>::from_timestamp(dur.as_secs() as i64, 0)
})
});
Ok(ParsedInvoice {
payment_hash,
amount_msat,
expiry_at,
})
}