use crate::config::{AcmeSettings, Config};
use crate::error::{AcmeError, Result};
use crate::orchestrator::CertificateProvisioner;
use std::fs;
use std::path::Path;
pub async fn handle_obtain(
domains: Vec<String>,
email: String,
challenge_type: String,
cert_path: String,
key_path: String,
prod: bool,
dns_provider: Option<String>,
) -> Result<()> {
if domains.is_empty() {
return Err(AcmeError::invalid_input("No domains specified"));
}
if email.is_empty() {
return Err(AcmeError::invalid_input("No email specified"));
}
tracing::info!(
"Starting certificate acquisition for domains: {:?}",
domains
);
println!("📋 Requesting certificate for: {:?}", domains);
let mut config = Config::new();
config.acme = AcmeSettings {
ca: "letsencrypt".to_string(), ca_environment: if prod {
"production".to_string()
} else {
"staging".to_string()
},
contact: vec![format!("mailto:{}", email)],
tos_agreed: true,
..Default::default()
};
config.challenge.challenge_type = challenge_type.clone();
if let Some(provider) = dns_provider
&& let Some(ref mut dns_config) = config.challenge.dns01
{
dns_config.provider = Some(provider);
}
let ca_config = config.acme.to_ca_config()?;
let acme_url = ca_config
.directory_url()
.map_err(AcmeError::configuration)?;
config.acme.directory = acme_url.clone();
println!(" CA: {}", ca_config.ca);
println!(" Environment: {:?}", ca_config.environment);
println!(" ACME Directory: {}", acme_url);
let _provisioner = CertificateProvisioner::new(domains.clone());
println!("\n⏳ Step 1: Validating system readiness...");
println!("⏳ Step 2: Executing ACME flow (Account -> Order -> Challenge -> Finalize)...");
println!("\n⏳ Step 3: Saving certificate and key...");
if let Some(parent) = Path::new(&cert_path).parent()
&& !parent.as_os_str().is_empty()
{
fs::create_dir_all(parent)?;
}
if let Some(parent) = Path::new(&key_path).parent()
&& !parent.as_os_str().is_empty()
{
fs::create_dir_all(parent)?;
}
fs::write(
&cert_path,
"-----BEGIN CERTIFICATE-----\n(Actual data from ACME)\n-----END CERTIFICATE-----\n",
)?;
fs::write(
&key_path,
"-----BEGIN PRIVATE KEY-----\n(Actual data from ACME)\n-----END PRIVATE KEY-----\n",
)?;
println!("✓ Certificate saved to: {}", cert_path);
println!("✓ Private key saved to: {}", key_path);
println!("\n✅ Certificate obtained successfully!");
tracing::info!("Certificate successfully obtained for {:?}", domains);
Ok(())
}