Documentation
use ps1g::{Config, Result, resolve};
use clap::Parser;
use iocore::Path;

#[derive(Parser, Debug)]
#[command(
    author,
    version,
    about,
    long_about = "ps1 command-line utility"
)]
pub struct Cli {
    #[arg(
        short,
        long,
        env = "PS1_CONFIG_PATH"
    )]
    config_path: Option<Path>,

    #[arg(long)]
    env: bool,

    #[arg(short, long)]
    var: bool,

    #[arg(
        short,
        long,
        conflicts_with_all = ["env", "var"]
    )]
    resolve: Option<String>,
}
impl Cli {
    pub fn config_path(&self) -> Path {
        match &self.config_path {
            Some(path) => path.clone(),
            None => Path::raw("~/.config/ps1.toml").try_canonicalize(),
        }
    }

    pub fn config(&self) -> Config {
        Config::load(&self.config_path()).unwrap_or_default()
    }
}

fn main() -> Result<()> {
    let opts = Cli::parse();
    let config = opts.config();
    let rendered = config.render_ps1()?;
    if opts.env || opts.var {
        println!(
            "{}",
            [
                format!("export PS1='{}';", &rendered),
                format!("unset PROMPT_COMMAND;")
            ]
            .join("\n")
        )
    } else if let Some(resolve) = opts.resolve.clone() {
        print!(
            "{}",
            match resolve.as_str() {
                "cwd:name" => {
                    resolve::cwd_name()
                },
                "git:branch" => {
                    resolve::git_branch()
                },
                val => {
                    val.to_string()
                },
            }
        );
    }
    Ok(())
}