use crate::logs::LogBuffer;
use crate::models::Service;
use anyhow::Result;
use chrono::Local;
use std::path::PathBuf;
use tokio::fs::{create_dir_all, File};
use tokio::io::AsyncWriteExt;
use tracing::info;
pub async fn export_logs(service: &Service, buffer: &LogBuffer) -> Result<PathBuf> {
let export_dir = dirs::config_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join("darpan")
.join("logs");
create_dir_all(&export_dir).await?;
let timestamp = Local::now().format("%Y%m%d_%H%M%S");
let safe_name = service.name.replace(" ", "-").replace("/", "-");
let filename = format!("darpan-{}-{}.log", safe_name, timestamp);
let filepath = export_dir.join(&filename);
let mut file = File::create(&filepath).await?;
let header = format!(
"# Darpan Log Export\n\
# Service: {}\n\
# Exported: {}\n\
# Total Lines: {}\n\
#\n\n",
service.name,
Local::now().format("%Y-%m-%d %H:%M:%S"),
buffer.len()
);
file.write_all(header.as_bytes()).await?;
for entry in buffer.entries() {
let line = format!(
"[{} {}] {}\n",
entry.timestamp.format("%Y-%m-%d %H:%M:%S%.3f"),
entry.level.as_str(),
entry.message
);
file.write_all(line.as_bytes()).await?;
}
file.sync_all().await?;
info!("Exported {} log lines to: {:?}", buffer.len(), filepath);
Ok(filepath)
}