//! `adom-mouser install` — deploy SKILL.md + BUILD-SKILL.md + bash completions.

use crate::{ok, warn};
use clap::CommandFactory;
use clap_complete::Shell;
use std::fs;
use std::io::Write;
use std::path::PathBuf;

const SKILL_MD: &str = include_str!("../SKILL.md");
const BUILD_SKILL_MD: &str = include_str!("../BUILD-SKILL.md");

pub fn install() -> Result<(), String> {
    let home = std::env::var("HOME").map_err(|_| "HOME env var not set".to_string())?;
    let skills_root = PathBuf::from(&home).join(".claude").join("skills");

    // 1a. User-facing skill
    let skill_dir = skills_root.join("adom-mouser");
    fs::create_dir_all(&skill_dir).map_err(|e| format!("create {}: {}", skill_dir.display(), e))?;
    let skill_path = skill_dir.join("SKILL.md");
    fs::write(&skill_path, SKILL_MD).map_err(|e| format!("write {}: {}", skill_path.display(), e))?;
    ok(format!("installed skill → {}", skill_path.display()));

    // 1b. Build skill (per-app release workflow)
    let build_skill_dir = skills_root.join("adom-mouser-build");
    fs::create_dir_all(&build_skill_dir)
        .map_err(|e| format!("create {}: {}", build_skill_dir.display(), e))?;
    let build_skill_path = build_skill_dir.join("SKILL.md");
    fs::write(&build_skill_path, BUILD_SKILL_MD)
        .map_err(|e| format!("write {}: {}", build_skill_path.display(), e))?;
    ok(format!("installed build skill → {}", build_skill_path.display()));

    // 2. Bash completions
    let comp_dir = PathBuf::from(&home)
        .join(".local")
        .join("share")
        .join("bash-completion")
        .join("completions");
    fs::create_dir_all(&comp_dir).map_err(|e| format!("create {}: {}", comp_dir.display(), e))?;
    let comp_path = comp_dir.join("adom-mouser");
    let mut cmd = crate::Cli::command();
    let mut buf: Vec<u8> = Vec::new();
    clap_complete::generate(Shell::Bash, &mut cmd, "adom-mouser", &mut buf);
    fs::write(&comp_path, &buf).map_err(|e| format!("write {}: {}", comp_path.display(), e))?;
    ok(format!("installed completions → {}", comp_path.display()));

    // 3. Append eval to .bashrc once
    let bashrc = PathBuf::from(&home).join(".bashrc");
    let current = fs::read_to_string(&bashrc).unwrap_or_default();
    if !current.contains("# adom-mouser completions") {
        match fs::OpenOptions::new().append(true).open(&bashrc) {
            Ok(mut f) => {
                let _ = f.write_all(b"\n# adom-mouser completions\neval \"$(adom-mouser completions bash 2>/dev/null)\"\n");
                ok("appended completion source line to ~/.bashrc (open a new shell for it to take effect)");
            }
            Err(e) => warn(format!(".bashrc: {}", e)),
        }
    }

    Ok(())
}