//! Regression tests for Roc hybrid ranking that surfaces app manifests and platform entrypoints over fixture noise.

use super::*;

#[test]
fn hybrid_ranking_roc_entrypoint_queries_prefer_platform_main_over_host_crates_noise()
-> FriggResult<()> {
    let root = temp_workspace_root("hybrid-roc-platform-entrypoints");
    prepare_workspace(
        &root,
        &[
            (
                "platform/main.roc",
                "# entry point main app package platform runtime\nplatform \"cli\"\npackages {}\nprovides [main_for_host!]\n",
            ),
            ("platform/Arg.roc", "# platform arg runtime package\n"),
            ("platform/Cmd.roc", "# platform cmd runtime package\n"),
            ("platform/Host.roc", "# platform host runtime package\n"),
            (
                "examples/command.roc",
                "# example command package\napp [main!] { pf: platform \"../platform/main.roc\" }\n",
            ),
            (
                "crates/roc_host_bin/src/main.rs",
                "fn main() { let _ = \"entry point main app package platform runtime\"; }\n",
            ),
            (
                "crates/roc_host/src/lib.rs",
                "pub fn host_runtime() { let _ = \"main app package runtime\"; }\n",
            ),
            (
                "ci/rust_http_server/src/main.rs",
                "fn main() { let _ = \"entry point main app package platform runtime\"; }\n",
            ),
            (
                ".github/workflows/deploy-docs.yml",
                "name: deploy docs\njobs:\n  deploy:\n    steps:\n      - run: cargo doc\n",
            ),
            (
                ".github/workflows/test_latest_release.yml",
                "name: test latest release\njobs:\n  test:\n    steps:\n      - run: cargo test\n",
            ),
        ],
    )?;

    let searcher = TextSearcher::new(FriggConfig::from_workspace_roots(vec![root.clone()])?);
    let output = searcher.search_hybrid_with_filters_using_executor(
        SearchHybridQuery {
            query: "entry point main app package platform runtime".to_owned(),
            limit: 10,
            weights: HybridChannelWeights::default(),
            semantic: Some(false),
        },
        SearchFilters::default(),
        &SemanticRuntimeCredentials::default(),
        &PanicSemanticQueryEmbeddingExecutor,
    )?;

    let ranked_paths = output
        .matches
        .iter()
        .map(|entry| entry.document.path.as_str())
        .collect::<Vec<_>>();
    let platform_main_rank = ranked_paths
        .iter()
        .position(|path| *path == "platform/main.roc")
        .expect("platform/main.roc should be ranked for Roc entrypoint queries");
    let host_lib_rank = ranked_paths
        .iter()
        .position(|path| *path == "crates/roc_host/src/lib.rs")
        .expect("host runtime lib.rs should be ranked as competing noise");

    assert!(
        platform_main_rank < 6,
        "platform/main.roc should stay visible near the top for Roc platform queries: {ranked_paths:?}"
    );
    assert!(
        platform_main_rank < host_lib_rank,
        "platform/main.roc should outrank generic host runtime library noise for Roc platform queries: {ranked_paths:?}"
    );

    cleanup_workspace(&root);
    Ok(())
}

#[test]
fn hybrid_ranking_roc_mixed_entrypoint_example_queries_recover_example_witnesses_under_runtime_noise()
-> FriggResult<()> {
    let root = temp_workspace_root("hybrid-roc-entrypoints-with-example-hints");
    prepare_workspace(
        &root,
        &[
            (
                "platform/main.roc",
                "# entry point main app package platform runtime\nplatform \"cli\"\npackages {}\nprovides [main_for_host!]\n",
            ),
            ("platform/Arg.roc", "# platform arg runtime package\n"),
            ("platform/Cmd.roc", "# platform cmd runtime package\n"),
            ("platform/Host.roc", "# platform host runtime package\n"),
            ("platform/Stdin.roc", "# stdin bytes runtime package\n"),
            (
                "examples/command.roc",
                "# example command line package\napp [main!] { pf: platform \"../platform/main.roc\" }\n",
            ),
            (
                "examples/command-line-args.roc",
                "# command line args bytes stdin example\napp [main!] { pf: platform \"../platform/main.roc\" }\n",
            ),
            (
                "examples/bytes-stdin-stdout.roc",
                "# bytes stdin stdout example\napp [main!] { pf: platform \"../platform/main.roc\" }\n",
            ),
            ("tests/cmd-test.roc", "# tests command bytes stdin\n"),
            (
                "crates/roc_host_bin/src/main.rs",
                "fn main() { let _ = \"entry point main app package platform runtime\"; }\n",
            ),
            (
                "crates/roc_host/src/lib.rs",
                "pub fn host_runtime() { let _ = \"main app package runtime\"; }\n",
            ),
            (
                "crates/roc_command/src/lib.rs",
                "pub fn command_runtime() { let _ = \"command runtime\"; }\n",
            ),
            (
                "crates/roc_env/src/lib.rs",
                "pub fn env_runtime() { let _ = \"env runtime\"; }\n",
            ),
            (
                "ci/rust_http_server/src/main.rs",
                "fn main() { let _ = \"entry point main app package platform runtime\"; }\n",
            ),
            ("rust-toolchain.toml", "[toolchain]\nchannel = \"stable\"\n"),
        ],
    )?;

    let searcher = TextSearcher::new(FriggConfig::from_workspace_roots(vec![root.clone()])?);
    let output = searcher.search_hybrid_with_filters_using_executor(
            SearchHybridQuery {
                query:
                    "entry point main app package platform runtime tests bytes stdin command line examples benches benchmark"
                        .to_owned(),
                limit: 14,
                weights: HybridChannelWeights::default(),
                semantic: Some(false),
            },
            SearchFilters::default(),
            &SemanticRuntimeCredentials::default(),
            &PanicSemanticQueryEmbeddingExecutor,
        )?;

    let ranked_paths = output
        .matches
        .iter()
        .map(|entry| entry.document.path.as_str())
        .collect::<Vec<_>>();

    assert!(
        ranked_paths.iter().take(14).any(|path| {
            matches!(
                *path,
                "platform/main.roc"
                    | "crates/roc_host_bin/src/main.rs"
                    | "ci/rust_http_server/src/main.rs"
            )
        }),
        "Roc mixed entrypoint/example queries should keep at least one entrypoint witness visible: {ranked_paths:?}"
    );
    assert!(
        ranked_paths
            .iter()
            .take(14)
            .any(|path| path.starts_with("examples/")),
        "Roc mixed entrypoint/example queries should recover an example witness under runtime/test noise: {ranked_paths:?}"
    );

    cleanup_workspace(&root);
    Ok(())
}

