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'))")