"""HTML fixtures shared by the browser-script tests."""

from __future__ import annotations

import json
from typing import Any

from pygitweb.static_tests.js_runtime import JsPage

MANIFEST: dict[str, list[dict[str, str]]] = {
	"commits": [
		{
			"insert": "abcd",
			"name": "subject",
			"url": "/c/abcd",
			"tags": "abcd subject",
			"snippet": "subject",
			"created": "2020-01-01",
		},
		{"insert": "eeee", "name": "other", "url": "/c/eeee", "tags": "eeee"},
	],
	"refs": [
		{"insert": "main", "name": "main", "url": "/r/main", "tags": "main branch"},
		{"insert": "task-1234", "name": "task", "url": "/r/task", "tags": "task"},
	],
}


def card_html(
	*,
	ref: str = "",
	status: str = "TODO",
	points: str = "",
	title: str = "",
	description: str = "",
) -> str:
	return (
		f'<div class="card board-card" draggable="true" data-task-ref="{ref}" '
		f'data-task-status="{status}" data-task-points="{points}">'
		'<span class="board-card-icon" data-icon="cloud"></span>'
		'<div class="board-card-title-line">'
		'<span class="board-card-task-id"></span>'
		f'<span class="board-card-title">{title}</span></div>'
		'<div class="board-card-description-preview"></div>'
		'<div class="board-card-meta">'
		'<span class="badge">LOW</span>'
		'<span class="board-card-points-badge d-none"></span>'
		'<span class="board-card-assignee-compact">None</span>'
		'<span class="ms-auto board-card-comments-count-meta">0 comments</span>'
		"</div>"
		'<div class="board-card-details d-none">'
		'<div class="board-card-task-ref"></div>'
		f'<div class="board-card-description-full">{description}</div>'
		'<div class="board-card-due-date">None</div>'
		'<div class="board-card-updated-at">None</div>'
		'<div class="board-card-status">TODO</div>'
		'<div class="board-card-priority">LOW</div>'
		'<div class="board-card-points">–</div>'
		'<div class="board-card-assignee">None</div>'
		'<div class="board-card-tags"></div>'
		'<select class="board-card-move-select"><option value="">Move to board…</option></select>'
		'<button type="button" class="board-card-delete-btn">Delete</button>'
		'<button type="button" class="board-card-archive-btn">Archive</button>'
		'<form class="board-card-comment-form"><textarea class="board-card-comment-input"></textarea></form>'
		'<div class="board-card-comment-signin-hint d-none"></div>'
		'<div class="board-card-comments-list"></div>'
		"</div></div>"
	)


def column(status: str, cards: str = "") -> str:
	return (
		f'<div class="board-column dropzone" data-status="{status}">'
		'<button type="button" class="board-column-add-card">'
		'<span class="board-column-task-count">0</span></button>'
		'<span class="board-column-points-total">0 pts</span>'
		f'<div class="board-column-cards">{cards}</div></div>'
	)


def board_shell(
	*,
	project: str = "demo",
	board: str = "Tasks",
	cards_todo: str = "",
	cards_progress: str = "",
	include_template: bool = True,
) -> str:
	template = f'<template id="board-card-template">{card_html()}</template>' if include_template else ""
	return (
		template
		+ f'<div class="board-columns" data-project="{project}" data-board="{board}">'
		+ column("TODO", cards_todo)
		+ column("IN_PROGRESS", cards_progress)
		+ "</div>"
		+ '<select id="board-board-select"></select>'
		+ '<button type="button" id="board-new-board-btn">+ Board</button>'
		+ '<button type="button" id="board-new-sprint-btn">+ Sprint</button>'
		+ '<form id="board-new-form" class="d-none"><input id="board-new-name">'
		+ '<span id="board-new-error" class="d-none"></span>'
		+ '<button type="submit">Create</button></form>'
		+ '<button type="button" id="board-new-cancel">Cancel</button>'
	)


def requested(js: JsPage, fragment: str) -> bool:
	return any(fragment in str(item["url"]) for item in js.requests())


def posted_json(js: JsPage, fragment: str) -> Any:
	for item in reversed(js.requests()):
		if fragment in str(item["url"]) and item.get("body"):
			return json.loads(str(item["body"]))
	return None