from __future__ import annotations

import json

from pygitweb.static_tests.js_runtime import JsPage
from pygitweb.static_tests.pages import MANIFEST, board_shell


def test_set_markdown_renders_and_linkifies_after_the_manifest_loads(js: JsPage) -> None:
    js.route("board-ref-manifest", body=MANIFEST)
    js.set_html(board_shell() + '<div id="md"></div><textarea id="note"></textarea>')
    js.load("board-markdown.js")
    assert js.call("board-markdown.js", "getMarkdownFromElement", None) == ""
    js.run("__loaded['board-markdown.js'].setMarkdownElement(null, 'x')")
    js.run("__loaded['board-markdown.js'].linkifyMarkdownElement(null)")
    js.run("__loaded['board-markdown.js'].attachBoardRefAutocomplete(null)")
    source = json.dumps("see #abcd @missing")
    js.run(f"__loaded['board-markdown.js'].setMarkdownElement(document.getElementById('md'), {source})")
    assert js.count("#md .board-ref-link") == 0
    assert js.value("document.getElementById('md').dataset.boardMarkdown") == "see #abcd @missing"
    js.settle("__loaded['board-context.js'].refreshBoardRefManifest()")
    js.run(f"__loaded['board-markdown.js'].setMarkdownElement(document.getElementById('md'), {source})")
    assert js.count("#md .board-ref-commit") == 1
    assert js.count("#md .board-ref-unresolved") == 1
    assert js.count("#md strong") == 0
    js.run("__loaded['board-markdown.js'].setMarkdownElement(document.getElementById('md'), '**bold**')")
    assert js.count("#md strong") == 1
    assert "markdown-body" in js.classes("#md")
    js.run("__loaded['board-markdown.js'].attachBoardRefAutocomplete(document.getElementById('note'))")
    assert js.attr("#note", "data-board-ref-autocomplete") == "1"


def test_compact_preview_truncates_at_120_characters(js: JsPage) -> None:
    long = "word " * 40
    js.set_html(
        '<div class="board-columns" data-project="demo" data-board="Tasks"></div>'
        '<div class="board-card"><div class="board-card-description-preview"></div>'
        '<div class="board-card-description-full"></div></div>'
    )
    js.load("board-markdown.js")
    js.run(
        "__loaded['board-markdown.js'].syncCompactDescription(document.querySelector('.board-card'), "
        + json.dumps(long)
        + ")"
    )
    preview = js.text(".board-card-description-preview")
    assert preview.endswith("…")
    assert len(preview) == 121
    js.run("__loaded['board-markdown.js'].syncCompactDescription(document.querySelector('.board-card'), '')")
    assert js.text(".board-card-description-preview") == ""


def test_preview_reads_plain_text_when_markdown_was_not_stored(js: JsPage) -> None:
    js.set_html(
        '<div class="board-card"><div class="board-card-description-preview"></div>'
        '<div class="board-card-description-full">plain</div></div>'
    )
    js.load("board-markdown.js")
    text = js.value(
        "__loaded['board-markdown.js'].getMarkdownFromElement(document.querySelector('.board-card-description-full'))"
    )
    assert text == "plain"
    js.run("__loaded['board-markdown.js'].syncCompactDescription(document.querySelector('.board-card'))")
    assert js.text(".board-card-description-preview") == "plain"


def test_linkify_stops_when_the_board_has_no_project(js: JsPage) -> None:
    js.route("board-ref-manifest", body=MANIFEST)
    js.set_html(board_shell() + '<div id="md">see #abcd</div>')
    js.load("board-markdown.js")
    js.settle("__loaded['board-context.js'].refreshBoardRefManifest()")
    js.set_html('<div class="board-columns"></div><div id="md">see #abcd</div>')
    js.set_location("http://127.0.0.1/")
    js.run("__loaded['board-markdown.js'].linkifyMarkdownElement(document.getElementById('md'))")
    assert js.count(".board-ref-link") == 0
    js.run("__loaded['board-markdown.js'].attachBoardRefAutocomplete(document.createElement('textarea'))")