use std::io::{self, IsTerminal};
use dialoguer::Password;
use tracing::debug;
use crate::cli::output;
use crate::core::vault::Vault;
use crate::error::Result;
pub fn execute(key: &str, vault: Option<String>) -> Result<()> {
let vault_name = crate::cli::resolve::resolve_vault(vault.as_deref())?;
debug!("Adding secret: {}", key);
let mut vault = Vault::open_vault(vault_name.as_deref())?;
let value = if !io::stdin().is_terminal() {
let mut input = String::new();
io::stdin().read_line(&mut input)?;
input.trim().to_string()
} else {
Password::new()
.with_prompt(format!("Value for {}", key))
.interact()?
};
if value.is_empty() {
output::error("value cannot be empty");
return Err(crate::error::ValidationError::EmptyValue(key.to_string()).into());
}
let force = if vault.list().iter().any(|s| s.key() == key) {
output::warn(&format!("{} already exists", key));
dialoguer::Confirm::new()
.with_prompt("Overwrite?")
.default(false)
.interact()?
} else {
false
};
vault.set(key, &value, force)?;
output::success(&format!("set {}", key));
Ok(())
}