use std::path::{Path, PathBuf};
use uuid::Uuid;
use crate::services::{FileService, ServiceContext};
pub async fn resolve_export_dir(
session_id: Uuid,
service_context: Option<&ServiceContext>,
) -> PathBuf {
if let Some(sc) = service_context
&& let Some(project_files) = FileService::new(sc.clone())
.project_files_dir(session_id)
.await
{
return project_files.join("scrapes");
}
crate::config::opencrabs_home().join("scrapes")
}
pub fn filename_for_url(url: &str) -> String {
let parsed = url::Url::parse(url).ok();
let host = parsed.as_ref().and_then(|u| u.host_str()).unwrap_or("page");
let path = parsed.as_ref().map(|u| u.path()).unwrap_or("");
let raw = format!("{host}{path}");
let mut slug = String::with_capacity(raw.len());
let mut prev_dash = false;
for ch in raw.chars() {
if ch.is_ascii_alphanumeric() || ch == '.' {
slug.push(ch.to_ascii_lowercase());
prev_dash = false;
} else if !prev_dash {
slug.push('-');
prev_dash = true;
}
}
let stem = slug.trim_matches(|c| c == '-' || c == '.');
let stem = if stem.is_empty() { "index" } else { stem };
format!("{stem}.md")
}
pub async fn write_markdown(dir: &Path, url: &str, markdown: &str) -> std::io::Result<PathBuf> {
tokio::fs::create_dir_all(dir).await?;
let path = dir.join(filename_for_url(url));
tokio::fs::write(&path, markdown).await?;
Ok(path)
}