use anyhow::Result;
use log::info;
use std::{
env::{self, set_current_dir},
path::PathBuf,
str::FromStr,
};
use crate::{config::Config, processor::Processor, template::Template, writer::Writer};
pub(crate) fn spawn(config: &Config, uri: String) -> Result<()> {
let uri = config.resolve_alias(uri);
info!("Using template {uri:?}");
let template = Template::new(uri).init()?;
let plugins = template.get_plugins()?;
let template_info = template.get_info()?;
let template_info = plugins.info(template_info.map(String::as_str))?;
if let Some(template_info) = template_info {
println!("{template_info}");
}
cliclack::intro(console::style(" SPWN ").on_cyan().black().bold())?;
let cwd = env::current_dir()?;
let cwd = plugins.cwd(&cwd.to_string_lossy())?;
let cwd = PathBuf::from_str(&cwd)?;
set_current_dir(&cwd)?;
info!("The current directory is {cwd:?}");
let processor = Processor::from_template(&template);
let process_result = processor.process(&cwd)?;
process_result.log()?;
let writer = Writer::from_process_result(&process_result);
writer.write()?;
cliclack::outro("Done!")?;
Ok(())
}