use indoc::indoc;
use lsp_types::{request::HoverRequest, *};
use std::collections::HashMap;

mod fixture;
use crate::fixture::*;

#[test]
fn hover_preview_for_wiki_link_strips_frontmatter() {
    Fixture::with_documents(vec![
        (
            "1",
            indoc! {
                "text [[2]] text"
            },
        ),
        (
            "2",
            indoc! {"
                ---
                title: Note Two
                ---
                # Heading
                Line 2
            "},
        ),
    ])
    .assert_response::<lsp_types::request::HoverRequest>(
        uri(1).to_hover_params(0, 7),
        Some(Hover {
            contents: HoverContents::Markup(MarkupContent {
                kind: MarkupKind::Markdown,
                value: "# Heading\n\nLine 2\n".to_string(),
            }),
            range: None,
        }),
    );
}

#[test]
fn hover_preview_for_markdown_link() {
    let state = HashMap::from([
        (
            "1".to_string(),
            indoc! {
                "text [two](2) text"
            }
            .to_string(),
        ),
        (
            "2".to_string(),
            indoc! {"
                # Heading
                Line 2
            "}
            .to_string(),
        ),
    ]);

    Fixture::with_options_and_client(state, Default::default(), "")
        .assert_response::<HoverRequest>(
            uri(1).to_hover_params(0, 7),
            Some(Hover {
                contents: HoverContents::Markup(MarkupContent {
                    kind: MarkupKind::Markdown,
                    value: "# Heading\n\nLine 2\n".to_string(),
                }),
                range: None,
            }),
        );
}

#[test]
fn hover_outside_link_returns_none() {
    Fixture::with_documents(vec![("1", "no links here\n"), ("2", "# Heading\n")])
        .assert_response::<HoverRequest>(uri(1).to_hover_params(0, 0), None);
}

#[test]
fn hover_missing_target_returns_none() {
    Fixture::with_documents(vec![("1", "text [[missing]] text\n")])
        .assert_response::<HoverRequest>(uri(1).to_hover_params(0, 7), None);
}
