//! Integration tests for Nickel configuration loading

use std::path::PathBuf;

use kogral_core::config::nickel;
use kogral_core::config::schema::{EmbeddingProvider, KbConfig, StorageType};

fn workspace_dir() -> PathBuf {
    let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
    path.pop(); // kb-core
    path.pop(); // crates
    path
}

#[test]
#[ignore] // Requires Nickel CLI to be installed
fn test_load_minimal_config() {
    if !nickel::is_nickel_available() {
        eprintln!("Skipping: Nickel CLI not available");
        return;
    }

    let config_path = workspace_dir().join("config/minimal.ncl");
    let config: KbConfig = nickel::load_nickel_config(&config_path).expect("Failed to load config");

    assert_eq!(config.graph.name, "minimal-kb");
    assert_eq!(config.graph.version, "1.0.0");
    assert_eq!(config.storage.primary, StorageType::Filesystem);
    assert_eq!(config.embeddings.provider, EmbeddingProvider::Fastembed);
}

#[test]
#[ignore] // Requires Nickel CLI to be installed
fn test_load_defaults_config() {
    if !nickel::is_nickel_available() {
        eprintln!("Skipping: Nickel CLI not available");
        return;
    }

    let config_path = workspace_dir().join("config/defaults.ncl");
    let config: KbConfig = nickel::load_nickel_config(&config_path).expect("Failed to load config");

    assert_eq!(config.graph.name, "my-project-kb");
    assert_eq!(config.graph.description, "Project KOGRAL");
    assert_eq!(config.embeddings.dimensions, 384);
    assert_eq!(config.query.max_results, 10);
    assert_eq!(config.query.similarity_threshold, 0.4);
    assert!(config.mcp.tools.search);
    assert!(config.sync.auto_index);
    assert_eq!(config.sync.debounce_ms, 500);
}

#[test]
#[ignore] // Requires Nickel CLI to be installed
fn test_load_production_config() {
    if !nickel::is_nickel_available() {
        eprintln!("Skipping: Nickel CLI not available");
        return;
    }

    let config_path = workspace_dir().join("config/production.ncl");
    let config: KbConfig = nickel::load_nickel_config(&config_path).expect("Failed to load config");

    assert_eq!(config.graph.name, "tools-ecosystem-kb");
    assert!(config.storage.secondary.enabled);
    assert_eq!(config.embeddings.provider, EmbeddingProvider::Openai);
    assert_eq!(config.embeddings.model, "text-embedding-3-small");
    assert_eq!(config.query.similarity_threshold, 0.5);
    assert!(!config.query.cross_graph);
}

#[test]
fn test_nickel_availability() {
    let available = nickel::is_nickel_available();
    println!("Nickel CLI available: {}", available);

    if available {
        let version = nickel::nickel_version().expect("Failed to get version");
        println!("Nickel version: {}", version);
    }
}
