//! Configuración del lab: paths del rootfs base, del compilador inyectado y del work dir.
//!
//! La idea es que `BuildConfig` se construye una vez (en la CLI desde env vars + defaults) y
//! se pasa explícitamente a `build`, de modo que los tests pueden montar configuraciones
//! aisladas sin tocar variables de entorno globales.

use std::path::{Path, PathBuf};

#[derive(Debug, Clone)]
pub struct BuildConfig {
    /// Rootfs base read-only del sandbox (Alpine para la fase actual del roadmap).
    pub rootfs: PathBuf,
    /// Directorio con el binario `zig` y su `lib/`.
    pub zig_dir: PathBuf,
    /// Raíz para directorios de trabajo (repos clonados, copias del source para
    /// patch+compile, y `out` por build). Debe estar en el mismo filesystem que el store
    /// para que el `seal` final sea un rename atómico.
    pub work_root: PathBuf,
    /// Directorio host persistente que se bindea como `/cache` en el sandbox; alberga la
    /// caché global de `zig` (objetos de musl, libc, etc.) entre builds. `None` desactiva.
    pub cache_root: Option<PathBuf>,
}

impl BuildConfig {
    /// Defaults relativos al store: `.dev-fs` y `work/` como hermanos del store.
    /// `store_root = /…/store` → rootfs = `/…/.dev-fs/alpine`, zig = `/…/.dev-fs/tools/zig`,
    /// work = `/…/work`, cache = `/…/.dev-fs/cache`.
    pub fn defaults_for_store(store_root: &Path) -> Self {
        let project_root = store_root
            .parent()
            .unwrap_or_else(|| Path::new("."))
            .to_path_buf();
        Self {
            rootfs: project_root.join(".dev-fs/alpine"),
            zig_dir: project_root.join(".dev-fs/tools/zig"),
            work_root: project_root.join("work"),
            cache_root: Some(project_root.join(".dev-fs/cache")),
        }
    }

    /// Lee overrides desde entorno (`HAMMER_ROOTFS`, `HAMMER_ZIG`, `HAMMER_WORK`,
    /// `HAMMER_CACHE`). `HAMMER_CACHE=""` (vacío) desactiva la caché.
    pub fn from_env_or_defaults(store_root: &Path) -> Self {
        let mut cfg = Self::defaults_for_store(store_root);
        if let Ok(v) = std::env::var("HAMMER_ROOTFS") {
            cfg.rootfs = PathBuf::from(v);
        }
        if let Ok(v) = std::env::var("HAMMER_ZIG") {
            cfg.zig_dir = PathBuf::from(v);
        }
        if let Ok(v) = std::env::var("HAMMER_WORK") {
            cfg.work_root = PathBuf::from(v);
        }
        if let Ok(v) = std::env::var("HAMMER_CACHE") {
            cfg.cache_root = if v.is_empty() { None } else { Some(PathBuf::from(v)) };
        }
        cfg
    }
}