#[test]
fn hybrid_ranking_roc_saved_wave_queries_prefer_specific_example_witnesses_over_temp_dir_noise()
-> FriggResult<()> {
    let root = temp_workspace_root("hybrid-roc-saved-wave-specific-example-witnesses");
    prepare_workspace(
        &root,
        &[
            (
                "platform/main.roc",
                "# entry point main app package platform runtime\nplatform \"web\"\npackages {}\nprovides [main_for_host!]\n",
            ),
            ("platform/Cmd.roc", "# platform cmd runtime package\n"),
            ("platform/Dir.roc", "# platform dir runtime package\n"),
            ("platform/Env.roc", "# platform env runtime package\n"),
            ("platform/File.roc", "# platform file runtime package\n"),
            ("platform/Host.roc", "# platform host runtime package\n"),
            (
                "examples/command.roc",
                "app [Model, init!, respond!] { pf: platform \"../platform/main.roc\" }\nimport pf.Cmd\n# command example\n",
            ),
            (
                "examples/dir.roc",
                "app [Model, init!, respond!] { pf: platform \"../platform/main.roc\" }\nimport pf.Dir\nimport pf.Env\n# examples directory listing\n",
            ),
            (
                "examples/env.roc",
                "app [Model, init!, respond!] { pf: platform \"../platform/main.roc\" }\nimport pf.Env\n# environment example\n",
            ),
            (
                "examples/temp-dir.roc",
                "app [Model, init!, respond!] { pf: platform \"../platform/main.roc\" }\nimport pf.Env\n# temp dir example\n",
            ),
            ("tests/cmd-test.roc", "# tests command integration\n"),
            (
                "crates/roc_host_bin/src/main.rs",
                "fn main() { let _ = \"entry point main app package platform runtime\"; }\n",
            ),
            (
                "crates/roc_host/src/lib.rs",
                "pub fn host_runtime() { let _ = \"main app package runtime\"; }\n",
            ),
            (
                ".github/workflows/test_latest_release.yml",
                "name: test latest release\njobs:\n  test:\n    steps:\n      - run: cargo test\n",
            ),
            (
                ".github/workflows/deploy-docs.yml",
                "name: deploy docs\njobs:\n  deploy:\n    steps:\n      - run: cargo doc\n",
            ),
            ("rust-toolchain.toml", "[toolchain]\nchannel = \"stable\"\n"),
        ],
    )?;

    let searcher = TextSearcher::new(FriggConfig::from_workspace_roots(vec![root.clone()])?);
    let output = searcher.search_hybrid_with_filters_using_executor(
            SearchHybridQuery {
                query:
                    "tests fixtures integration entry point main app package platform runtime command dir examples benches benchmark"
                        .to_owned(),
                limit: 14,
                weights: HybridChannelWeights::default(),
                semantic: Some(false),
            },
            SearchFilters::default(),
            &SemanticRuntimeCredentials::default(),
            &PanicSemanticQueryEmbeddingExecutor,
        )?;

    let ranked_paths = output
        .matches
        .iter()
        .map(|entry| entry.document.path.as_str())
        .collect::<Vec<_>>();

    assert!(
        ranked_paths
            .iter()
            .take(14)
            .any(|path| { matches!(*path, "examples/command.roc" | "examples/dir.roc") }),
        "saved-wave Roc entrypoint/example queries should recover a specific example witness instead of only broad temp-dir noise: {ranked_paths:?}"
    );

    cleanup_workspace(&root);
    Ok(())
}
