use anyhow::{Context, Result};
use std::fs;
use std::path::Path;

/// Open editor for user to input/edit content
pub fn edit_content(initial_content: &str) -> Result<String> {
    edit::edit(initial_content).context("Failed to open editor")
}

/// Edit file in user's default editor
pub fn edit_file(path: &Path) -> Result<String> {
    let content = fs::read_to_string(path)
        .unwrap_or_default();
    
    let edited = edit::edit(&content)
        .context("Failed to open editor")?;
    
    fs::write(path, &edited)
        .with_context(|| format!("Failed to write file: {:?}", path))?;
    
    Ok(edited)
}

/// Create temporary file and open in editor
pub fn edit_temp(initial_content: &str, extension: &str) -> Result<String> {
    let temp_file = tempfile::Builder::new()
        .suffix(&format!(".{}", extension))
        .tempfile()
        .context("Failed to create temp file")?;
    
    let path = temp_file.path();
    fs::write(path, initial_content)
        .context("Failed to write temp file")?;
    
    edit_file(path)
}

/// Get editor command from environment
pub fn get_editor() -> String {
    std::env::var("EDITOR")
        .or_else(|_| std::env::var("VISUAL"))
        .unwrap_or_else(|_| {
            if cfg!(target_os = "windows") {
                "notepad".to_string()
            } else {
                "vi".to_string()
            }
        })
}

/// Check if editor is available
pub fn check_editor() -> Result<()> {
    let editor = get_editor();
    which::which(&editor)
        .with_context(|| format!("Editor '{}' not found in PATH", editor))?;
    Ok(())
}
