use cargo_deny::{
    func_name,
    sources::{self, cfg::Config},
    test_utils::{self as tu, KrateGather},
};

#[inline]
pub fn src_check(
    name: &str,
    kg: KrateGather<'_>,
    cfg: impl Into<tu::Config<Config>>,
) -> Vec<serde_json::Value> {
    let krates = kg.gather();
    let cfg = cfg.into();

    tu::gather_diagnostics::<Config, _, _>(&krates, name, cfg, |ctx, _cs, tx, _files| {
        sources::check(ctx, tx);
    })
}

#[test]
fn fails_unknown_git() {
    let diags = src_check(
        func_name!(),
        KrateGather::new("sources"),
        "unknown-git = 'deny'",
    );

    insta::assert_json_snapshot!(diags);
}

#[test]
fn allows_git() {
    let cfg = "unknown-git = 'deny'
    allow-git = [
        'https://gitlab.com/amethyst-engine/amethyst/',
        'https://github.com/EmbarkStudios/krates',
        'https://bitbucket.org/marshallpierce/line-wrap-rs',
    ]";

    let diags = src_check(func_name!(), KrateGather::new("sources"), cfg);

    insta::assert_json_snapshot!(diags);
}

#[test]
fn allows_github_org() {
    // We shouldn't have any errors for the embark urls now
    let cfg = "unknown-git = 'deny'
    [allow-org]
    github = ['EmbarkStudios']
    ";

    let diags = src_check(func_name!(), KrateGather::new("sources"), cfg);

    insta::assert_json_snapshot!(diags);
}

#[test]
fn allows_gitlab_org() {
    let cfg = "unknown-git = 'deny'
    [allow-org]
    gitlab = ['amethyst-engine']
    ";

    let diags = src_check(func_name!(), KrateGather::new("sources"), cfg);

    insta::assert_json_snapshot!(diags);
}

#[test]
fn allows_bitbucket_org() {
    let cfg = "unknown-git = 'deny'
    [allow-org]
    bitbucket = ['marshallpierce']
    ";

    let diags = src_check(func_name!(), KrateGather::new("sources"), cfg);

    insta::assert_json_snapshot!(diags);
}

#[test]
fn allows_registry_index_git() {
    let cfg = "unknown-registry = 'deny'
    allow-registry = [
        'https://dl.cloudsmith.io/public/embark/deny/cargo/index.git'
    ]
    ";

    let diags = src_check(func_name!(), KrateGather::new("non-crates-io"), cfg);

    insta::assert_json_snapshot!(diags);
}

#[test]
fn allows_registry_index_sparse() {
    let cfg = "unknown-registry = 'deny'
    allow-registry = [
        'https://cargo.cloudsmith.io/embark/deny/'
    ]
    ";

    let diags = src_check(func_name!(), KrateGather::new("non-crates-io"), cfg);

    insta::assert_json_snapshot!(diags);
}

#[test]
fn allows_registry_index_sparse_or_git() {
    let cfg = "unknown-registry = 'deny'
allow-registry = [
    'https://dl.cloudsmith.io/public/embark/deny/cargo/index.git',
    'https://cargo.cloudsmith.io/embark/deny/',
]
";

    let diags = src_check(func_name!(), KrateGather::new("non-crates-io"), cfg);

    insta::assert_json_snapshot!(diags);
}

#[test]
fn validates_git_source_specs() {
    use sources::cfg::GitSpec;

    assert!(GitSpec::Rev > GitSpec::Tag);
    assert!(GitSpec::Tag > GitSpec::Branch);
    assert!(GitSpec::Branch > GitSpec::Any);

    let levels: &[&[(_, _)]] = &[
        [(GitSpec::Rev, "https://gitlab.com/amethyst-engine/amethyst")].as_ref(),
        [(GitSpec::Tag, "https://github.com/EmbarkStudios/spdx")].as_ref(),
        [
            (GitSpec::Branch, "https://github.com/EmbarkStudios/krates"),
            (GitSpec::Branch, "https://github.com/dtolnay/anyhow"),
        ]
        .as_ref(),
        [(
            GitSpec::Any,
            "https://bitbucket.org/marshallpierce/line-wrap-rs",
        )]
        .as_ref(),
    ];

    for (i, (spec, _url)) in levels
        .iter()
        .enumerate()
        .flat_map(|(i, lvl)| lvl.iter().map(move |l| (i, l)))
    {
        let cfg = format!(
            "unknown-git = 'allow'
        required-git-spec = '{spec}'"
        );

        let mut diags = src_check(func_name!(), KrateGather::new("sources"), cfg);

        diags.retain(|d| {
            d.pointer("/fields/message")
                .unwrap()
                .as_str()
                .unwrap()
                .starts_with("'git' source is underspecified, expected")
        });

        for (j, (_, url)) in levels
            .iter()
            .enumerate()
            .flat_map(|(i, lvl)| lvl.iter().map(move |l| (i, l)))
        {
            let severities: Vec<_> = diags
                .iter()
                .filter_map(|d| {
                    d.pointer("/fields/labels/0/span")
                        .and_then(|u| u.as_str())
                        .and_then(|u| {
                            if u.contains(url) {
                                d.pointer("/fields/severity").and_then(|s| s.as_str())
                            } else {
                                None
                            }
                        })
                })
                .collect();

            if j <= i {
                assert!(severities.is_empty());
            } else {
                assert!(!severities.is_empty());
                assert!(severities.into_iter().all(|s| s == "error"));
            }
        }
    }
}
